【问题标题】:Perl command line memory storagePerl 命令行内存存储
【发布时间】:2015-08-05 15:53:45
【问题描述】:

我正在尝试将命令行参数传递给程序“notesearch.c”,以便溢出缓冲区并使用以下命令以小端格式将返回地址重写为 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 位覆盖的返回地址可以是非零十六进制数字的任何排列。 我如何存储零?

【问题讨论】:

  • 参数在被perl处理之前通过shell。
  • 这行得通:hexdump -C < <(perl -e 'print "\x00\x00" x 20'),但这行不通:hexdump -C <<< "$(perl -e 'print "\x00\x00" x 20')"

标签: perl stack-overflow


【解决方案1】:

在类 unix 系统上,无法传递包含 \0 字符的参数。

Perl 能够打印\0,并且一些shell 可能能够将它们保留在命令行的内部表示中,但是当shell 运行其他程序时,它会使用@987654323 @syscall(所有更高级别的程序执行例程都建立在execve之上)。传递给execveargv 的格式是\0 终止字符串的NULL 终止数组。

这是程序执行的内核 ABI;没有办法解决它。您可以几乎使用您自己的 ELF 解析器在用户空间中重新实现 execve,但只有内核可以为您提供 set-id 位的权限提升,并且内核仅在您调用 @987654329 时才会这样做@。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2018-01-25
    相关资源
    最近更新 更多