我正在尝试对类分配的程序执行缓冲区溢出攻击。攻击程序以及易受攻击的程序都是由我编写的。
易受攻击的代码使用scanf
从stdin读取数据。
./vulnerable < malicious_payload_file.txt
运行正常。
more malicious_payload | ./vulnerable
和echo JUNK_JUNK_JUNK_JUNK | ./vulnerable
也可以正常运作。
但是,我想使用攻击程序继续提供更长的有效负载,直到程序崩溃。所以,我需要动态生成更大的有效载荷。我正在使用system ("./vulnerable");
重复调用并测试异常退出。
如何指定此类有效负载?
有没有办法运行./vulnerable < malicious_payload_binary
或以某种方式运行,以便我不必将恶意有效负载放在文件中,但可以在命令行中指定它?
答案 0 :(得分:8)
这个怎么样?
echo "your payload goes here" | ./vulnerable
您可以将echo
命令替换为生成所需输入./vulnerable的任何命令。一个这样的例子是不断的垃圾流作为输入,你可以这样做:
cat /dev/urandom | ./vulnerable
答案 1 :(得分:2)
您可以尝试使用popen
代替system
,而不是尝试使用命令行:
FILE *fp = popen("./vulnerable", "w");
// write stuff to fp -- it goes to vulnerable's stdin
int exitcode = pclose(fp);
你从pclose
获得的exitcode与从system
获得的exitcode相同,如果你使用另一个进程来创建数据并通过shell将其传输到./vulnerable
答案 2 :(得分:0)
尝试使用管道而不是重定向:
./malicious_payload_binary | ./vulnerable
答案 3 :(得分: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
<强> OLD:强>
正如dolphy所提到的,只需写入malicious_payload_binary
中的stdout,从vulnerable
中的标准输入读取,并用管道连接它们:./malicious_payload_binary | ./vulnerable