如何获取c代码来执行hex字节码?
我想要一个简单的C方法,能够在Linux 64位机器上运行hex字节码。 这是我的C程序:
char code[] = "\x48\x31\xc0"; #include int main(int argc, char **argv) { int (*func) (); func = (int (*)()) code; (int)(*func)(); printf("%s\n","DONE"); }
我试图运行的代码( "\x48\x31\xc0"
)我通过"\x48\x31\xc0"
这个简单的汇编程序获得(它不应该真的做任何事情)
.text .globl _start _start: xorq %rax, %rax
然后编译并objdump它以获取字节码。
但是,当我运行我的C程序时,我得到一个分段错误。 有任何想法吗?
这是一个简单的例子:
#include #include #include int main () { char code[] = { 0x48, 0x8D, 0x04, 0x37, // lea rax,[rdi+rsi] 0xC3 // ret }; int (*sum) (int, int) = NULL; // copy code to executable buffer sum = mmap (0,sizeof(code),PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON,-1,0); memcpy (sum, code, sizeof(code)); // run code int a = 2; int b = 3; int c = sum (a, b); printf ("%d + %d = %d\n", a, b, c); return 0; }
您的机器代码可能没问题,但您的CPU对象。
现代CPU分段管理内存。 在正常操作中,操作系统将新程序加载到程序文本段中并在数据段中设置堆栈。 操作系统告诉CPU永远不要在数据段中运行代码。 您的代码位于数据段的code[]
中。 因此,段错误。
您需要通过特殊的编译器指令在线包含程序集,以便它能够正确地在代码段中结束。 请参阅本指南,例如: http : //www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
这需要一些努力。
您的code
变量存储在可执行文件的.data
部分中:
$ readelf -p .data exploit String dump of section '.data': [ 10] H1À
H1À
是变量的值。
.data
部分不可执行:
$ readelf -S exploit There are 30 section headers, starting at offset 0x1150: Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [...] [24] .data PROGBITS 0000000000601010 00001010 0000000000000014 0000000000000000 WA 0 0 8
我熟悉的所有64位处理器本身都支持页面表中的非可执行页面。 大多数较新的32位处理器(支持PAE的处理器)在其页表中提供足够的额外空间,以便操作系统模拟硬件非可执行页面。 您需要运行古老的操作系统或古老的处理器才能获得标记为可执行文件的.data
部分。
因为这些只是可执行文件中的标志,所以你应该能够通过其他机制设置X
标志,但我不知道该怎么做。 而且您的操作系统甚至可能不会让您拥有可写和可执行的页面。
您可能需要先设置页面可执行文件,然后才能调用它。 在MS-Windows上,请参阅VirtualProtect -function。
url: http : //msdn.microsoft.com/en-us/library/windows/desktop/aa366898%28v=vs.85%29.aspx