攻防世界xxxorrr题解
1.查壳
对程序进行差壳发现没有壳且程序为64位程序
2.代码分析
拖入ida查看反汇编结果
按f5进入伪代码,双击main函数就进入main
主函数如下:
查看sub_A90发现返回atexit函数
查询菜鸟教程函数介绍如下:
通过上述可知不管函数在哪定义都会在函数执行完后执行,所以还需要对循环进行分析,发现s1会和我们输入的s进行异或得到新的s1
s1加密完后程序就return结束并执行sub916,sub916函数如下:
3.变量提取
通过分析sub_916函数发现异或加密后的s1需与s2相同,点击s1或s2即可查看s1和s2的值,如下:
这里比较坑,s2的数据类型为s2[8],而s2的长度远不止8,因此shift+e提取变量内容时并不能提取出完整的s2
shift+e提取s2效果如下:
正确作法如下:
完成如上操作后在将其转化为数组,shifit+e提取即可提取出如下内容
提取完变量后s1^s2即可获取输入内容,当计算的结果并不是flag
4.解flag
通过上一步提取出s1和s2并不能计算出flag,怀疑s1不止进行过一次加密,回到main函数选中s1按x查看交叉引用
进入函数发现s1还进行过一次异或加密,怀疑是在主函数执行前对s1进行的加密,即s1后与输入s进行加密
所以s2得出方程如下:
s2[i]=(s1[i]^2 * i + 65)^s[i];
//即s[i]=(s1[i]^2 * i + 65)^s2[i]
理清楚逻辑后即可进行解密脚本编写,脚本如下:
flag=''
s1='qasxcytgsasxcvrefghnrfghnjedfgbhn'
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
]
for i in range(0,len(s1)):
flag+=chr((ord(s1[i])^2 * i + 65)^s2[i])
print(flag)
解出结果:flag{c0n5truct0r5functi0nin_41f,缺少}自行补上即可
5.解释解密逻辑
查看s1交叉引用会发现sub_84A函数调用了s1
查看sub_84A交叉引用会发现被init函数调用过
init又被start调用过
如标记处所示:
这题让我懂得了不能只看main函数,其他的参数还是有必要看的
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://guofun.top/ctf/378/
共有 0 条评论