题目来源于网上,具体未知。
运行软件后如图:
看起来很吓人有没有?
实际点击页面后,发现只是一张图片,输入框可以输入,输入完成后,只有Decrypt可以点击。
先查下壳有没有,发现没有,发现编译器是VS2017。
使用IDA打开,IDA首先找到了WinMain入口。
因为是GUI程序, 所以入口点是WinMain。不过目前关注的重点不是在这里,先要找到合适的位置下断点。
GUI程序存在输入框,所以寻找下获取输入框内容的API函数,这里找到了GetDlgItemTextA,下断点调试后发现确实是。
在IDA里找交叉引用的地方找到GetDlgItemTextA,F5翻译下。
很清楚显示为对话框过程函数,这里应该就是主逻辑了。
来到下面GetDlgItemTextA调用处
大概的处理流程为先获取输入框的内容,接着判断输入字符串的长度是不是18个字节。
如果是则继续往下执行,如果不是则直接返回错误并弹窗。
这里我们跟进等于18的流程里,sub_4013B0函数为复制输入框内容的值到Dst空间。
sub_401010函数为算法核心部分,如果返回值为1则成功,返回为0则失败弹窗。
双击进入sub_401010里,查看源汇编指令可知a1这里翻译错了,应该为String。
这里的处理流程为,将String每个字节与0xCC进行异或运算的结果再赋值给源地址。
之后再每个字节与byte_404000地址空间的每个字节进行比较,如果每个都相等则最后返回值为1。
所以我们可以写出注册机,逆算法。
# coding=utf-8
key = [
0xFD, 0x93, 0xA8, 0x83, 0x93, 0xA2, 0xFC, 0xB8, 0x93, 0xBB,
0x8D, 0xA2, 0xA2, 0xAD, 0x93, 0xAF, 0xBE, 0xB5
]
flag = ""
for i in range(len(key)):
flag += chr(key[i] ^ 0xCC)
print(flag)