如何在x86_64汇编(yasm)中向STDIN传递非打印ASCII字节
输入非打印ASCII字节到x86_64汇编程序的通用方法
针对你用x86_64 YASM汇编程序通过SYS_read读取STDIN时,需要输入像0x90这类非打印ASCII字节的问题,这里有几个通用的实现方法,覆盖不同场景需求:
1. 用printf生成并管道输入(最通用的命令行方式)
几乎所有类Unix系统都预装了printf,它支持用\xXX格式直接输出十六进制对应的字节,不管是否可打印。比如要输入单个0x90字节:
printf '\x90' | ./your_assembly_program
如果需要输入多个字节序列(比如0x90、0x48、0x83):
printf '\x90\x48\x83' | ./your_assembly_program
这种方式完全不需要交互,适合脚本化测试或者批量输入场景。
2. 使用Shell的Here-String/Here-Doc传递输入
如果不想用管道,也可以用Shell的here-string直接传递字节数据:
./your_assembly_program <<< "$(printf '\x90\x0a')"
如果需要多行输入(注意会自动添加换行符0x0a),可以用here-doc:
./your_assembly_program << EOF $(printf '\x90\x41') EOF
3. 创建字节文件并重定向输入
先把需要的字节写入一个二进制文件:
printf '\x90\x00\x7f' > input_bytes.bin
然后让程序从这个文件读取输入:
./your_assembly_program < input_bytes.bin
这种方法适合需要重复使用相同输入的测试场景,文件可以反复调用。
4. 终端交互式输入(适合手动调试)
你提到的<Ctrl+Shift+U>是X11终端的标准方法(输入十六进制码后按回车确认),除此之外还有终端特有的方式:
- Linux控制台(非X11环境):按住
<Alt>键,然后用小键盘输入字节对应的十进制数值(比如0x90对应十进制144,按1、4、4),松开Alt即可输入该字节。 - macOS终端:开启“使用Option键作为Meta键”后,按住
<Ctrl+Shift+U>,输入十六进制码,再按空格确认输入。
5. 汇编程序内直接构造测试数据(无需外部输入)
如果只是调试程序逻辑,不想依赖外部输入,可以直接在汇编代码里预定义需要的字节序列:
section .data test_input db 0x90, 0x48, 0x83, 0xec, 0x10 ; 自定义字节序列 input_len equ $ - test_input section .text global _start _start: ; 直接使用test_input中的数据,替代SYS_read读取STDIN的步骤 ; 后续处理逻辑...
这种方式完全脱离外部输入,适合快速验证程序逻辑。
内容的提问来源于stack exchange,提问作者LRDPRDX
相关产品推荐
相关产品推荐

