程序分析
-
是一个简单的输入用户、注册码的注册机
对输入用户名的长度有要求,至少为5。
正常输入是没有明确的显示结果的。
-
32位
-
没有壳
-
PE程序
反汇编分析
这题是由反汇编编写的,在解题的时候既可以用OD去分析,也可以用IDA去分析,两者都很方便。
OD就是理清它的反汇编,着重注意它对输入字符串的操作;
IDA基本就是把算法用C++的方式给你显示出来了,可用很好的看到算法。
-
OD
-
爆破
- 进入之后直接对字符进行检索,我们可用明确有一个字符数小于5的错误提示信息,通过这个我们就可以找到程序执行处。
- 会发现这里还有个成功的提示信息,那我们更是可以去看成功处的信息。
- 在成功的提示信息前有一个跳转,顺着跳转箭头我们会发现它直接跳到程序结束处,且跳过了成功的提示信息展示,所以我们可以推测这里就是爆破点。尝试用nop填充或者直接用jmp跳转就能爆破了,非常简单。事实也确实如此。
-
算法分析
-
从开头开始,这里有两个GetDlgItemTextA函数,这是C++中的函数用来获取我们输入的用户名和注册码。
-
中间的message Box A是字符串过短时的错误提示信息。
-
在获取到用户名和密码之后,就是程序的算法判断是否成功了。可以注意到我们获取到的用户名和密码都存放在00403080和00403280里面的。然后它将其放入寄存器eax和ebx中来进行操作,esi中存放的是长度,放入了ecx。
-
mov dl,byte ptr ds:[eax] #取出eax中一个byte的值,即用户名的第一个字符 sub dl,cl #将取出的字符和当前字符长度相减 cmp byte ptr ds:[ebx],dl #相减后的字符和注册码的第一个字符进行比较 jnz short AD_CM#2.00401174 #如果不同,直接跳出 inc eax #减一,把比较的字符减去,此时用户名长度减一 inc ebx #密码减一 loopd short AD_CM#2.00401154 #loop循环根据ecx
-
-
IDA