在Python中评估shellcode的方法?
用C语言程序来评估一段示例的shellcode其实并不复杂。你只需要把shellcode存储在一个字符数组里,然后创建一个函数指针,把这个指针转换成合适的类型,让它指向这个数组,最后调用这个函数(指针)。
这就是它的工作原理,假设你可以执行存储在nastycode[]
里的内存:
/* left harmless. Insert your own working example at your peril */
char nastycode[] = "\x00\x00\x00...";
void (*execute_ptr) (void);
execute_ptr = (void *)nastycode; /* point pointer at nasty code */
execute_ptr(); /* execute it */
有没有办法用Python代码做到同样的事情?或者说,Python代码转换成字节码,这样的尝试就不可能了吗?
3 个回答
0
在Python中是可以做到的……你可以使用ctypes自己绑定C语言,或者简单地使用像distorm这样的工具。
http://code.google.com/p/distorm/wiki/Python
你也可以看看dionaea是怎么做的。它是一个蜜罐(用于捕捉攻击者的工具),但它会测试shellcode并输出结果。
1
4
要实现这个功能,唯一的方法就是依赖一个C语言的库。缓冲区溢出的问题可能会通过Python的库绑定引入。为了你的需求,你可以用C语言写一个简单的Python库,并实现类似于Aleph One的《Smashing the Stack for Fun and Profit》中的example3.c。正如Avilo提到的,你需要考虑NX区域的问题,不过任何内存区域都可以再次变得可执行,这取决于你使用的平台。此外,GCC默认会使用栈保护机制(栈金丝雀)。虽然你可以通过用一个传递给函数的地址来覆盖返回地址,从而保持金丝雀不变。ASLR是一种非常好的安全系统,虽然有时很难绕过,但如果你传入的是已知的地址给你的shell代码,那么ASLR就不会是问题了。