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
之上)。传递给 execve
的 argv
的格式是以 NULL 结尾的 [=10=]
字符串数组。
这是用于程序执行的内核ABI;没有办法解决它。您可以 almost 在用户空间中使用您自己的 ELF 解析器重新实现 execve
,但只有内核可以为您提供 set-id 位的特权升级,并且内核只会这样做当你打电话给 execve
.
我正在尝试将命令行参数传递给程序 '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
之上)。传递给 execve
的 argv
的格式是以 NULL 结尾的 [=10=]
字符串数组。
这是用于程序执行的内核ABI;没有办法解决它。您可以 almost 在用户空间中使用您自己的 ELF 解析器重新实现 execve
,但只有内核可以为您提供 set-id 位的特权升级,并且内核只会这样做当你打电话给 execve
.