xctf攻防世界——crackme writeup

感谢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)


posted @ 2020-04-04 20:06  红刃  阅读(761)  评论(0编辑  收藏  举报