xctf攻防世界——crackme writeup
阅读原文时间:2021年11月26日阅读:1

感谢xctf提供学习平台

https://adworld.xctf.org.cn

crackme有壳,脱壳部分见文章:

https://www.cnblogs.com/hongren/p/12633232.html

查看字符串:

跟踪来到right,推测为成功时的标志。

来到这里,往上翻能看到核心代码以及输入和输出的指令

输入的字符串放在了[edp-38]这个位置。程序是先循环,判断了字符串长度

eax作为计数器,最后与0x2A比较

核心算法部分,主要是与“this_is_not_flag”异或,之后与402150位置比较,eax再次充当计数器,402150处数据位dword,4位,所以40108D处eax*4。

输入的字符串42位,但是给的异或只有16位,通过and操作解决

402150处数据, 改变显示方式:

将这部分数据复制出,之后删除掉前边的地址,将“000000”替换位“,0x”再加上方括号,就可以直接编写python脚本使用。

最后附上整个注释分析图(右键查看可放大)和python代码

1 a=[0x12 ,0x04 ,0x08 ,0x14
2 ,0x24 ,0x5C ,0x4A ,0x3D
3 ,0x56 ,0x0A ,0x10 ,0x67
4 ,0x00 ,0x41 ,0x00 ,0x01
5 ,0x46 ,0x5A ,0x44 ,0x42
6 ,0x6E ,0x0C ,0x44 ,0x72
7 ,0x0C ,0x0D ,0x40 ,0x3E
8 ,0x4B ,0x5F ,0x02 ,0x01
9 ,0x4C ,0x5E ,0x5B ,0x17
10 ,0x6E ,0x0C ,0x16 ,0x68
11 ,0x5B ,0x12 ,0x00 ,0x00 ]
12
13 b="this_is_not_flagthis_is_not_flagthis_is_no"
14 flag=""
15 for i in range(len(b)):
16 flag = flag+chr(ord(b[i])^a[i])
17 print(flag)