下载地址: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.}