开始
将题目拖入ida分析
看ida的汇编代码和代码块就能知道,这是一个关于xor亦或的逆向题
这里一直在for循环,这个代码块一直在对flag的字符串亦或,亦或的值是1
这里可以看到,程序将亦或后的值与我们输入的值做对比,然后正确的话就输出
Congratulations!
错误的话则输出
Bad flag((( Try again
之后无论是输入正确和错误,都去向了同一个代码块,然后退出程序,由此可知,这个亦或后的值就是flag
我们可以看看ida的伪代码,按下f5
和我之前分析的一样,我们只需要找到flag的值,然后亦或就好了
双击这个被亦或的flag地址,我们跳转到了程序的data段
这些值就是亦或之前的flag值,开头是6A63,结尾是4255,这里不方便复制出来,我们用010 Editor打开程序
ctrl+f搜索开头的十六进制6A63
我们在ida里看到,结尾的十六进制是4255
所以flag亦或之前的值就是这些,我们ctrl+shift+c复制出来
为了写脚本方便一点,我们ctrl+H替换一下字符串
然后将这些值保存一下,新建一个py文本写一个简单的小脚本来还原flag
然后右击exp.py,选择用文本方式打开,也可以使用notepad++,还可以拖到linux里双击直接打开,反正我们只需要打开,然后在里面写点代码
首先我们将flag放进去
由于我们输出时,需要将字符存在一个变量里,我们在这里创建一个亦或后的flag变量,设置为空
然后我们写一个循环来亦或flag
为什么这里是40呢,我们回到ida查看程序伪代码可以看到
i的值是0,然后小于等于39,从0开始到39,也就是40
然后我们亦或一下flag
chr在python里的意思是将十六进制转换位ascii码,我们最后要看的是字符串,所以这里要转换一下,然后我们对flag一个一个亦或,亦或的值是1
然后输出亦或后的flag
完整代码如下:
flag = [0x6A,0x63,0x6A,0x47,0x51,0x40,0x7C,0x3E,0x30,0x6C,0x6F,0x35,0x3B,0x3A,0x69,0x76
,0x23,0x73,0x27,0x21,0x76,0x73,0x73,0x7C,0x7C,0x2A,0x29,0x2A,0x79,0x28,0x2F,0x41
,0x43,0x43,0x16,0x46,0x17,0x15,0x42,0x55]
bananaflag = ""
for i in range(40):
bananaflag = bananaflag + chr(flag[i] ^ (i + 1))
print(bananaflag)
然后我们运行一下
chmod +x exp.py
赋予程序执行权限
flag:
kaiCTF{69fd964ff2a45cedde026d60aba5b23e}
总结
一次简单的逆向题笔记,有什么不会的都可以来问我