둘둘리둘둘리둘둘리둘둘리둘둘리둘

[ Fedora Core 4 ] enigma -> titan(clear) 본문

War game/해커 스쿨 FC4

[ Fedora Core 4 ] enigma -> titan(clear)

dool2ly 2015. 9. 8. 13:40

/*

        The Lord of the BOF : The Fellowship of the BOF

        - titan

        - Remote BOF on Fedora Core 4

        - hint : ?

        - port : TCP 8888

*/


#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>


static char buffer[40];

static void (*ftn)();


void print()

{

        printf("nothing here\n");

        fflush(stdout);

}


int main()

{

        char buf[48];

        ftn = print;


        printf("titan : What a tragic mistake.\n");

        printf("you : ");

        fflush(stdout);


        // give me a food

        fgets(buf,48,stdin);


        // buffer overflow!!

        strcpy(buffer,buf);


        // preventing RTL

        if(((int)ftn & 0xff000000) == 0)

        {

                printf("I've an allergy to NULL");

                exit(1);

        }


        // clearing buffer

        memset(buffer, 0, 40);


        ftn();

}


ftn주소와 ftn+3byte까지밖에 조작할 수 없다.


Code-reuse attack인지 ROP인지 정확한 명칭은 잘 모르겠는데 어쨌건 컴파일된 코드를 재사용해서 해결해야되는데, 대략적인 방식은 이렇다.


add esp,XX -> ret 가젯을 찾아서 우리가 조작할 수 있는 버퍼까지 esp를 끌어내리고 버퍼에는 RTL을 준비해서 문제를 해결할 수 있겠지만,   main함수 내에는 그런 가젯이 없고 라이브러리 함수는 ftn에 들어가면 ftn 호출 전에 프로그램이 종료되버리게 되있다.


그렇기 때문에 현제 사용할 수 있는 부분이 fgets호출 전 add esp,0x10지점 이다.

(esp가 내려가면서 buf내용이 계속 변경되기 때문에 fgets로 페이로드를 다시 입력받기 위해)


esp를 fget의 리턴주소가 buf를 가리키도록 쭉 내린다음 RTL을 수행하면 되겠다.


system 주소 : 0x007db0e7

"/bin/sh" 주소 : 0x008bd987


페이로드 :

dummy(40) | 0x0804854a | dummy(3)

dummy(40) | 0x0804854a | dummy(3)

dummy(40) | 0x0804854a | dummy(3)

dummy(40) | 0x0804854a | dummy(3)

dummy(8)  | &system     | dummy(4) | &"/bin/sh"



--풀이--




'War game > 해커 스쿨 FC4' 카테고리의 다른 글

[ Fedora Core 4 ] cruel -> enigma  (0) 2015.09.06
[ Fedora Core 4 ] dark_stone -> cruel  (0) 2015.08.25
Comments