首页 > 解决方案 > system() 失败,而命令在终端中运行良好

问题描述

这令人沮丧。我正在编写一个 C 程序,我需要在其中创建一个自我修改的 dd,即 dd 能够在运行时自行修改[ifd = open(stdin) and ofd = open (/proc/self/mem)]

当我直接在终端中运行以下命令时,setarch 命令设置了 ADDR_NO_RANDOMIZE 标志,并且成功创建了一个自我修改的 dd。但是,当我通过 system() 运行它时,它会失败并出现错误。

system( "setarch x86_64 -R dd of=/proc/self/mem bs=1 seek=$(( 0x555555554000 + 0xa823 )) conv=notrunc 10<&0 11<&1");

也许我错过了一些非常明显的东西,因为我不太擅长 shell 编程。

错误如下:

dd: unrecognized operand ‘10’
Try 'dd --help' for more information.

注意:我使用 10 和 11 在我的代码中复制标准输入和标准输出文件描述符。

太感谢了!

标签: bashshellsyntaxshdd

解决方案


POSIX sh 仅保证支持从 0 到 9 的 FD。

如果您需要更高的 FD,您应该在bash或其他支持此功能的 shell 中运行您的命令:

system("bash -c 'setarch x86_64 -R dd of=/proc/self/mem "
       "bs=1 seek=$(( SEGMENT + OFFSET )) conv=notrunc 10<&0 11<&1'");

推荐阅读