下載地址:https://hackme.inndy.tw/static/helloworld
解題過程
方法一:
1、拖進IDA,F5看代碼。
2、從代碼很容易就可以看到,有個if進行判斷,如果n是314159265,就可以輸出flag。
方法二:
1、從彙編裏面,分析flag初始時的值是什麼。
2、從代碼裏面可以看到,flag的每一位與n進行異或運算,就可以獲得最終flag。也就是說,只要知道一開始flag存放的是什麼數據,就可以用腳本自己計算出flag。
3、畫出flag在內存存放的形式。
4、注意是小端模式,高地址對應高位,低地址對應低位。
5、此處要注意小端的順序,flag[0]是0xF1,以此類推。每次都容易忘記小端是怎麼放的,順序是怎麼樣的,這次畫個圖加深一下印象。
6、利用python算出flag。
flag = [0xf1, 0xe8, 0x81, 0xc8,
0xd2, 0x81, 0xcf, 0xce,
0xd5, 0x81, 0xc0, 0x81,
0xd3, 0xc0, 0xd5, 0xc8,
0xce, 0xcf, 0xc0, 0xcd,
0x81, 0xcf, 0xd4, 0xcc,
0xc3, 0xc4, 0xd3, 0x8f]
FLAG = ''
for i in flag:
FLAG += chr((i^314159265) & 0xff)
FLAG = "FLAG{" + FLAG + "}"
print FLAG
# FLAG{PI is not a rational number.}