查壳:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509224035733-998751349.png)
64位,进IDA:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509224110324-1110050841.png)
好家伙,不给看伪代码,来吧汇编走起:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509224223016-288122702.png)
设置两个段,一个数据段(dseg),一个额外段(seg001)看看吧,dseg段中的内容'hgame{Fill_in_your_flag}'
seg001段中的内容:(不想说话)
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509224358560-336025716.png)
关键:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509224532316-688174402.png)
逐个分析吧,首先是将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)
这里为啥要%128呢,因为相当于乘上二的四次方,难免会超过127
拿到NSSCTF{welc0me_to_4sm_w0rld}