level4
前面4个level都是栈基址是固定的,所以我们可以猜测到栈帧的结构进行覆盖篡改,这一关就是引入了缓冲区溢出攻击的一种保护措施,就是栈基址随机化,让栈基址不可以猜测,我们来实施缓冲区溢出攻击,那么我们就要用到nop雪橇了。nop只是执行eip自加1不进行其他的操作。在我们无法猜测的时候,只需要找到最大的地址,然后前面用nop雪橇那么只要在nop段中都会自动划入。
这一level用的不再是getbuf而是getbufn,和testn,都是为了随机化栈基址。这一level运行bufbomb时要用到参数-n模式下。另外要求输入5次连续相同的string,我们需要借助一个不同的指令来完成这个输入。
也就是批量输入
首先来看一下getbufn函数的汇编代码:
可以看到buf的首地址为-0x208(%ebp)为十进制520个字节大小。
在这一level中每次运行testn的ebp都不同,所以每次getbufn里面保存的test的ebp也是随机的,但是栈顶的esp是不变的,我们就要找到每次随机的ebp与esp之间的关系来恢复ebp。我们先通过调试来看一下getbuf里面保存的ebp的值的随机范围为多少。
我们在0x8049247处设置断点,注意与前面不同的是设置为-n模式,然后每次输入一次string来看一下ebp的值,然后continue,再次输入,一共输入5次。
ebp的值 减去0x208为buf的首地址
0x55683270 0x55683068
0x556832c0 0x556830b8
0x55683280 0x55683078
0x55683290 0x55683088
0x556832f0 0x556830e8
接下来再来看一下testn的反汇编代码:
这里我们可以看到,call getbufn的下一条指令的地址为0x8048ce2
还可以看到,mov %esp,%ebp 此时esp和ebp相等
push %ebx 此时ebp=esp+0x4
sub $0x24,%esp 这个时候执行完后,ebp=esp+0x28,这就是esp和ebp每次的变化关系,通过esp来恢复我们的每次的ebp
我们首先来编写我们的exploit代码:
接下来生成我们的字节码
接下来构造我们的level4.txt exploit sting
另外一种:可见lea和mov的顺序是不影响的