保姆级缓冲区炸弹破解教程
Posted Hellsegamosken
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保姆级缓冲区炸弹破解教程相关的知识,希望对你有一定的参考价值。
四个关卡本身不算难,而且有提示。过关本身并不难,但还是有不少东西可以深究的。教员给了源码,实际上不给也完全能做。
建议通关顺序:1-2-3-0-4。
先不管第几关第几关,先把程序的栈结构理一下,同时找出关键地址:
嗯,这样看起来还是比较清楚的。我们开始写入的地方就是 buf。注意用 _alloca 在栈中申请空间字节数量是 4 的倍数:(当然在动调下这些都无关紧要)
比如动调来找 buf 的地址就可以先写入几个字节,在栈里面找就行了:
注意右下角的 0000AAAA。
我的参数是 001017,cookie 是 0X2ED52137。不同参数下 buf 地址之类的会不一样。如果不确定在你的参数下地址怎么得到,或者对具体的返回地址有疑问,可以先用我的参数照着本文的教程调试几遍,其实并不十分复杂。
Trojan1
第一个木马最后调用了 exit(0),直接终止程序,因此无需维护栈结构程序也可正常退出。故直接把 ret_to_test 改为第一个木马的入口即可。
Trojan2
第二个木马比第一个木马多了一个参数,需要这个参数和 cookie 相等才可以通过。发现这个参数是通过栈来传递的,因此直接将对应位置覆盖为 cookie 即可。注意,如果这里参数传递是通过 eax,那么应该就只能靠劫持了(就是第 0 关)。
Trojan3
第三个木马是拿一个全局变量和 cookie 进行比较,同样有 exit(0)。通过写入很多字节到该全局变量的地址有些困难,但我们可以通过向栈中写入指令,然后将 ret_to_test 修改为 buf 的地址,就可以让 eip 跳转到 buf 处执行我们写入的指令了。写入的指令可以是:
mov eax, 0x2ED52137
mov [0x00409004], eax
push 0x00401250
ret
机器码:B83721D52EA3049040006850124000C3,有 16 字节,刚好覆盖 ebp,不会影响 ret 地址。
Trojan0
再回过头来看第 0 关。发现 getbuf() 函数的返回值是放在 eax 里面的,如果不通过执行写入代码的方式,不可能对其进行修改。至于写入什么代码就各显神通了:
mov eax, 0X2ED52137
push 0X00401181
ret
注意把老的 ebp(0019fe28) 写在原来的地方,否则返回到 test 函数后 ebp 会错误,这样通过 ebp 寻址会出问题,导致程序异常退出。这也是前几关简单的原因——它们都有 exit(0)。
Trojan4
第四个木马和第三个木马的区别就是最后没有调用 exit(0),因此需要想办法让程序正常返回。本意应该是让我们维持栈平衡,但实际上可以直接从第四个木马返回 exit 即可…
当然这个做法有点耍赖皮,还是想想正解。如果继续用第三关的输入,程序为何不能正常返回?观察到我们写入的 16 字节的程序覆盖了原有的 ebp,所以返回到 test 后在里面用 ebp 寻址会出问题。
一种解决方法是先把 ebp 覆盖掉,后面再把这个位置改为正确的 ebp。这样意味着写入的指令会变长,而为了能够顺利 ret 到 buf 来执行指令,ret_to_test 的位置又不能放别的东西。所以干脆不更改前若干字节(即用原始值覆盖),把代码写在 localbuf 或者 MyRandomBuffer 的位置里面。如果你运气不好,这些空间分别都不够,那还可以用 jmp 把它们联合起来。
第二种方法是不更改 ebp 位置的值,但这样意味着少了 4 字节的操作空间,还是得用上面提到的方法。我用了这种方法。
那个已知数值的鸟根本没鸟用,毫无影响。
bonus
细心的读者可能已经发现了,上面第四个木马的正规解法需要用到 localbuf/MyRandomBuffer 的空间,而两段的空间的大小是根据学号随机出来的,假设有个人点背到极致,两段空间都是 4 字节,或者不让用 buf 以外的空间,那这道题该怎么做?
我想到的方法是:重复利用 getbuf 函数。即我写入的命令会把 esp - 0x20,然后调用 getbuf 函数,从而可以再获得写入一次命令的机会。这样第二次写入的指令就可以很长了。
以上是关于保姆级缓冲区炸弹破解教程的主要内容,如果未能解决你的问题,请参考以下文章