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ào myExpr 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 1 single 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.

  1. myExpr (loop1)

  2. myExpr -> buf (loop2) <--- Heap OverFlow here

  3. str (loop1)

  4. obj (loop1)

  5. myExpr (loop2)

  6. str (loop2)

  7. obj (loop2)

Overwrite từ 2 đến 4 để leak được địa chỉ heap.

Last updated