Nisy 发表于 2007-2-24 20:27:44

稍高级的爆破(一种不错的思路)

稍高级的爆破
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:,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

http://bbs.pediy.com/upload/2006/20/image/image001.png_056.png

图1
就是输出注册成功的call的。如果没有介绍,把我的改的这些代码给小鸟看看,他肯定很奇怪,连call都没有,怎么忽然冒出一个retn呢?
我只是提供一些建议。比如说:你还可以在一个call快结束时即一个retn前,一不小心就retn到注册去了。
给大家布置一个作业吧!大家自己去试试,或许你也“一不小心”就注册了!但是软件一不小心就崩溃了,那也不是我的罪过!
明白了一些道理之后我们就可以用不同的方法实现同样的事情了。retn就差不多等价于
pop eax
jmp eax
只是这里原来的EAX的值丢失了。把这里的eax换成其它的寄存器也一样。这种东西用来装酷拌傻还是挺好的。
本来还想写写SEH怎么应用在我们的爆破中。以前常常被SEH搞得昏天黑地,现在我们反转一下角色。看我怎么把SEH搞得昏天黑地。可是我好困,睡了!以后补起。
思路就是我们自己弄个SEH指向成功处,然后自己弄个异常,就……不是难事吧!

菜儿 发表于 2007-2-24 23:58:44

好帖..有创意...建议颁发个:创意奖

ktykty 发表于 2007-2-25 10:00:20

谢谢分享了

sadffg 发表于 2007-2-25 13:15:08

没看懂aa!:lol:

月之精灵 发表于 2007-2-25 13:19:49

思路很新啊,从来没这样想过。:lol:

情天下雪 发表于 2007-2-25 23:00:00

支持。认真学习

qing0408 发表于 2007-2-26 14:53:43

看不大懂的。还是太菜了的缘故。

极速暴龙 发表于 2007-2-28 23:59:45

嗯...很歹毒:hug:

windtrace 发表于 2007-3-1 09:35:57

好像似乎差不多没多少用啊

pcg 发表于 2007-3-8 11:24:29

很复杂@_@
页: [1] 2 3 4 5
查看完整版本: 稍高级的爆破(一种不错的思路)