9

我有一个看起来像这样的程序:

/* buf_overflow.c */
#include <stdio.h>
int main(){
    char buf[4];
    char exploit_buf[4];
    fgets(buf, 4, stdin);
    gets(exploit_buf);
    printf("exploit_buf: %s\n", exploit_buf);
    return 0;
}

我将使用“gets”函数的漏洞来缓冲溢出一些其他变量。我要写入“exploit_buf”的值是“AAAAAAAA\x01\x00\x00\x00”,但我不知道如何将 ASCII 码“01”和“00”发送到exploit_buf。

我知道使用这个命令“printf "AAAAAAA\x01\x00\x00\x00"”可以输入我想要的字符,但我不知道如何将它们发送到exploit_buf。我也知道 Alt+(键盘右侧的数字键)可以从我输入的 ASCII 码生成字符,但这在我的程序中也不起作用。

主要问题是“我怎样才能跳过第一个函数“fgets()”并在“gets()”中键入任意 ASCII 码”。

任何人都知道如何在 linux 的命令行中输入任意 ASCII 码?

4

4 回答 4

15

您可以使用echo -e

$ echo -ne 'AAAAAAAA\x01\x00\x00\x00' | python -c 'import sys; print repr(sys.stdin.read())'
'AAAAAAAA\x01\x00\x00\x00'

-e允许echo解释转义码,并-n抑制尾随换行符。

请注意,Python 程序会打印出它接收到的字符串表示形式,这正是我们使用echo.

对于更复杂的漏洞利用字符串,简单地使用 Perl 或 Python 直接构建漏洞利用字符串并不少见:

$ perl -e 'print "A" x 1024 . "\0\0\0\1"' | ./buf_overflow
于 2013-03-09T07:07:15.733 回答
9

在终端中键入以下命令。

echo $'\000\001' > file1

这会将 ASCII 字符 1 和 ASCII 字符 2 的值保存到名为 file1 的文件中。现在你可以将它读入你的缓冲区exploit_buf。

于 2013-03-09T07:15:23.437 回答
0

来自 nneonneo 的好例子。

但是,如果您希望在没有脚本帮助的情况下直接输入它们,您可以更改您的键盘配置以使用“美国国际(AltGr 死键)”模式(在系统 -> 首选项 -> 键盘 -> 布局下),那么您可以使用使用右 alt 按钮可以轻松地使用特殊符号。示例 - é 是 rAlt+e。° 是 rAlt-shift-0-0(按住其他按钮的同时按 0 两次)。

于 2013-03-09T07:11:46.137 回答
0

由于它只是从标准输入中获取输入,因此您可以将您的输出通过管道传输printf到其中:

printf 'whatever' | myprogram
于 2013-03-09T08:45:08.953 回答