无法在终端打印NOP('\x90'):粘贴至GDB后栈值异常问题咨询
复制粘贴二进制NOP字符(\x90)到GDB输入异常的原因
问题核心是终端与调试器的文本/二进制处理逻辑不匹配,具体原因如下:
终端对不可打印二进制字符的转译
你的C程序输出的\x90(十六进制0x90)属于ASCII不可打印控制字符,终端无法直接渲染为可读文本,会用占位符(如方框、空白标记)替代。复制操作时,你复制的是终端占位符的文本编码,而非原始的0x90二进制字节。GDB输入的文本解析机制
将占位符粘贴到GDB后,GDB会把输入内容按ASCII/Unicode编码解析成字节,而非直接识别为原始二进制。你看到的0x00bdbfef是终端占位符的Unicode编码对应的字节值,和预期的0x90完全无关。Python中的同类问题
Python终端输入(如input()函数)同样基于文本流处理,粘贴内容会被当作文本解析,而非原始二进制字节,因此也无法得到0x90的结果。
解决办法
避免通过终端复制粘贴传递二进制数据,直接用管道或GDB命令注入原始字节:
- 启动GDB目标程序时用管道传入二进制数据:
gdb --args ./target_program < <(echo -n -e '\x90') - 在GDB内部直接构造二进制数据写入目标位置:
# 若目标程序从stdin读取,调用fwrite写入原始字节 call fwrite("\x90", 1, 1, stdin) # 或直接修改栈内存(替换为你的目标栈地址) set {char}0x7fffffffe000 = 0x90
内容的提问来源于stack exchange,提问作者professional pro
相关产品推荐
相关产品推荐

