C 通过接受用户输入覆盖内存中的值

C 通过接受用户输入覆盖内存中的值,c,stack-smash,C,Stack Smash,这与堆栈粉碎攻击有关 基本上,我试图通过给程序一个特定的输入来打破堆栈。程序使用getchar接收如下用户输入: for (i = 0; (c = getchar()) != '\n'; i++) buf[i] = c; 我想覆盖内存,使其成为0x000000a1。不幸的是,0xa1不是ascii字符,因此我不能只输入类似于(倒惊叹号)的内容,因为这样会在内存中产生0x0000a1c2。如何在不更改程序中处理用户输入的方式的情况下将值改写为仅为0x000000a1 echo -e '\xA1'

这与堆栈粉碎攻击有关

基本上,我试图通过给程序一个特定的输入来打破堆栈。程序使用
getchar
接收如下用户输入:

for (i = 0; (c = getchar()) != '\n'; i++) buf[i] = c;

我想覆盖内存,使其成为
0x000000a1
。不幸的是,
0xa1
不是ascii字符,因此我不能只输入类似于
(倒惊叹号)的内容,因为这样会在内存中产生
0x0000a1c2
。如何在不更改程序中处理用户输入的方式的情况下将值改写为仅为
0x000000a1

echo -e '\xA1' | /path/to/program
您可以添加额外的输入,将回音放入循环中,等等

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;
}

$
是终端的提示)

类似于
int main(){putchar(0xa1);putchar('\n');}
?@MikeCAT感谢您的回复。为了进一步澄清,我的意思是我只能向程序提供输入。程序运行时会询问“输入字符串”,然后使用
getchar
读取输入。但是我找不到对应于
0xa1
…的字符,因此我无法通过编程更改程序。我也没有提到这一点,但我最多只能使用文本文件进行输入。无论如何谢谢你的帮助@umopapisdn
0xa1
代表Shift JIS编码的文本文件中的
。你应该能够使用它!事实上,你是怎么发现这个角色的?当我进行搜索时,我只能找到倒过来的感叹号,实际上是
0xc2a1
我在二进制编辑器(TSXBIN)中输入了
a10a
,并用文本编辑器(SAKURA编辑器)打开了该文件。方便的技巧…感谢您的帮助!下次我会记住的
$ ./b.out | ./a.out