通过接受用户输入覆盖内存中的值
Overwrite value in memory by taking in user input
这与堆栈粉碎攻击有关。
基本上,我试图通过为程序提供特定输入来粉碎堆栈。该程序接受这样的用户输入,使用 getchar
:
for (i = 0; (c = getchar()) != '\n'; i++) buf[i] = c;
我想覆盖内存变成0x000000a1
。不幸的是,0xa1
不是 ascii 字符,所以我不能只输入 ¡
(倒置感叹号)之类的东西,因为这最终会在内存中给出 0x0000a1c2
。如何在不更改程序中处理用户输入的方式的情况下将值覆盖为 0x000000a1
?
您可以使用bash注入任意字符:
echo -e '\xA1' | /path/to/program
您可以添加额外的输入,将 echo 放入循环等。
echo -e 'Something\xA1\xA1\xA1' | /path/to/program
没有提供您系统的信息,但通常标准输入只是一个字节流。这意味着您可以发送任意字节流,而不仅仅是有效字符。
例如,如果您的受害程序是 ./a.out
,您可以创建一个程序来发出有效载荷
#include <stdio.h>
int main(void) {
putchar(0xa1);
putchar('\n'); /* to have the victim finish reading input */
return 0;
}
并编译为 ./b.out
并使用管道执行
$ ./b.out | ./a.out
($
是您终端的提示符)
这与堆栈粉碎攻击有关。
基本上,我试图通过为程序提供特定输入来粉碎堆栈。该程序接受这样的用户输入,使用 getchar
:
for (i = 0; (c = getchar()) != '\n'; i++) buf[i] = c;
我想覆盖内存变成0x000000a1
。不幸的是,0xa1
不是 ascii 字符,所以我不能只输入 ¡
(倒置感叹号)之类的东西,因为这最终会在内存中给出 0x0000a1c2
。如何在不更改程序中处理用户输入的方式的情况下将值覆盖为 0x000000a1
?
您可以使用bash注入任意字符:
echo -e '\xA1' | /path/to/program
您可以添加额外的输入,将 echo 放入循环等。
echo -e 'Something\xA1\xA1\xA1' | /path/to/program
没有提供您系统的信息,但通常标准输入只是一个字节流。这意味着您可以发送任意字节流,而不仅仅是有效字符。
例如,如果您的受害程序是 ./a.out
,您可以创建一个程序来发出有效载荷
#include <stdio.h>
int main(void) {
putchar(0xa1);
putchar('\n'); /* to have the victim finish reading input */
return 0;
}
并编译为 ./b.out
并使用管道执行
$ ./b.out | ./a.out
($
是您终端的提示符)