succubus의 소스코드를 확인하도록 하겠습니다.


이번 코드는 상당히 기네요.

우선 MO부분에 system(cmd)가 보이네요.

이번 목표는 MO를 실행해서 cmd/bin/sh를 전달하는 것으로 보입니다.

MODO부터 시작해서 GYE, GUL, YUT를 거쳐야만 실행이 되구요.

 

Main내부코드들을 보면 매개변수에 \x40가 있으면 안되구요. 처음 ret에 반드시 DO의 주소값이 들어가야 합니다.

 

그리고 ret 부터 100byte 만큼을 제외한 나머지는 0으로 초기화 해주고요.

 

그럼 우선 스택을 어떻게 구성해야하는지 한번 생각해 봐야겠습니다.

DO의 경우는 스택을 다음과 같이 구성하면 실행할 수 있습니다.

DO`s address

SFP

Buffer

main함수가 종료될때 ret를 통해 DO`s addresspop되어 eip로 들어가게 되고, espDO`s address를 가르키게 됩니다.

 

그리고 DO가 실행되고 프롤로그를 지나면 push ebp를 거쳐 스택의 내용은 다음과 같이 바뀌게 되겠죠.

SFP

SFP

Buffer

그리고 DO함수가 끝날때는 SFP위의 내용을 eip로 들어가게 됩니다.

즉 처음 스택을 구성할때 DO`s address위에 있는 값이 eip에 들어가게 되는 것이죠.


그렇다면 DO, GYE, GUL, YUT, MO를 차례대로 실행시키기 위해서는 스택을 다음과 같이 구성을 하면 됩니다.

MO’s address

YUT’s address

GUL’s address

GYE’s address

DO’s address

SFP

Buffer

각 함수가 시작되면 해당 함수의 주소가 있는 부분이 SFP가 되니 함수가 끝나게 되면 그 위의 값이 EIP에 들어가게 되는 것이죠.

이렇게 스택을 구성하게 되면 DO가 끝나고 차례로 GYE, GUL, YUT, MO가 실행 될것입니다.


그럼 우선 DO, GYE, GUL, YUT, MO의 주소값을 알아내어 입력해 주도록 하겠습니다.

DO의 주소는 0x080487ec

GYE의 주소는 0x080487bc

GUL의 주소는 0x0804878c

YUT의 주소는 0x0804875c

MO의 주소는 0x08048724입니다.

 

이를 이제 인자로 넘겨줘서 테스트 해보도록 하겠습니다.

예상대로 MO까지 실행 시켰습니다.

그럼 이제 남은것은 MO“/bin/sh”를 인자로 전달하는 것만 남았네요.

 

아까 그려본 스택을 생각해 보면 함수의 주소부분이 함수 내부에서는 SFP로 바뀐다고 했습니다. 즉 첫번째 인자를 전달하기 위해서는 함수의 주소가 있는 부분 +8byte부분에다가 데이터를 집어 넣으면 됩니다.


스택으로 구성해보면 다음과 같이 되겠죠.

“/bin/sh”’s address

Dummy(4byte)

MO’s address

YUT’s address

GUL’s address

GYE’s address

DO’s address

SFP

Buffer

그럼 페이로드는 다음과 같이 구성하면 될듯 합니다.

 

`python -c 'print "A"*44 + "\xec\x87\x04\x08" + "\xbc\x87\x04\x08" + "\x8c\x87\x04\x08" + "\x5c\x87\x04\x08" + "\x24\x87\x04\x08" + "AAAA" + /bin/sh’s address + "/bin/sh"'`

 

그럼 /bin/sh의 주소가 어딘지 확인해 보도록 하겠습니다.

0xbffffc70/bin/sh의 값이 들어가 있네요.

이를 페이로드에 반영해 테스트 해보도록 하겠습니다.


세그펄트가 발생했으므로 디버깅해 주소를 확인해 보도록 하겠습니다.


0xbffffaa8/bin/sh이 들어 있네요. 이를 반영해서 다시 테스트 해보도록 하겠습니다.

쉘이 정상적으로 떳네요.


이제 원본 파일에 테스트 해보도록 하겠습니다.

성공적으로 succubus의 쉘이 획득되었습니다.

succubus의 패스워드는 here to stay입니다.

+ Recent posts