编辑:看来我还有很多阅读要做......
此外,对于那些告诉我这是一个坏主意的人来说,这是一个缓冲区溢出练习。
我有一个相当简单的 C 程序:
int main() {
system("cat file | nc -p 33 localhost 8080");
return 0;
}
我想把它变成十六进制汇编代码。想一想:
\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
这给了我一长串漂亮的十六进制字符串。但是当我在这个程序中测试它时,出现了段错误。
code = "\x55\x43\xff\x75\x13\x77..."
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}
有人知道我怎样才能让它工作吗?谢谢!另外,我不知道这是否重要,但它是 64 位系统。
最佳答案
在从磁盘加载二进制代码和执行二进制代码之间,您缺少操作系统为您完成的一大堆东西。例如,函数调用“system(char *command)”:在操作系统加载程序“修复”指针之前,指向命令字符的指针无效。
如果您非常非常小心,您可以构造不依赖于指针的代码,并且可以在没有操作系统加载程序帮助的情况下从任意地址运行。这就是堆栈溢出漏洞的创建方式。大多数现代 CPU 通过使用内存管理器将内存标记为“数据”或“代码”来阻止此代码运行,如果您的程序尝试执行数据或写入代码,则会出现错误。
操作系统正在尝试阻止您尝试执行的操作。
关于c - 如何将 C 代码转换为汇编的十六进制表示形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31711619/