感谢xctf提供学习平台
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)