5

我正在尝试对课程分配的程序执行缓冲区溢出攻击。攻击程序和易受攻击的程序都是我编写的。

易受攻击的代码用于scanf从标准输入读取数据。

./vulnerable < malicious_payload_file.txt工作正常。 more malicious_payload | ./vulnerable并且echo JUNK_JUNK_JUNK_JUNK | ./vulnerable也可以按预期工作。

但是,我想使用攻击程序来不断提供更长的有效载荷,直到程序崩溃。所以,我需要动态生成更大的垃圾有效载荷。我system ("./vulnerable");用来反复调用和测试异常退出。

如何指定这样的有效载荷?

有没有办法运行./vulnerable < malicious_payload_binary或以某种方式运行,这样我就不必将恶意有效负载放在文件中,而是可以在命令行中指定它?

4

4 回答 4

9

这个怎么样?

echo "your payload goes here" | ./vulnerable

您可以将该echo命令替换为生成所需的 ./vulnerable 输入的任何命令。一个这样的例子是将垃圾作为输入的恒定流,您可以这样做:

cat /dev/urandom | ./vulnerable
于 2011-07-27T15:53:35.470 回答
2

与其尝试使用命令行,不如尝试使用popen而不是system

FILE *fp = popen("./vulnerable", "w");
// write stuff to fp -- it goes to vulnerable's stdin
int exitcode = pclose(fp);

如果您使用另一个进程创建数据并通过 shell 将其通过管道传输到 ./vulnerable,您从中获得的退出代码pclose与您将获得的退出代码相同system

于 2011-07-27T16:46:56.973 回答
0

尝试管道而不是重定向:

./malicious_payload_binary | ./vulnerable
于 2011-07-27T15:54:01.347 回答
0

编辑:我想我终于明白了你的问题(也许),你想阅读命令行参数吗?就像是

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("the name of this program is %s\n", argv[0]);
    printf("%d command line arguments were provided\n", argc);
    printf("the input file is %s\n", argv[1]);
    // could do something like: fopen(argv[1]) here
    return 0;
}

如果将其编译为名为的二进制文件stdintest并像这样运行它:

./stdintest somefile.txt

它将输出:

the name of this program is ./stdintest
2 command line arguments were provided
the input file is somefile.txt

老的:

正如 dolphy 所提到的,只需写入 stdout in malicious_payload_binary,从 stdin in 读取vulnerable,然后用管道连接它们:./malicious_payload_binary | ./vulnerable

于 2011-07-27T15:56:22.157 回答