为何栈中混入0xc2指令而非预期的0x90?缓冲区溢出调试疑问
问题分析与解决
原因:Python字符串编码转换问题
这不是保护机制导致的,核心问题出在Python的输出编码处理上。你用print("\x90")时,Python会把这个字节当作UTF-8字符处理,但0x90不属于UTF-8单字节有效范围(0x00-0x7F),系统会自动把它转换成UTF-8的替代序列0xc2 0x90,这就造成了栈里0xc2和0x90交错的现象。
解决方法
要输出原始字节而非编码后的字符串,有两种简单方式:
方法1:用Python的字节流输出
修改命令,直接写入原始字节到标准输出,跳过编码转换:
./vuln $(python -c 'import sys; sys.stdout.buffer.write(b"\x41"*(272-96-74-4) + b"\x90"*96 + b"\x44"*74 + b"\x42"*4)')
这里用b""定义纯字节串,通过sys.stdout.buffer.write直接输出原始字节,不会触发编码转换。
方法2:使用Python 2(若环境支持)
Python 2的print默认输出字节,不会做UTF-8编码处理,直接执行即可:
./vuln $(python2 -c 'print "\x41"*(272-96-74-4) + "\x90"*96 + "\x44"*74 + "\x42"*4')
验证
执行修改后的命令后,再用GDB查看栈内存,就能看到连续的0x90填充,不会再出现0xc2干扰。
内容的提问来源于stack exchange,提问作者leandror
相关产品推荐
相关产品推荐

