ciscn2021初赛pwn部分wp

ciscn2021初赛

感谢wepn的队友
Column: May 17, 2021

pwny:

首先ida看一眼发现read文件描述符全是3, 好像是读个随机数, 然后我们在3的地址上连着用Write读两次就可以把他变成0, 就可以写入内存了, 后面就是数组越界写, 负数可以往前面读读出libc偏移和pie偏移, 在得到libc之后可以获得环境变量environ的地址, 之后通过(libc_base+libc.sym[‘environ’]-pie_base-0x202060)/8, 就可以得到其位置是数组的第几号元素, 然后调用Read()读取栈地址, 之后由于main函数不存在返回函数, 我们需要使用其它函数这里我用的Read(),

这俩一减, 然后再和上面类似就可以算出Read()的ret在数组上为第几号元素, 这样在下次的Write()中可以直接写入ret的地址了(ps. 这里的偏移也要动态调试, 反正到最后也是固定的), 之后在ret上嗯写onegadget就行了

exp:
在这里插入图片描述在这里插入图片描述

lonelywolf:

和下面的silverwolf差不多吧, 能做出下面的肯定能做出上面的, 这题我用的方法是通过scanf将fastbin写入unsortedbin中然后泄露libc, 之后改改tc结构和chunk的tc就结束了,简单题嘞~

exp:
在这里插入图片描述在这里插入图片描述

silverwolf:

属于是现学现卖的orw + srop了, wiki上怎么没有教!(呜呜呜)

在libc方面突然上一题的泄露方法不行了, 就尝试用unsortedbin泄露, 但是只有tc的结构是符合大小的chunk, 于是就让某tc指向tc头, 然后全释放了, 之后uaf修改一些fastbin大小的tc数量, 再申请fastbin大小的chunk就优先从unsortedbin中分割, 以此打印泄露出libc

之后这道题因为开启了沙箱保护只能用read,write,open的系统调用,于是就要构造个rop链open+read+write, 打开文件后读入再读出就行了
在这里插入图片描述

之后的话利用写srop的函数SigreturnFrame()构造好frame, 除了它rip的地方会在glibc2.27下的setcontext变成cx并且被push, 之后根据这个shellcode1可以让我们下一次输入变为直接call的shellcode, 但是堆布局可能也比较麻烦(绕进去的话),使用尽可能简洁明了的堆布局即可, 之后在free_hook的位置写入context+53并且后面0x10个字节写入free_hook+0x18的地址, 再在再后面的8字节(即free_hook+0x18)写入shellcode1, 从而使得下次输入直接call就行, 而下次的call应该算是固定的orw写法了, 直接看下面的exp就好.

在这里插入图片描述

回到上面的setcontext, 其目的是使得指定地址改变权限, 由于是被我们写在free_hook中的调用, 所以要记得free好我们之前设置的frame, 其地址会被作为rdi传入, 而其它寄存器之后的赋值也是靠着rdi为基址计算的, 所以之前布置frame布置不好的话, 可以一边动调一遍布置.

最后直接写入我们之前的rop链(shellcode2)即可

exp:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/eeeeeight/article/details/116937672