unlink
|
|
0x01
这题是比较经典的链表unlink题目,其中unlink的代码如下:
之前我们学到的malloc中的bin在删除链表节点时有很多限制,比如会比较FD->bk == BK->fd
之类的检查,这里的unlink只需要FD->bk,BK->fd指向的地址是可写的。
0x02 leak
题目帮忙leak好了 &A 和 A 的地址~
0x3 思路
我的想法是通过leak的A_addr算好main的ret_addr,然后把void shell的地址存入‘栈’中即可。不过此‘栈’非彼‘栈’,这里需要使用一个技巧,就是我们是无法向栈里面写入shell_addr的,因为unlink时要求写入的地址所指向的内存是可写的,但是shell_addr明显是text段,是readonly的,所以是无法通过unlink将shell_addr写入栈中的;但是转变思路,既然我们无法向栈中写入shellcode,那么我们能不能改变栈的位置呢?比如把ebp指向特定位置,使得栈的位置发生改变,那么相对来说,就是将shellcode写到了栈中去了。
0x4 exploit
查看汇编代码
|
|
可以发现&A=ebp-0x14,根据leak出来的地址,我们可以得到:ebp = &A+0x14。这样我们就可以构造我们的playload了。
这里有一个关键的东西就是,还是要根据具体程序的代码来选择漏洞利用方式,不同于前面applestore,这里的在leave 之后,程序就要退出了,没有多层的调用,所以ebp不能再次使用,无法改变变量或者栈中其他的值。
但是,这是一个题目嘛,总会有解决办法的。
|
|
我们查看main函数最后几行汇编代码,结合动态调试,我们发现 ecx = [ebp-0x4],然后后面esp=[ecx-0x4],这样我们控制ebp+0x4这里的内存就可以控制ecx的值,然后控制esp,从而在ret时返回到我们的shellcode上。
playload的构造
注意:
unlink修改的内存是FD->bk和BK->fd,也就是FD+4和BK+0,这里有一定的偏移。
注意栈的方向是和正常内存不一样的,所以esp的设置应该大于返回地址。