二进制漏洞利用练习:如何通过标准输入传入字节形式的Shellcode?
解决方法
使用printf生成字节流
printf可以解析\x格式的转义字符并输出对应的二进制字节,直接通过管道传给目标程序:printf 'AAAAAAAAAAAAAAAA\x20\x3d\x00\x00\x01' | ./你的漏洞程序注意:部分shell环境中,printf处理\x00时可能出现截断,但主流环境下可正常生成包含null字节的输出。
用Python脚本输出原始字节
Python的stdout.buffer可直接输出原始二进制字节,完全避免编码问题,是可靠性最高的方式之一:python3 -c "import sys; sys.stdout.buffer.write(b'AAAAAAAAAAAAAAAA\x20\x3d\x00\x00\x01')" | ./你的漏洞程序通过xxd转换十六进制字符串
先将目标字节转换成十六进制字符串,再用xxd转成二进制流:echo "41414141414141414141414141414141203d000001" | xxd -r -p | ./你的漏洞程序其中
41对应ASCII字符'A',20是空格,3d是'=',00是null字节,01是目标指定字节。
失败原因解析
直接输入AAAAAAAAAAAAAAAA\x20\x3d\x00\x00\x01时,shell不会解析\x转义,只会把\和x当作普通ASCII字符处理,写入缓冲区的不是你需要的目标字节。
而AAAAAAAAAAAAAAA$'\x20\x3d\x00\x00\x01'这种bash的ANSI-C转义写法,虽能解析\x20、\x3d,但bash会自动丢弃字符串中的null字节(\x00),导致最终输入缺失关键字节,无法达成目的。
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

