稍高级的爆破
kflnig
先喝一口茶。
“颠覆传统的爆破。”本来我想这么说,原以为这种方法我算是发现者,可是我自己实在是太浅薄了。由于对壳所知甚少!本来的题目是《你没有见过的爆破》,发现这么写我实在是太丢脸了,所以改成了《稍高级的爆破》。这种方法ASPROTECT这种猛壳中经常看到!
当然这篇文章最好需要对汇编基础知识有一定了解。而这种基础只是,很少有人讲到。但是这个基础只是恰好是自己勤奋点可以用OD总结出来的。
retn,call,eip,esp,ebp,seh,push,pop
假如你对上面这些东西了如指掌的话,那么这篇文章只是给你提供一些创意,而如果你不懂,这篇文章还可以帮你学会。
push eax执行的时候会把eax放入栈内然后esp=esp-4
pop eax执行的时候会把栈顶的元素放到eax中,然后esp=esp+4
call的作用等价于push 下一行代码的地址然后jmp到call地址
retn的作用是esp=esp+4,再改变eip的值,所以retn的作用相当于pop eip。
先简单介绍一点,大家自己多多总结。
CCDebuger在教程里说:“对于新手来说,可能这个 crackme 的难度大了一点。”我也是新手。搞得气死我了,所以先搞一下爆破。
我这么搞主要是搞堆栈了。
004010E4 03F8 ADD EDI,EAX
004010E6 FC CLD
004010E7 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
004010E9 33C9 XOR ECX,ECX
本来这里还在搞用户名长度,复制之类的,但是我很歹毒的改成了下面的代码
004010E4 68 4B114000 PUSH cycle.0040114B
004010E9 C3 RETN
直接去0040114B旅游喽!0040114B是什么。
0040114B |. E8 2B000000 CALL cycle.0040117B
^_^就是……:图1
图1
就是输出注册成功的call的。如果没有介绍,把我的改的这些代码给小鸟看看,他肯定很奇怪,连call都没有,怎么忽然冒出一个retn呢?
我只是提供一些建议。比如说:你还可以在一个call快结束时即一个retn前,一不小心就retn到注册去了。
给大家布置一个作业吧!大家自己去试试,或许你也“一不小心”就注册了!但是软件一不小心就崩溃了,那也不是我的罪过!
明白了一些道理之后我们就可以用不同的方法实现同样的事情了。retn就差不多等价于
pop eax
jmp eax
只是这里原来的EAX的值丢失了。把这里的eax换成其它的寄存器也一样。这种东西用来装酷拌傻还是挺好的。
本来还想写写SEH怎么应用在我们的爆破中。以前常常被SEH搞得昏天黑地,现在我们反转一下角色。看我怎么把SEH搞得昏天黑地。可是我好困,睡了!以后补起。
思路就是我们自己弄个SEH指向成功处,然后自己弄个异常,就……不是难事吧!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)