Perl命令行内存存储

Perl command line memory storage

我正在尝试将命令行参数传递给程序 'notesearch.c' 以便溢出缓冲区并使用以下命令将 return 地址以小端格式重写为 0x00007fff9e89b2e7 :

./notesearch $(perl -e 'print "\xe7\xb2\x89\x9e\xff\x7f\x00\x00" x 20')

然而,存储在 argv[1] 的值是:

0x7fff9cd441cc: 0xe7 0xb2 0x89 0x9e 0xff 0x7f 0xe7 0xb2

0x7fff9cd441d4: 0x89 0x9e 0xff 0x7f 0xe7 0xb2 0x89 0x9e

0x7fff9cd441dc: 0xff 0x7f 0xe7 0xb2 0x89 0x9e 0xff 0x7f ......

没有存储零!所以实际的 64 位覆盖 return 地址可以是非零十六进制数字的任何排列。 我如何存储零?

在类 unix 系统上,无法传递包含 [=10=] 个字符的参数。

Perl 能够打印 [=10=],一些 shell 可能能够将它们保留在命令行的内部表示中,但是当 shell运行另一个程序,它将使用 execve 系统调用(所有更高级别的程序执行例程都构建在 execve 之上)。传递给 execveargv 的格式是以 NULL 结尾的 [=10=] 字符串数组。

这是用于程序执行的内核ABI;没有办法解决它。您可以 almost 在用户空间中使用您自己的 ELF 解析器重新实现 execve,但只有内核可以为您提供 set-id 位的特权升级,并且内核只会这样做当你打电话给 execve.