-
-
[讨论]第一题 WannaLOL
-
发表于:
2017-6-2 15:15
3669
-
1、找到文本输入点
输入“123456”可以看到“error!”的错误提示。
在OD中正好可以查找到“error!”字符串。
定位到调用“Messagebox”函数的位置。
上推到“GetDlgItemTextA”函数即为文本输入点。
2、分析数据处理过程
由文本输入点往下跟踪输入文本的处理,大概如下:
首先判断输入文本长度是否为“0x4”,若不是则跳转到错误提示。
其次判断每个字符ASCII码是否为“0x30”(48)即数字0,若是则跳转到错误提示,之后判断第一二个字符是否分别为“0x31”(49)和“0x35”(53)即数字1和5,若不是则跳转到错误提示。
然后对四个字符进行计算,将第三四个字符表示为x和y,同时将16进制数字转换为10进制,则过程得到的结果为[(x-48)-(49-48)/(53-48)]*(y-48)*16
最后与ds:[0x407118]中的常数384比较,若相同则弹出“Registration successful!”的正确提示。
3、解出注册码
根据计算过程求出方程:
[(x-48)-(49-48)/(53-48)]*(y-48)*16=384
x和y在可输入ASCII码范围内的整数解即可,则可如下求解
for i in range(126):
for j in range(126):
if(((i-48)-0.2)*(j-48) == 24):
print(i)
print(j)
print("15"+"%s"%(chr(i))+"%s"%(chr(j)))
print("------")
解得:
47
28
15/
----
49
78
151N
----
53
53
1555
----
其中第一个的ASCII码”28“为文件分割符,注册码则为“151N”和“1555”。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课