我正在读这篇文章Tips for Evading Anti-Virus During Pen Testing,对给定的Python程序感到惊讶:
from ctypes import *
shellcode = '\xfc\xe8\x89\x00\x00....'
memorywithshell = create_string_buffer(shellcode, len(shellcode))
shell = cast(memorywithshell, CFUNCTYPE(c_void_p))
shell()
外壳代码被缩短。有人能解释一下发生了什么事吗?我对Python和C都很熟悉,我试过阅读^{
在shellcode
中存储了什么?
我知道这与C有关(在本文中,它是来自Metasploit的外壳代码,并为ASCII选择了不同的符号),但我无法确定它是C源代码(可能不是)还是源于某种编译(哪个?)。
根据第一个问题,在演员阵容中发生了什么魔术?
看一下这个shell代码,我从here(它弹出一个MessageBoxA):
在任何调试器下编译并钩住它,我将使用gdb:
^{pr2}$反汇编main函数以查看调用
real_function
和function
之间的区别:有两个
call
,让我们在<main+31>
处创建一个断点,看看eax中加载了什么:查看eax中地址继续存在的数据的前3个字节:
因此,CPU将
call 0x402000
,即我们位于0x402000
的shell代码的开头,让我们反汇编在0x402000
的任何内容:正如你所看到的,外壳代码只不过是汇编指令,唯一不同的是你写这些指令的方式,它使用特殊的技术使它更易于移植,例如从不使用固定地址。在
python相当于上述程序:
如果我没弄错的话,
shellcode
包含特定于体系结构的编译代码,这些代码大致可以转换为函数调用。(不是架构专家,代码被截断…{{3}因此,你可以用一个shellcode中最初包含的代码。
这里有一个有用的链接:http://www.blackhatlibrary.net/Python#Ctypes
我们不要忘记,为了获得可执行代码,必须将其转换为您的计算机能够理解的格式。你在那里做的是提供一个字节码序列,你的机器可以解释,所以你可以告诉你的机器执行它。通过提供最终字节码,您实际上跳过了编译器的工作;这种技术在实时编译器中很常见,后者必须在程序运行时创建可执行代码。 因此,这实际上与C(或Python或任何其他语言)几乎没有任何关系,但与该代码预期运行的体系结构的细节有很大关系。在
第一个字节码是
CLD
(0xfc),后面是CALL
指令(0xe8),它使代码根据字节码序列中接下来4个字节中指定的偏移量跳转到地址,依此类推。在相关问题 更多 >
编程相关推荐