BUUCTF-PWN ciscn_2019_final_5(临界条件错误,劫持GOT表项)

该博客详细分析了一个名为'ciscn_2019_final_5'的PWN挑战,讨论了没有PIE和partial relro的情况。博主发现通过特定条件可以修改GOT表,特别是在index为16时,可以利用内存分配漏洞伪造chunk头部。漏洞利用部分描述了如何添加和释放note,修改内存布局,最终控制程序执行以实现puts@plt的泄露和system调用,从而获得shell。
摘要由CSDN通过智能技术生成

题目分析

例行安全检查
在这里插入图片描述
没有PIE,方面调试
partial relro意味着这题应该直接改GOT表就能做
菜单:
在这里插入图片描述
没有show功能,可以考虑吧某个函数(比如free的GOT)改为puts@plt
可以申请17个chunk,编号为0-16
在这里插入图片描述
每次分配结束后会显示分配内存的低12bits
在这里插入图片描述
而本题中还有一个特殊的地方,就是content数组(0x6020e0)里面放的地址是按照顺序放入的,而不是编号为i的就放在content[i],所以地址的最低4个字节就用来存放编号了
在这里插入图片描述
在删除或者编辑的时候,就会依次遍历每个地址,对比index
在这里插入图片描述

漏洞分析

如上所说,本题地址存放比较特别,但是如果index为16,并且原地址第五位为0,就会导致地址被修改
而我们第一次申请时候地址最低12bits一般为0x260,即0010 0110 0000,和16即0001 0000或,就变成了0010 0111 0000即为0x270,我们就可以在chunk0的content中伪造一个chunk头部,把它释放之后再申请我们就能利用它控制下一个chunk了

漏洞利用

  1. 添加一个note[0],编号为16,size为0x10,内容为p64(0)+p64(0x91),再添加一个note[1],编号为1,size为0xc0(这个大小正好可以包括住content和size数组)
  2. 释放note[0]和note[1],重新申请一个0x80大小的note[2],把note[1]头部size改为0x21,fd改为content数组0x6020e0
  3. 申请一个0xc0大小的note[3],再申请同样大小的note[4],填入free_got, puts_got+1和atoi_got-4,大小全部设为0x10
  4. 先把free_got改为puts@plt(edit 8——free@got&0xf=8,atoi@got&0xf=8,所以需要减4),然后delete(1)泄露puts地址
  5. edit 4把system地址写入,然后发送/bin/sh\x00即可

Exp

from pwn import *

r = remote("node3.buuoj.cn", 27223)
#r = process("./ciscn_2019_final_5/ciscn_2019_final_5")

context.log_level = 'debug'
DEBUG = 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值