我知道有一些技巧和提示,但详尽的列表肯定会在这里有所帮助。
#1 楼
通过程序输入注入有效载荷和十六进制地址取决于您获得的输入类型。这是所有可能的输入的列表,以及在纯Shell环境中以及从gdb
内进行输入的方式。从
char *argv[]
获取输入在这种情况下,参数是从初始命令行读取的,所以最方便的方法是:
$> ./program $(python -c 'print("\xef\xbe\xad\xde")')
在
gdb
中,您需要将参数传递给run
像这样的命令行:(gdb) run $(python -c 'print("\xef\xbe\xad\xde")')
从文件中获取输入
这里,您别无选择,只能写入文件然后输入带有以下文件的程序如下所示: br />然后,在
gdb
之外,您可以重写文件的内容并在gdb
中一次又一次地运行程序。从
gdb
中获取输入通过
stdin
获取输入可以通过多种功能来实现,例如q43120 79q,stdin
,fgets()
,scanf()
等。这引起了一些问题,因为程序在执行时停止并等待输入字符。而且,您宁愿刚开始时只使用一个提要来尝试您的东西并查看结果。让我们看一下如何处理此输入。如果必须处理多个输入(例如,登录名,密码等),则需要在输入之间使用分隔符。通常,每个输入之间的分隔符只是换行符(
getline()
或read()
,取决于您所使用的系统)。现在,您有两种方法来输入
\n
。您要么浏览文件,例如:$> ./program ./myfile.txt
\r
要求通过以下文件运行命令:(gdb) run myfile.txt
并按照前面的案例进行操作。
另一个选择是将命令的输出通过管道传递到程序的
stdin
,如下所示:$> cat ./mycommands.txt | ./program
在
stdin
中,您可以使用stdin
进程替换gdb
技巧:(gdb) run < ./mycommands.txt
这种方法比有效地创建命名管道并按照几个网站的建议在其上分支程序要快得多。在
bash
外部创建命名管道需要大量不必要的步骤,您可以使用先前的技术立即使用它。还请注意,有些人正在使用
<(cmd)
,例如:$> python -c 'print("\xef\xbe\xad\xde")' | ./program
但是,这最后一种技术似乎可以过滤掉所有NULL字节(无论出于何种原因),因此您应该首选第一个(特别是如果要传递NULL字节)。
从网络中获取输入信息
在这里,您需要使用另一个名为
gdb
(瑞士军刀的网络刀)的工具,通常缩写为<<$(cmd)
。基本上,如果您的漏洞程序正在netcat
上侦听,则命令行将为:(gdb) run < <(python -c 'print("\xef\xbe\xad\xde")')
在
nc
内,关键是运行(localhost:666
)该程序并从另一个终端连接到它。注入后将
gdb
保持打开状态大多数用于
r
的技术都会将漏洞利用字符串发送到程序,该字符串将在终止后不久终止输入的使其保持打开状态并获得活动外壳的最佳方法是在其stdin
上添加一个stdin
等待输入。如果要查看文件,它应该看起来像这样:(gdb) run <<< $(python -c 'print("\xef\xbe\xad\xde")')
或者,如果您想要一个shell命令,就这样:
$> python -c 'print("\xef\xbe\xad\xde")' | nc -vv localhost 666
或者,最后,如果您正在通过网络访问:
$> (cat ./mycommands.txt; cat) | ./program
请注意,我没有找到如何使用
cat
来保持有效负载交付后,输入打开。
评论
谢谢,这对我真的很有帮助。我正在寻找一种将Shell代码传递给fgetc之类的函数的方法。首先,我得到了/ bin / bash:警告:当使用(gdb)r <<(python exploit.py)时,第0行的here-document以文件结尾(想要的python)定界。为了解决这个问题,我按照答案stackoverflow.com/questions/18660798/…的建议从python脚本的末尾删除了空格。现在它可以工作了:-)
–粉色
19年11月30日在21:03