首页 > 其他分享 >init_array与got劫持——[zer0pts 2020]easy strcmp

init_array与got劫持——[zer0pts 2020]easy strcmp

时间:2024-06-09 22:54:52浏览次数:23  
标签:函数 zer0pts 地址 init 2020 GOT array strcmp

只是在顺思路,wp参考了2位大佬

文章列表 | NSSCTF

[Zer0pts2020]easy strcmp 分析与加法-CSDN博客

题目

Die

 虚拟机运行一下

 没有输入,直接报错退出了

IDA

 很奇怪啊,就是一个比较

从我们运行直接报错来看,我们运行时a1>1这个条件是不成立的

我的最初思路就是调试把a1改了或者把判断汇编指令改了,让我进入if里面看看

IDA动调

下好断点

 改汇编

 F8到strcmp,继续F8,出现一个弹窗

 55BB41600714:得到 SIGSEGV 信号(分段违规)(exc.code b,tid 4929)

点击OK,跳到了一个地方

 F5

 这个函数进行了一个简单的每位相减操作,这里应该就是加密函数,加密后的数据要与zer0pts{********CENSORED********}相等

如果是解题的话,思路不是很难

真正让我思考的是NSSCTF师傅的几行字—— 这道题的考点与原理是什么?

知识点

1. init_array

  • init_array 是一个段(section),在很多操作系统和编译器中,这个段会包含程序启动时需要执行的一些初始化函数。
  • 当一个程序启动时,操作系统或运行时会依次调用这些函数。开发者可以把一些初始化代码放在这些函数中,以便在主程序(main函数)运行之前执行。

2. GOT劫持

  • GOT 全称是 Global Offset Table(全局偏移表),它是用来实现动态链接库(DLL)的一种机制。
  • 在程序运行时,函数的实际地址会被加载到 GOT 中。每次调用动态链接库中的函数时,程序会通过 GOT 找到函数的实际地址。
  • GOT劫持 是一种常见的攻击技术,通过修改 GOT 中的函数地址,将其指向攻击者的代码,从而劫持函数的执行流。例如,将一个常用函数(如 strcmp)的地址改为攻击者的代码地址。

解题思路

1. 在init_array中hook了strcmp

  • hook 是一种技术,允许开发者或攻击者拦截并替换函数的执行。在这个题目中,通过修改 init_array 段中的某个初始化函数,将 strcmp 函数进行 hook(拦截)。
  • 具体来说,可能是程序在初始化时,修改了 GOT 中 strcmp 的地址,将其指向一个自定义的函数。

2. 分析hook代码,得到flag

  • 需要找到并分析这个自定义的函数,看看它如何拦截 strcmp 的调用。
  • 通常,这个自定义的函数会包含一些逻辑,用于检查输入或直接返回某个特定的值(如 flag)。
  • 通过逆向分析这个自定义函数,理解它的行为,从而找出程序隐藏的 flag。

那看看init函数

 发现for循环里面,将funcs_889地址作为指针,进行调用

这里刚好就是init_array

(题外话:我搜索了一下IDA中怎么找init_array,但是只找到安卓的教程,知道的师傅可以告诉我吗?)

第一个sub_6E0,追踪进去没什么东西,重点在第二个sub_795

 它把strcmp的地址赋给了qword_201090

 

这个qword_201090有没有觉得很熟悉?

 所以return中进行的才是真正的比较函数,这也再次坐实了a1就是加密后的数据,a2就是zer0pts{********CENSORED********}——加密后的数据与其比较

接下来看看strcmp在got表中的地址:00000000002010B0

 

接着红框里的代码,sub_6EA就是加密函数

off_201028在IDA中其实就等于00000000002010B0

不过不知道也没事,跟踪一下off_201028

 off_201028在_got_plt中原本应该指向strcmp的地址,但是在sub_795被改成指向加密函数sub_6EA

 

 到这里我才完全搞懂了大佬说的知识点与解题思路是什么意思——在初始化的时候,init_array中调用sub_795,将原本在got_plt中存放strcmp的地址改成sub_6EA,而真正的strcmp变成了qword_201090

 

EXP

cipher = bytearray(b"zer0pts{********CENSORED********}")
key = [
    0, 
    4686632258374338882, 
    796841318371695088, 
    5695428477452625963, 
    0
]

# 将 cipher 视为 unsigned long long 的数组
for i in range(5):
    # 将前8个字节转换为 unsigned long long
    value = int.from_bytes(cipher[i*8:(i+1)*8], 'little')
    # 进行加法操作
    value += key[i]
    # 将结果转换回字节并存入 cipher
    cipher[i*8:(i+1)*8] = value.to_bytes(8, 'little')

print(cipher.decode())

flag

zer0pts{l3ts_m4k3_4_DETOUR_t0d4y}

标签:函数,zer0pts,地址,init,2020,GOT,array,strcmp
From: https://www.cnblogs.com/demo41/p/18240201

相关文章

  • Kotlin可空类型与非空类型以及`lateinit` 的作用
    Kotlin可空类型与非空类型以及lateinit的作用在Kotlin中,变量可以是可空类型或非空类型。可空类型表示变量可以包含一个空值(null),而非空类型表示变量不能包含空值。可空类型与非空类型非空类型:默认情况下,Kotlin中的变量是非空类型。例如,varrecyclerView:RecyclerView表......
  • P7219 [JOISC2020] 星座 3 题解
    会发现题目的坐标其实是平面直角坐标系。我们按\(y\)坐标从小到大考虑所有的星星,假设当前考虑到了星星\(i\)。我们先计算出之前所有能够影响到\(i\)的星星的代价和为\(cost\)(可以用树状数组维护)。然后分类讨论。若\(c_i\lecost\),那么肯定直接将\(i\)直接涂黑,因为它更......
  • [COCI2020-2021#2] Sjekira 题解
    题目大意:把一棵树完全分解,每次分解一条边的代价是这条边连接的两个连通块的最大点权之和,求最小代价。逆序模拟,既然题目要求将树完全分解,那我们就每次逆序连接当前权值最小的两个点,也就是贪心的思路。尝试将贪心的值写成一个表达式:$$\sum_{i=1}^na_i+\sum_{(u,v)\inE}\max(a......
  • 网鼎杯 2020 玄武组 SSRFMe
    复习一下常见的redis主从复制主要是redis伪服务器的选择和一些小坑点<?phpfunctioncheck_inner_ip($url){$match_result=preg_match('/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/',$url);if(!$match_result){die('urlfomaterror......
  • codeforces 1442 D Codeforces Round 681 (Div. 1, based on VK Cup 2019-2020 - Fina
    链接大意就是给你n组物品,这n组物品里面每组有\(t_i\)个,且他们是按照价值不降的顺序排列的。现在允许取k个物品,每个物品必须取在数组的开头处,每个物品在被取用后就会消失。问你最大能够拿到多少价值的物品。其中\(n,k\leq1500,\sumt_i\leq1e6,a_i\leq1e8\)很背包吧。可......
  • BeanDefinition的资源定位过程
    正文当我们传入一个Spring配置文件去实例化FileSystemXmlApplicationContext时,可以看一下它的构造方法都做了什么。/***下面这4个构造方法都调用了第5个构造方法*@paramconfigLocation*@throwsBeansException*///configLocation包含了BeanDefiniti......
  • k8s配置节点亲和性yaml示例:根据节点名称来配置节点亲和性(node affinity)
    在Kubernetes中,根据节点名称来配置节点亲和性(nodeaffinity)通常不是直接通过节点名称实现的,而是通过为节点添加特定的标签,然后在Pod的亲和性规则中匹配这些标签。不过,有一种特殊情况是使用NodeAffinity的nodeSelectorTerms中的matchExpressions,通过设置operator为In并使用......
  • 【NOIP2020普及组复赛】题1:优秀的拆分
    题1:优秀的拆分【题目描述】一般来说,一个正整数可以拆分成若干个正整数的和。例如,1=11=11=1,......
  • 【NOIP2020普及组复赛】题2:直播获奖
    题2:直播获奖【题目描述】NOI2130NOI2130NOI2130即将举行。为了增加观赏性,......
  • Affinity Designer for Mac(强大的矢量图设计软件)v2.5.2版
    AffinityDesigner中文版是一款专为设计师打造的强大矢量图形设计软件,它以无与伦比的迅捷、流畅和精确性赢得了设计师们的广泛赞誉。无论您是专注于广告设计、网页设计、图标设计还是用户界面(UI)设计,AffinityDesignerMac版都能为您带来前所未有的高效体验。这款软件将彻底革新......