CTF笔记

[学习笔记]攻防世界—xxxorrr

2025-03-10
1 分钟51 字

下载附件

使用IDA打开,反编译main代码

这里会对s1和s2进行异或运算,翻一翻函数,找到了比对s1和s2的函数

找到s1,s2的字段

我们发现s2字段前面的部分隐藏了,我们可以右键然后选择Undefine(快捷键U)来取消格式来显示,或者换到Hex的十六进制窗口查看

我们得到了两个有用的字段

加密的字段qasxcytgsasxcvrefghnrfghnjedfgbhn

和加密时用来进行异或运算的数组56,4E,57,58,51,51,09,46,,17,46,54,5A,59,59,1F,48,32,5B,6B,7C,75,6E,7E,6E,,2F,77,4F,7A,71,43,2B,26,89,FE,00

直接用代码进行异或运算发现不对,应该还有其他用到的函数,我们再找一找

找到了,可以按x查看交叉引用,找到引用的函数

我们再看看start

是了,他会先调用这个加密函数,然后再调用main

所以我们只需要把s1解密,然后再对s1和s2进行异或运算即可

最后代码:

s1 = "qasxcytgsasxcvrefghnrfghnjedfgbhn\0"
s2  = [0x56,0x4E,0x57,0x58,0x51,0x51,0x09,0x46,0x17,0x46,0x54,0x5A,0x59,0x59,0x1F,0x48,0x32,0x5B,0x6B,0x7C,0x75,0x6E,0x7E,0x6E,0x2F,0x77,0x4F,0x7A,0x71,0x43,0x2B,0x26,0x89,0xFE,0x00]
a1 = [0]*34
a2 = [0]*34
for i in range(0,len(s1)):
    a1[i] = (ord(s1[i]) ^ 2 * i + 65)
 
for i in range(0,len(s1)):
    a2[i] = a1[i] ^ s2[i]
    print("%c"%a2[i],end="")

运行代码,获得flag

有一点值得注意,s1的字段我直接用的字符串,后来发现少了个符号,后来看了一眼十六进制,忽然想起来文本结束有个0x00也就是\0,加上了输出就正常了

许可协议: CC BY-SA 4.0 。转载请注明出处,允许商用;改编/转载须以相同许可(CC BY-SA 4.0)发布。如有问题请联系我。