bash - 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 在我的代码中复制标准输入和标准输出文件描述符。
太感谢了!
解决方案
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'");
推荐阅读
- javascript - 访问嵌套对象属性的更好的 javascript 方法
- python - 按每个唯一 ID 分组,然后查找每个品牌的购买次数
- reactjs - 如何用小滑块组件包装图像进行反应?
- ruby-on-rails - 创建回调后如何跳过验证
- javascript - 如何禁用用户输入以实现自动完成
- ruby-on-rails - 创建帐户时为另一个模型创建记录?
- postgresql - 在生产代码中加入“pg_locks”表是否安全?
- speech-to-text - 如何为 Azure 认知服务中的现有 docker 容器创建 IoT Edge 模块?
- javascript - 可滚动的 highchart 在 JS 中工作,但在通过 Angular HighCharts 运行时出现问题?
- powershell - 如何将 scp 和 ssh 安装到 Powershell?