Baby Calc - WannaGame2022


main

Ở hàm này
myExpr
được cấp phát 0x20 bytes
str
được đọc 0x80 bytes và lưu trên stack trong khi bài này chỉ cung cấp cho str
setup_data


Nhìn dòng 5-10: Hàm này copy từ cái
str
nhập ban đầu vàomyExpr
theo thứ tự sau:opera(4 bytes) --> size(4 bytes) --> arg1(4) --> arg2(4) --> buf (8) --> func(8)
Ở dòng 9, nếu size của bạn là 0x10 --> malloc sẽ cấp phát 0x80 bytes
Để test hàm trên, bạn có thể chạy hàm sau:
def sendExpr():
payload = b"+".ljust(4,"\0") #opera
payload += p32(0x10) #size
payload += p32(18) #arg1
payload += p32(20) #arg2
payload = payload.ljust(80, b"A")
r.sendline(payload)


Tại dòng 47, sau khi gán myExpr->func thì chương trình sẽ gọi thẳng tới LABEL 15: nơi ta được phép nhập với kích thước tùy ý.
Tại đây xuất hiện lỗi Heap OverFlow
save_result


Ở hàm này các biểu thức sẽ được lưu trong
str
, sau đó được lưu vào 1single linked list
với head
view_result

Ở hàm này nó chỉ in
obj->expression
ra màn hình thôi, không có gì cả
cleanup_data

Hàm này sẽ free thằng buf với kích thước 0x80 nhìn ở hàm setup_data
Memory management
Memory sau mỗi lần lặp:
myExpr = malloc(0x20); (1)
myExpr->buf = malloc(8 * myExpr->size); (2)
str = malloc(0x80); (3)
obj = malloc(0x10); (4)
free(myExpr->buf);

Overview
Nhìn ảnh trên, có thể thấy myExpr->buf
sau khi được free thì nó sẽ được đẩy vào tcachebins
. Gọi lại 1 lần lặp nữa với kích thước tương tự để tái sử dụng chunk này.


myExpr (loop1)
myExpr -> buf (loop2) <--- Heap OverFlow here
str (loop1)
obj (loop1)
myExpr (loop2)
str (loop2)
obj (loop2)
Overwrite từ 2
đến 4
để leak được địa chỉ heap.

Last updated