使用Perl脚本写入以0x00开头的地址

C K*_*C K 7 bash perl

读"黑客 - 剥削的艺术"一书; 我跟随编写器,因为他通过溢出堆栈并更改函数的返回地址来更改执行流程.(具体来说,第135-136页)他设法用Perl脚本执行此操作,将返回地址作为命令行参数输入10次:

$ ./auth_overflow2 $(perl -e 'print "\xbf\x84\x04\x08"x10')
Run Code Online (Sandbox Code Playgroud)

0x080484bf返回地址在哪里.

我正在尝试做同样的事情,但我的返回地址以0x00开头.将\ x08替换为\ x00,空字符将被省略,因此我要输入的地址在内存映射中移位了一个字节.我该如何解决这个问题?

ike*_*ami 8

命令行参数是以NUL结尾的字符串.因此,您无法传递包含NUL的字符串.它将被视为字符串的结尾.

$ perl -e'system("echo", "abc\x00def", "ghi\x00jkl");'
abc ghi
Run Code Online (Sandbox Code Playgroud)

知道了这一点,shell在构建参数时正在剥离NUL.

$ perl -e'printf "%v02X\n", $_ for @ARGV' "$( perl -e'print "\xbf\x84\x04\x08" x 5' )"
BF.84.04.08.BF.84.04.08.BF.84.04.08.BF.84.04.08.BF.84.04.08

$ perl -e'printf "%v02X\n", $_ for @ARGV' "$( perl -e'print "\xbf\x84\x04\x00" x 5' )"
BF.84.04.BF.84.04.BF.84.04.BF.84.04.BF.84.04
Run Code Online (Sandbox Code Playgroud)

auth_overflow2 应修改为采用转义形式的地址,例如十六进制的地址.