如果您不希望最后一段的长篇大论头-->
gets()
我在用于填充函数的本地 1024-char* 缓冲区的程序中发现了缓冲区溢出漏洞。它在Sparc Solaris 5.8 (sun4u) 32-bit上。
要克服的第一个障碍tch
是不让我手动输入 > 257 个字符(如果我想能够按 Enter 键,则为 256 个;)
为了绕过这个,我一直在执行/bin/sh
,stty raw
并且我现在可以用> 1095个字符有效地溢出缓冲区。(注意:我必须使用 Ctrl-J 来执行 line-feeds/enter ,尽管我还没有研究 stty raw 来检查为什么会发生这种变化。
我的问题是:现在不仅要溢出缓冲区,还要写新的返回地址/保留 %fp十六进制代码。但由于我不知道如何从终端程序中手动输入十六进制代码,我想我可以找到一种方法来使用 C 并让它与易受攻击的程序执行/交互,并最终将其发送给我的自定义缓冲区。
但是,如果我有办法手动输入/复制粘贴十六进制字节,我可以做这样简单的事情!!!
perl -e 'print "n" . "A"x1094 . "\xff\xbe\xf5\x58" . "\xff\xbe\xff\x68" . "\0"'
(如果您想知道我为什么要打印“n”,那是因为易受攻击的程序会检查字符串的 yes/no @index 0)
因为我不知道手动粘贴此类十六进制信息的方法,所以我一直在尝试使用 C。在 C 中,我制作了特殊的缓冲区,并且一直在学习popen()
易受攻击的程序(“w”)和 fputs 我的缓冲区,但它已经充其量工作不确定。(popen,IPC
对我来说是全新的)
(我也尝试过piping/dup2ing
,但没有得到任何结果,没有有效字符串输出/输入的证据)不确定出了什么问题,我对代码进行了很多试验,后来放弃了它。
描述我的“popen”程序输出的最佳方式是,仅通过在索引 [1096->1099] 处分隔缓冲区,易受攻击的程序中存在段错误,这实际上是函数的位置%fp
,所以看起来很正常@首先。但是,将字符串分隔在比这更高的索引处会使编程工作正常(WTF)!!!这种行为让我觉得WTF!?这与手动粘贴的行为不同,因为更多的字符肯定会改变 seg fault -> bus error,因为接下来我将覆盖返回地址,然后是该堆栈帧及以后的任何可能重要的信息!
整个字符串实际上并没有一口气发送吗?!?!?我从 那里听说过一些关于缓冲区fflush()
问题的信息popen() manpage
,但我不明白那个谈话!!
这是我第一次使用popen()
,并且有更多我认为奇怪的行为->如果我停止fputs()
数据,易受攻击的程序进入无限循环,重复打印它通常只会打印一次的最后一个输出字符串,但是在这个情况下,每当我停止 fputs'ing 时,事情就会开始无限打印出来。现在,我希望如果我不输出,程序不会像一只好鸭子一样坐下来等待更多输入。???显然不是。显然它必须继续小便和呻吟,我需要输入下一个字符串!这是 popen 的正常行为吗?也许是因为我的 popen 程序在实际完成之前退出并使用 pclose() 关闭(但我期待缓冲区溢出,我不知道为什么我没有像手动粘贴时那样得到它)
注意:我使用 "\r\n" 来指示易受攻击的程序执行 'return' ,我不确定 CTRL-J / Enter 键的等价物(哪个 enter 键在原始 tty 中不起作用)。我也不确定在管道缓冲区时是否需要原始 tty。
然后我想我试着聪明一点,把字符串放到一个文件中,然后通过命令行做一个管道。我不知道你是否可以像这样通过管道连接到一个期望
以这种形式输入的程序,我什至无法得到一个溢出!IE
printf "\r\n" > derp && perl -e 'print "n" . "A"x1025' >> derp && printf "\r\n" >> derp
cat derp | ./vuln
现在,倒回 <-> 回到 tsh,我说我有 257 个字符的限制,如果我想能够按 Enter 并让程序继续运行,我需要做的比这少。所以,也许 \r\n 不在这里,因为那是 2 个字符。要么,要么你不能cat
进入这样的程序。但是我在我的 C 程序中使用 \r\n 来告诉易受攻击的程序我已经按回车键,并且它们至少稍微更实用(不是真的),尽管仍然没有以与手动粘贴我相同的方式溢出缓冲区垃圾缓冲区。
啊!!!
此外,仅使用其中一个:'\r' 或 '\n' 绝对行不通!我错过了另一个控制字符吗?这可能是我的程序问题之一吗???
但基本上我的整个问题是我似乎无法理解如何创建一个程序来运行和与命令行可执行文件交互并说嘿!!!将整个缓冲区放入您的gets() 中,我知道您会非常喜欢它!就像我自己从终端运行程序一样。
而且我知道无法手动将十六进制代码粘贴/写入终端,这就是全部原因为什么我要尝试编写一个交互程序来在 C 中制作一个带有十六进制字节的字符串并发送到该程序的gets()!!!!如果您跳到本段,我还希望您知道我正在使用专门的 /bin/bash 和 stty raw 以便我可以手动输入超过 257 个字符(如果我可以成功创建,我不确定是否需要继续这样做一个交互程序向易受攻击的程序发送缓冲区。可能以这种方式发送缓冲区会绕过 tch' 终端 257 字符限制)
谁能帮我!?!?!?!?!