main()
read_flag()
talis[v3]
2 byte0x4040a0
HTB{th4nk_G0T_w3_h4v3_th15_t4l15m4n}
main()
create()
tạo chunk size tối đa 0x82
control được index chunk :*(&z + num)
không thể nhập gì vào chunk
removez()
free không xoá ptr
display()
in ra thôi
attack()
lần này cho phép nhập trên stack với bug BOF
kiểu nhập là%lf
sau đó fclose(stderr) và fclose(stdout)
cuối cùng return
%lf
.
(chấm)HTB{tc4ch3d_d0ubl3_numb3r5_4r3_0p}
main()
create()
malloc với size lớn thoải mái
vượt 0x20000 khả năng sẽ tạo mmap
insert()
được insert 1 lần
input không vượt quá size chunk tạo ra
edit()
được edit 2 lần
maybe có lỗi OOB ở '%lu'
delete()
hàm sẽ exit chương trình
không có free
inspect()
tương tự hàm edit(), bug OOB ở '%lu' nhưng lần này sẽ leak cho ta dữ liệu
malloc size 0x1000000
input là 2097152 (0x200000) do còn nhân 8
trả về con trỏ không phải heap
index = (0x1000ff0+stdout+8)/8
cộng 8 do địa chỉ đầu là _flags (0xfbad)
offset_base = 0x2197e3
offset sẽ khác trên server
exit
, không thể fake vtable thì ở 2.34 đã có security check (xem thêm)exit
cũng có nghĩa sẽ trigger option delete()exit
được call đến, nó sẽ duyệt qua các std ở _IO_list_all
, nên _IO_list_all
thay đổi thì sẽ execute fake file của mình_IO_list_all
trỏ đến stderr (xem thêm)__GI__IO_file_jumps
__GI__IO_file_jumps
khi exit
được call đến sẽ đá động tới __overflow
_flag
là b'/bin/sh\0' tương ứng $rdi_IO_write_ptr
> _IO_write_base
vtable
= __GI__IO_file_jumps
__GI__IO_file_jumps
trỏ về fake fileHTB{y0u_r3tr13v3d_th3_r3s34rcH_n0t3s_4nd_s4v3d_u5_4ll}