使用缓冲区溢出来打印特定文本

时间:2015-03-28 06:55:17

标签: c

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(int argc, char *argv[]){
   char a[5];
   char b[10];
   strcpy(a,"nop");
   gets(b);
   printf("Hello there %s. Value in a is %s.\n",b,a);
   exit(0);
}

我需要让程序打印Hello there Leslie. Value in a is Correct.

我尝试在程序中执行任意输入,但我似乎无法忽略某些输入。例如,如果我运行程序并输入:

Leslie\\\\Correct

程序将输出Hello there Leslie\\\\Correct. Value in a is Correct.如何使用缓冲区溢出从第一部分中删除\\\\Correct

2 个答案:

答案 0 :(得分:3)

%s查找空终止字符,即&#39; \ 0&#39;为了知道字符串何时结束。所以你需要输入&#34; Leslie \ 0 ---正确&#34;获得所需的格式。获取将在输入的末尾添加另一个\0,因此您需要记住这不是真正导致BO ... 抱歉格式不好,我在手机上。

答案 1 :(得分:0)

这是关于在终端中键入null字符。 以下内容适用于我的计算机(尽管我必须更改代码以使b存储在低于a的地址中),但我们假设您的代码有效:

./bufferovfl
Leslie(press ctrl+@)AAAAACorrect
       |.........|  |...|
            |         |
       the Null      any characters but with right repetition to overwrite [a] 
       character     starting with the C

Leslie末尾添加空字符,函数gets将仅将该部分存储在变量b中,但将继续写入下一个地址并最终覆盖变量{ {1}}。

如果此组合(a + ctrl)失败,您可能还需要查看this文章。