CSAPP实验buflab

前言

  buflab-handout文件夹下有需要我们进行攻击的可执行程序bufbomb,有可用于生成userid的makecookie,有进行字符间转化的hex2raw文件,我们需要自己设定一个ID,通过makecookie生成专属的cookie,这个cookie会在下面的几个阶段会用到。
在这里插入图片描述
这里我的userid 是qjl,cookie是0x556c3121.
在这里插入图片描述

level0:

  在level0中要求我们当test函数在调用getbuf函数返回后,返回到smoke函数中,而不是返回到test函数。这道题目其实只需要将调用getbuf函数时传参的返回地址改为smoke函数的开始地址即可。在修改返回地址之前,我们需要知道在哪个地址中保存的返回地址的值。
在这里插入图片描述
  查看getbuf函数,我们看到esp位置在ebp-0x28,距离返回地址有48个字节,查看smoke函数起始地址:
在这里插入图片描述
  所以我们只用修改返回地址为0x08048e0a,我们不能写0xa,因为会被认为是换行符,所以我们就用0x08048e0a的下一个地址0x8048e0b来做替换。前面的44个字节无关紧要,随便写,按小端法写入txt文件,构造level0.txt如下:
在这里插入图片描述
通过level0.

level1:

  本阶段要求是让test函数返回到fizz函数,和level0思路类似,不过这次需要我们多修改一个参数,这里的参数就是我们的cookie了,也就是0x556c3121.
  和level0一样查看fizz:
在这里插入图片描述
  和level0一样前面44个字节随便填,我们只用修改返回地址和传递的参数,45-48处的字节填fizz的地址0x8048daf,49-52处的字节填0x556c3121.
在这里插入图片描述
level1通过。

level2:

  level2给了一个bang函数,和前两关类似,要求我们在执行test的时候不返回test,而是要我们去执行bomb。不过增加一点难度,除了我们要修改返回地址的值,还要我们写一些指令来将global_value的值修改为我的cookie即0x556c3121.
在这里插入图片描述
还是先找到bang函数开始的地址:0x8048d52
在这里插入图片描述
我们要修改global_value的值先要找到位置global_value和cookie的位置:
在这里插入图片描述
  global_value地址为0x804d10c,cookie的地址为0x0804d104。到这一步我们就找到要修改的值了,接下来就需要我们写一些指令将global_value 的值改成我们的cookie
在这里插入图片描述
在这里插入图片描述
  机器码的作用是执行到它时,修改全局变量的值并进入bang函数,执行getbuf函数的时候修改返回地址,使getbuf执行完毕后,继续执行这个函数,执行完这个函数就自动执行bang函数,完成了题目的要求。
  我们可以通过在gdb中设置断点来查看我们要修改后的返回地址的值:
在这里插入图片描述
所以修改后的返回地址的值应该是0x55683238.编写level2.txt:
在这里插入图片描述
在这里插入图片描述
level2通过。

level3:

  题目要求:不同于之前跳入其他函数,在本任务中我们希望getbuf() 结束后回到test()原本的位置,并将我们的cookie作为getbuf()的返回值传给test()。还要让saved ebp被复原,这样一来原程序就完全不会因为外部攻击而出错崩溃,也就是退出攻击后要保证栈空间还原,使test()察觉不到我们干了什么。
  我们可以看到getbuf() 在0x8048e4b被执行因此正确的跳转地址为0x8048e50
在这里插入图片描述
  因为要还原栈帧,我们必须知道在调用getbuf()之前的原始ebp的值,这里使用gdb调试来获取,可以在0x8048e4b设置断点,然后查看进入getbuf之前的%ebp寄存器值,这里我们得到的旧的ebp的值为0x55683290,如下:
在这里插入图片描述
  知道了旧的ebp寄存器和正确的返回地址,接下来就是通过自己构造攻击代码实施攻击。
  构造level3.s如下:
在这里插入图片描述
  通过movl指令将cookie值传给%eax以返回给test(),然后使得程序跳转到test()中call getbuf下一条指令正常返回,但是并不在这里处理ebp寄存器问题,而是通过在攻击字符串里面设置ebp寄存器使得其还原为旧ebp。再进行编译得到机器码:

在这里插入图片描述
到此我们可以构造攻击文件level3.txt了:
在这里插入图片描述
level3通过。

level4:

  题目要求:在这个阶段我们需要使用bufbomb可执行文件的参数-n,此题要求调用testn(),testn()又调getbufn()。因为在本题栈地址是动态的,每次都不一样,bufbomb会连续要我们输入5次字符串,每次都调用getbufn(),每次的栈地址都不一样,所以我们将不能再使用原来用gdb调试的方法来求%ebp的地址了。
  查看getbufn:
在这里插入图片描述
  我们可以看到buf的首地址是ebp-0x208,总共520个字节,尽管testn和ebp每次都要随着输入变化而变化,但是我们发现esp位置不变,所以我们按这个思路解题。在sub $0x218,%esp设置断点,-n运行bufbomb,查看ebp的值:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
至此我们可以知道写字符串的首地址是ebp-0x208=0x556832d0-0x208=0x556830c8,通过提供的样例得知,我们可以用nop空指令来使程序滑到我们要跳转的位置。
在这里插入图片描述
  我们可以得到ebp=esp+0x24+0x4,因为esp一直是不变的,所以我们可以通过esp+0x28来修改正确的ebp的值,所以我们就得到了getbufn的返回地址为0x8048ce2,构造汇编代码:第一行修改返回值,改为我的cookie,第二行修改ebp,第三行修改要求的返回地址。
在这里插入图片描述
查看机器码:
在这里插入图片描述
至此,我们可以构造攻击文件level4.txt:
在这里插入图片描述
在这里插入图片描述
level4通过。

实验结果

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值