查壳:
64位,进IDA:
好家伙,不给看伪代码,来吧汇编走起:
设置两个段,一个数据段(dseg),一个额外段(seg001)看看吧,dseg段中的内容'hgame{Fill_in_your_flag}'
seg001段中的内容:(不想说话)
关键:
逐个分析吧,首先是将ax清零,然后从数据段中拿出数据,向左偏移4,压入栈中,再清零ax,再从数据段中拿出数据,再向右偏移4,将栈中的数据拿出给bx,ax+bx,再拿ax与 (十六进制的17)23进行异或,最后的数据拿来和额外段的数据比较。(这里注意,只拿了一个数据,并不是全部哦)
都讲到这里了,还不懂怎么写吗,上手了呗:
Des = [0x91, 0x61, 0x01, 0xC1, 0x41, 0xA0, 0x60, 0x41, 0xD1, 0x21,
0x14, 0xC1, 0x41, 0xE2, 0x50, 0xE1, 0xE2, 0x54, 0x20, 0xC1,
0xE2, 0x60, 0x14, 0x30, 0xD1, 0x51, 0xC0, 0x17]
flag = ''
for i in Des:
tem = i ^ 0x17
flag += chr((tem >> 4) + ((tem << 4) % 128))
print(flag)