pwnable之unlink

来源:互联网 发布:exe反编译成源码 编辑:程序博客网 时间:2024/05/18 01:38

这个题模仿了堆区分配给用户时候卸下块的方法,存在堆区溢出,输出A的字符溢出覆盖下一个区域B中的内存更改指针。

这题做的时候卡住了,不知道应该多长的字符串合适

然后一开始准备直接让ret时候跳转到system后来发现会覆盖住跳转后的函数所以程序崩溃,于是不知道怎么弄了

http://blog.csdn.net/z231288/article/details/64481130

参考了这个文章发现可以用利用主函数中leave命令,

mov -0x4(%ebp)  %ecx

leave

lea  -0x4(%ecx) %esp

ret

ecx等于ebp-4

esp等于ecx-4

通过这个改变esp从而改变ret时候取eip的位置

也就是说我们将地址写入ebp-4就可以更改esp

由于给了&a的地址所以可以推断出ebp位置是(&a+0x14)那么接下来要写入多少地址那?

a的值指向用户使用的堆的起始地址,所以a的地址加8为shellcode也就是最后esp要在的位置

所以shellcode的地址+4就是要写入的地址,这样和之前崩掉的差别是覆盖的时候后指针变成前指针的时候是将ebp-4写入了shellcode+4避免了覆盖

然后shelcode为需要的地址就好