在Python中评估shellcode的方法?

4 投票
3 回答
1850 浏览
提问于 2025-04-16 12:08

用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并输出结果。

http://dionaea.carnivore.it/

1

这就是你想要的东西;)

http://libemu.carnivore.it/

因为你在找Python相关的内容:

https://github.com/buffer/pylibemu

4

要实现这个功能,唯一的方法就是依赖一个C语言的库。缓冲区溢出的问题可能会通过Python的库绑定引入。为了你的需求,你可以用C语言写一个简单的Python库,并实现类似于Aleph One的《Smashing the Stack for Fun and Profit》中的example3.c。正如Avilo提到的,你需要考虑NX区域的问题,不过任何内存区域都可以再次变得可执行,这取决于你使用的平台。此外,GCC默认会使用栈保护机制(栈金丝雀)。虽然你可以通过用一个传递给函数的地址来覆盖返回地址,从而保持金丝雀不变。ASLR是一种非常好的安全系统,虽然有时很难绕过,但如果你传入的是已知的地址给你的shell代码,那么ASLR就不会是问题了。

撰写回答