CSAPP-buflab

cache lab

原函数返回地址—-<
保存的%ebp值(栈帧指针)—-<
缓冲区—-<
缓冲区—-<
。。。。
。。。。
%esp(栈指针)—-<

Level2

image

global_value 是个全局变量,不在栈中,因此需要写一个函数把global_value值改为value

我们现在要找到global_value的地址,发现

0x804d100就是value的地址,0x804d108就是cookie的地址。因此我们想把0x804d100地址所在的数值改为我们的cookie

image

建立p2.s文件

注意x86是data-load 是利用register来完成的

image

把cookie值传到%eax 临时寄存器,然后把寄存器里面的数值传给global_value的地址

最后把bang函数地址压栈,那么原来返回地址就会改为执行bang函数了。

反汇编得到的代码:

image

gdb调试寻找缓冲区的位置,注意缓冲区不是esp-0x38,而是ebp-0x28噢

得到缓冲区首地址为0x55683938

意思就是说返回地址变回缓冲区首地址,然后原函数返回的时候会跳到缓冲区地址,然后开始访问我们自己写的机器代码,实现把global_value值改为cookie的功能。

image

最后结果:

image

level3

是把返回地址改为cookie值,同时不改变原函数压栈情况

因为覆盖栈的时候,会把ebp(基址指针给覆盖掉,所以先记录下基址的地址)

image

汇编代码
我们应该要改变eax的值为cookie,同时把原来getbuf后一条指令的地址压栈

image

然后为了求基址地址,这里折腾了好久,原来要求的不是寄存器本身的值,而是求寄存器指向的值

但why???
image

最后结果:

b8 14 03 aa
65 68 be 8d
04 08 c3 00 <—attack code
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
90 39 68 55 <— address of ebp,to ensure that the original ebp doesn’t change
38 39 68 55 <— initial address of buff zone