运行程序
check错误
查壳
有UPX壳,ESP定律脱壳
载入OD分析
- 搜索字符串
- 向上找,找到段首
- 开始分析算法
搜先判断输入是否为空
- 再下面开始判断输入的字符除了 “-” 是不是满足0-9
- 如果满足的话,要再判断长度,0x9 到 0xB,不同长度的有不同处理程序
- 长度为0x9的,要求第3和第7个字符都要是 “-”
- 之后就是循环了,做的事情是:在栈中存放输入的数字字符的ASCII码,第一字节是数字字符的长度
可以看到最后一次处理后,栈里面是0x07313234、0x35363839
- 在最后还把"1245689" 转成 1245689,存放在ESI中
-
再往后,把数字字符转为数字。例如:‘1’ -> 1,‘2’ -> 2,…… ,在求这些数字的七次方(图片有误),把结果累加到EDI中
-
最后累加结果和ESI比较,相等就成功
算法分析
def genKey():
for i in range(1000000, 10000000):
sum = 0
for s in str(i):
sum += int(s) ** 7
if i == sum:
print(str(i)[:2] + '-' + str(i)[2:5] + '-' + str(i)[5:])
genKey()
# 17-417-25
# 42-108-18
# 98-008-17
# 99-263-15
暴力破解
略
结果
总结
其实真正的代码逻辑没有那么复杂,只是重复的很多,需要耐心分析,最后还要考虑怎么实现这个算法,这里用了最简单的暴力枚举
程序中还考虑了使用长度为 0xA,0xB长度的输入,0xB长度的输入,要求的 “-” 的位置是不同的,在第四个和第八个字符的位置
,需要耐心分析,最后还要考虑怎么实现这个算法,这里用了最简单的暴力枚举
程序中还考虑了使用长度为 0xA,0xB长度的输入,0xB长度的输入,要求的 “-” 的位置是不同的,在第四个和第八个字符的位置