当前位置: 首页 > news >正文

利用binfmt_misc机制加快CGI的调试

利用binfmt_misc机制加快CGI的调试

在网上偶然看到的一篇文章感觉很有意思也很有用就学习一下。

利用binfmt_misc机制加快CGI的调试 | ha1vk's blog

binfmt_miscLinux 内核的一项功能,binfmt_misc 允许内核基于 ELF 头将异构架构程序转交给用户态解释器。也就是说在启用 qemu-user 的情况下,ARM64 ELF 可在 x86-64 Linux 上直接 execve() 成功。

cat /proc/sys/fs/binfmt_misc/status 看一下 binfmt_misc 是否启用,默认情况下是开启的,并且会自动注册已安装的 qemu 的配置文件 。

img

注册一个新的配置文件

使用echo ":name:type:offset:magic:mask:interpreter:flags" > /proc/sys/fs/binfmt_misc/register的格式来注册配置文件

type应为E或M类型

  • 若类型为E,则可执行文件格式由其文件扩展名进行识别:magic是与二进制格式相关联的文件扩展名;此时忽略offset和mask参数。
  • 若类型为M,则可执行文件格式通过文件中的offset的(默认为0)magic数字识别;mask是全默认为 0xFF的bitmask,其用于指示数字中存在意义的二进制位。

flags: 这些标志控制解析器的行为和操作方式。下面是一些常见的 flags 标志及其作用:

  • O:覆盖(Override)标志。当多个解析器的匹配规则冲突时,使用具有此标志的解析器进行匹配和执行。
  • E:可执行文件标志。指定解析器用于执行可执行文件的功能。
  • F:开启自动刷新标志。当启用此标志时,每次访问 register 文件时都会重新加载解析器配置。
  • C:关闭自动刷新标志。当关闭此标志时,解析器配置只在系统启动时加载一次,之后不会自动刷新。
  • B:启用解析器的特权执行。这将允许使用具有特权的解析器执行文件。
  • M:启用魔数验证标志。指定解析器在匹配时必须验证魔数。

注意事项:offset+size(magic) 必须小于 128,解释器字符串不得超过 127 个字符

下面做一个简单的实验,正常情况下./xxx想要成功运行,xxx必须是可执行程序,但是如果创建配置文件指定 typeinterpreter 那么只需满足 interpreter ./xxx 是合法的命令即可。

img

要取消注册一个配置文件,可以执行echo -1 > /proc/sys/fs/binfmt_misc/xxx

同理也可以采用匹配后缀的方法。

img

系统级调试

就我而言,接触的基本都是真机,所以说不需要使用 qemu去模拟,手中如果有真机的话远程调试还是比较简单的,不用去考虑仿真问题,将 gdbserver 传进去然后一条命令就可以解决了,但是大概率会遇见一个问题就是断不住,常见的作法是将调试的程序 patch 一下,添加一个 while(1)循环。但是比较麻烦,但是如果使用 binfmt_misc 机制的话就可以解决上述问题,因为它将会在设备启动过程中第一次执行程序时使用 gdbserver 将程序远程挂载。(后面在两台工控设备中尝试,看了一下发现没有/proc/sys/fs/binfmt_misc这个目录,说明能够使用范围并没有想象中的大)

首先注册一下 echo ":cgi_test:E::cgi::/home/zikh/Desktop/ggs/binfmt_misc/debug:O" > /proc/sys/fs/binfmt_misc/register

img

debug 代码如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main(int argc, char *argv[]){char buf[100];char tmp_exec[200];char *gdb_path ="/usr/bin/gdbserver";char *target_config = "test2.cgi";char **new_argv = calloc(argc+10,sizeof(char *));if(!new_argv){perror("calloc failed"); exit(EXIT_FAILURE);}char *name=strrchr(argv[1],'/');if (name){name=name+1;}else {name=argv[1];}snprintf(tmp_exec,200,"/tmp/%s.tmp",name);snprintf(buf,100,"cp %s %s",argv[1],tmp_exec);system(buf);
// /usr/bin/gdb -x /mnt/hgfs/works/share/script.gdb --args /tmp/test2.cgi.tmp xxxxif (argc >1 && strstr(argv[1],target_config)){new_argv[0]="/usr/bin/gdbserver";new_argv[1]="0.0.0.0:1234";new_argv[2]=tmp_exec;for (int i =2; i<argc ; i++){new_argv[i+1]=argv[i];}execv(gdb_path,new_argv);} else{new_argv[0]=tmp_exec;for(int i=2;i<argc;i++){new_argv[i-1]=argv[i];}execv(tmp_exec,new_argv);}perror("execv failed");free(new_argv);return EXIT_FAILURE;}

qemu-user模拟下的CGI调试

这种方法我也尝试了,但是凡是链接到 busybox 的命令都用不了,只能用 cd 、pwd 等命令。感觉原因是 ARM ELFbinfmt_misc 拦截后,传给了 debug 程序,但 debugexecv() qemu 时,参数构造是错误的,导致动态链接 ELF 启动失败。

错误如下

img

测试发现如果将 /proc/sys/fs/binfmt_misc/qemu-arm 恢复为原本的就正常。

尝试修改 flags 参数发现也没有解决问题。

echo ':qemu-arm:M:0:\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu_debug:CF' > /proc/sys/fs/binfmt_misc/register
http://www.jsqmd.com/news/416387/

相关文章:

  • 2026年苏州全域社区广告道闸电梯整合投放专业选型参考:本地社区广告龙头精准投放服务商精选 - 品牌推荐官
  • 光通陶瓷以科技之光点亮激光产业“芯”片 - 品牌企业推荐师(官方)
  • Ubuntu 24.04 的DNS域名修改
  • 工厂质量检测具体案例:从“火眼金睛”到计量级三维扫描,质检效率如何翻倍 - 工业三维扫描仪评测
  • 专家揭秘选购好黄精底层逻辑!黄精哪个牌子好?2026十大标杆品牌榜单出炉 - 资讯焦点
  • 2026热门电感单双编码器,有实力的厂家都在这,力矩电机/电感单双编码器/无框电机,电感单双编码器制造企业哪家权威 - 品牌推荐师
  • 什么是循证研发?循证营养与循证研发:判断健康主张是否成立的证据逻辑 - 资讯焦点
  • 2026国产网络游戏好玩排行榜 热门作品推荐 - 品牌排行榜
  • 20个大模型(LLM)的新颖题目
  • 2026年Steam热门游戏推荐:哪些值得一玩? - 品牌排行榜
  • 大语言模型(LLM)的10个新颖题目
  • 解码STC89C52RC单片机中断与通信
  • 2026年热门称重结算系统品牌排名,选对品牌更省心,自助餐称重结算/刷脸识别消费机/副食品监管系统,称重结算系统公司推荐 - 品牌推荐师
  • 工业测厚仪如何选?国内领先厂家横向对比,探伤仪/超声波测厚仪/50KN电子万能试验机,测厚仪源头厂家口碑推荐 - 品牌推荐师
  • 2026年旅行社出境游推荐哪家比较合理 - 品牌排行榜
  • 2026好玩的电脑游戏推荐几个 二次元爱好者必玩清单 - 品牌排行榜
  • 2026年档案密集架厂家推荐:智能密集架/移动密集架专业供应商精选 - 品牌推荐官
  • 2026出境游旅行社哪家服务好?综合口碑与服务能力解析 - 品牌排行榜
  • 题解:AcWing 125 耍杂技的牛
  • 题解:AcWing 913 排队打水
  • 题解:AcWing 104 货仓选址
  • 纷享销客荣获灼耀之星称号,重塑智能型CRM新范式 - 纷享销客智能型CRM
  • 2026出境游旅行社定制游哪家比较好?真实体验参考 - 品牌排行榜
  • springboot~ImportBeanDefinitionRegistrar在自定义RPC框架中的使用
  • 解码数码管
  • 2026年2月上海爱彼回收指南,限量款腕表回收渠道权威推荐 - 品牌鉴赏师
  • 2026年电永磁吊具/吸盘/夹具厂家推荐:电永磁快速换模系统专业供应商精选 - 品牌推荐官
  • 主流永辉超市卡回收方式 - 京顺回收
  • 2026电动扫地车哪家好?行业热门品牌实力解析 - 品牌排行榜
  • 2026出境游旅行社线路规划哪家比较合理?实用参考 - 品牌排行榜