以前的东西整理(4)

APR 8, 2014
网络攻防第一次实验

虽然我不想坑爹,不过似乎又坑了一次……

以下是我的坑爹经历:

这次实验有两个部分,一个是破解软件序列号,一个是用shellcode实现一个功能。当然,破解序列号只是用老师给的一个demo程序练手,至于shellcode,希望这篇坑爹录写完之后我真的可以说出个一二三,就不枉我要死要活的搭个博客了。

实验用到的主要软件:OllyDbg,LordPE.exe

//嗯,刚刚又发现媒体总大小有限制……

//以后记得加上对PE文件格式的详细分析

首先用LordPE.exe查看PE格式结构,这次实验中是查看demo.exe这个可执行文件的文件格式:
以前的东西整理(4)_第1张图片

可以看到镜像基址为0×00400000,说明后面在OllyDbg中看到的004开头的地址为用户代码空间。

可能在第一次打开OllyDbg时要修改一下路径,然后用OllyDbg打开目标程序DemoD.exe,我们的目的是破解这个程序的序列号,随便输入序列号之后点击验证,会弹出错误提示窗口,根据MFC编程经验可知,此时是调用了messagebox这个模块,于是搜索全部模块中的名称,找到messagebox,这个时候可能会看到几个和messagebox有关的名字,选择“.text”对应的,代表的是代码,而不要选“.data”对应的。

然后就是一个个试了,先随便挑一个,例如messageboxA,双击它之后会进入该模块对应的汇编代码,在进入的起始处按F2设置断点,如果怕断不下来也可以设置硬件断点(但是我实验时全都断下来了),然后重新加载运行该程序,验证序列号,看是否会在弹出错误提示窗口之前将程序断下,如果成功断下则证明选的地方正确,否则找另一个messagebox重新试,直到成功。

//需要加上对OllyDbg中各个区段的理解

假设找到的正确位置是messageboxA,此时继续执行程序直到弹出错误提示窗口。由于函数执行完成之后,会回到原来调用它的位置,所以此时应该在错误窗口点确定,然后继续单步执行,直到返回到用户代码空间,也就是用户判断完序列号是否正确之后,调用这个函数弹出窗口的地方。

而前面看PE文件格式的时候说过,用户代码空间的地址是004开头的,所以单步到004开头的地址时就停下,然后看该地址之前的代码是否是用来判断序列号的。实验中看到前面是很多先比较,然后根据比较结果跳转的代码,于是推测这段代码是用来检测序列号的,于是找到这段代码的开头,也就是push ebp这个指令处,设置断点验证我们的想法。重新运行程序之后,发现程序在该处停下来了,证明推测正确。

然后就可以将断点设置到开始进行比较的地方了,将程序继续运行到该断点处,观察寄存器中的值,可以看到前面的所有跳转都是跳转到同一个地址,可以推测该地址是显示错误窗口的分支,在匹配到有序列号不符合的时候就直接弹出错误窗口。而为了破解,可以从现在开始单步执行,然后根据汇编指令,修改寄存器中的值,使得程序不会跳转到错误分支中去,本来一步步修改寄存器中的值并且记录下来,最后找到对应这些ASCII码值的符号就算大功告成了,但老师当然不会让你好过,在其中一个确定是一定不会跳转之后,下面一个又是很坑爹的0x014F,而常用的ASCII码最大只有0x07F(http://www.xuebuyuan.com/776525.html不知道有没有汉字与其对应,这篇文章貌似给出了汉字和ASCII码的对应关系,这里还有一篇将的ASCII码和汉字码http://hi.baidu.com/ali_wh/item/e4f59ee00aa5cac1bbf37db7[又有很多东西要了解了……]),也就是说找不到符号与它对应,不可能有字符可以用来输入破解这位序列号,于是准备暴力破解,这就比较简单了,根据前面的分析,找到正确分支的地址,然后直接jmp无条件跳转,将该处的汇编代码直接改为JMP (正确分支地址),如果把第一次跳转的指令改为这个,就可以实现不论输入什么,都会显示序列号正确,相当于破解成功。

你可能感兴趣的:(以前的东西整理(4))