cache lab
原函数返回地址—-<
保存的%ebp值(栈帧指针)—-<
缓冲区—-<
缓冲区—-<
。。。。
。。。。
%esp(栈指针)—-<
Level2
global_value 是个全局变量,不在栈中,因此需要写一个函数把global_value值改为value
我们现在要找到global_value的地址,发现
0x804d100就是value的地址,0x804d108就是cookie的地址。因此我们想把0x804d100地址所在的数值改为我们的cookie
建立p2.s文件
注意x86是data-load 是利用register来完成的
把cookie值传到%eax 临时寄存器,然后把寄存器里面的数值传给global_value的地址
最后把bang函数地址压栈,那么原来返回地址就会改为执行bang函数了。
反汇编得到的代码:
gdb调试寻找缓冲区的位置,注意缓冲区不是esp-0x38,而是ebp-0x28噢
得到缓冲区首地址为0x55683938
意思就是说返回地址变回缓冲区首地址,然后原函数返回的时候会跳到缓冲区地址,然后开始访问我们自己写的机器代码,实现把global_value值改为cookie的功能。
最后结果:
level3
是把返回地址改为cookie值,同时不改变原函数压栈情况
因为覆盖栈的时候,会把ebp(基址指针给覆盖掉,所以先记录下基址的地址)
汇编代码
我们应该要改变eax的值为cookie,同时把原来getbuf后一条指令的地址压栈
然后为了求基址地址,这里折腾了好久,原来要求的不是寄存器本身的值,而是求寄存器指向的值
但why???
最后结果:
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