啊哈,我抱着一个有意思的逆向题回来了

因为最近在值守的时候无聊刷题的时候碰到了一个比较有意思的题(虽然后来被领导制裁了,我被调成了夜班😭 ),最后一个夜班结束后还阳了,呜呜呜,天命打工人buff丢失,一血没了(我是首阳)

虽然是个跟软件逆向相关的,但我感觉挺有意思的,就像推理游戏一样,找线索,剩下的交给命运。

首先题目出自攻防世界题库

image.png

虽然标的难度是1,但我觉得逆向相关的CTF打底难度是3。

做题啦

下载附件,用IDA(因为icon是个小姑娘,又名i姑娘)打开之后,是这样

image.png

通常来说,软件都会有一个主函数(main函数),这个是一个程序最主要的也是特征最明显的地方,但是吧,这个题。。。怎么说呢,它有main函数,但很简单,就这样

image.png

它main了个寂寞,所以从main函数中获取有用的运行逻辑和信息就别想了,别问我为什么不看j_main下面那个start函数,我看了,跟j_main差不多,就一个返回,没啥用。

到这就很崩溃了,啥也没有,怎么办,还能怎么办,遇事不决,搜索字符串,反正结果已知,肯定是要找到flag{}格式的一串字符,那就好说了先全局搜字符串看看有啥

image.png

运气好,搜到了,嘿嘿,跟进看一下

image.png

看不懂,看一下交叉引用

image.png

继续跟进

image.png

看到了之前搜索字符串出现的那几个熟悉的字符,我直接就是一个f5将汇编转换成伪代码(跟C家族的变成语言类似)

image.png

这里呢,有循环,有取值,有拼接,其实简单来说,循环里的东西跟flag没啥关系,可以忽略,重要的是从put函数下面的东西。现在简单分析一下

 g_teamjnu_idx = 184;
  j_strcpy_0(flag, "flag{");
  j_strcat_0(flag, team[g_team_idx]);
  j_strcat_0(flag, "_1s_n1c3_but_");
  j_strcat_0(flag, teamjnu[g_teamjnu_idx]);
  j_strcat_0(flag, "_is_we1rd}");
  return puts("[+] Success: Task 2 finished!");

首先呢给了一个变量赋值,184是int类型的(鼠标悬停在184上可以看到字符类型),可以确定是赋值一个常量,接下来的strcpy和strcat函数就是拼接flag的了,最后返回一个成功,通过字符串搜索和上述代码推断,flag最终格式为flag{XXX_1s_n1c3_but_XXX_is_we1rd}

那么只需要再找到XXX代表的两个字符即可,怎么找呢,看着两行代码

image.png

image.png

有没有发现什么,既然是拼接flag字符,那么肯定是要有取值的,基本上可以确定,这两个XXX指代的字符是分别从team和teamjnu这两个组里取了一个值于其他三个字符串拼接获得最终的flag,那只需要找到g_team_idx和g_teamjnu_idx这两个变量的常值就行,g_teamjnu_idx的值已经找到了,184,就剩下g_team_idx的了

该怎么找呢,这就要回到代码开头

image.png

可以看到,2,real 那么有没有1或者其他的类似命名的函数呢,开找

image.png

可以看到,有四个跟这个函数名差不多命名规则的,那就简单了,每个函数看一下,找变量赋值,最后在stage_1函数的伪代码里看到这么一条

image.png

g_team_idx = 23(类型同样鼠标悬停可以看到),至此,胜利的拼图还差最后一块了,就是那两个组里到底都有些啥呢

回到stage_2_real函数,跟进两个数组,可以看到

image.png

image.png

东西有点多,shift+e一下导出,看着就顺眼多了

image.png

image.png

这就好看多了,然后根据常量找字符就行了,我用的办法很原始,但挺好用,这里我只演示teamjnu了

image.png

嘿嘿,把这一串字符删掉根据行号找就行

image.png

team也一样,同样的办法,最终找到是Xp0int,至此胜利的拼图已在手中,心机之蛙一直摸你肚子!最终flag为

flag{Xp0int_1s_n1c3_but_Xp0intJNU_is_we1rd}

哎嘿,题目完成。

题外话

这道题基本上就是新手的难度,很简单,比什么迷宫算法、加解密简单很多,但确实很有意思,基本上全程就是找找找就完事了。

逆向确实挺有意思的,但要学的东西太多了,要有代码基础,还得会汇编、dos指令等等(太多了,说不明白),各位大佬有兴趣的话可以接触一下。

知识点(敲黑板)

1.IDA(摘自知乎)

IDA Pro(简称IDA)是DataRescue公司(home of PhotoRescue, data recovery solution for flash memory cards)出品的一款交互式反汇编工具,它功能强大、操作复杂,要完全掌握它,需要很多知识。IDA最主要的特性是交互和多处理器。操作者可以通过对IDA的交互来指导IDA更好地反汇编,IDA并不自动解决程序中的问题,但它会按用户的指令找到可疑之处,用户的工作是通知IDA怎样去做。比如人工指定编译器类型,对变量名、结构定义、数组等定义等。这样的交互能力在反汇编大型软件时显得尤为重要。多处理器特点是指IDA支持常见处理器平台上的软件产品。IDA支持的文件类型非常丰富,除了常见的PE格式,还支持Windows,DOS,UNIX,Mac,Java,.NET等平台的文件格式。

icon长这样

image-f3fd6882.png

你就说是不是姑娘吧

2.软件逆向(摘自CSDN)

软件逆向工程(Software Reverse Engineering)又称软件反向工程,是指从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等[1]。通常,人们把对软件进行反向分析的整个过程统称为软件逆向工程,把在这个过程中所采用的技术都统称为软件逆向工程技术。

现实中,人们并不总是完全需要逆向出目标软件的所有功能,如果那样的话将会是一个艰苦而漫长的过程。大多数情况下是意图通过对软件进行逆向,从中获取软件的算法,或破解软件及进行功能扩展等。

3.交叉引用

IDA逆向笔记-交叉引用分析(快捷键X)_ida交叉引用快捷键_向往生的博客-CSDN博客

看这位大佬的博客吧,这里借用一下大佬的❤️️❤️️❤️️❤️️❤️️❤️️❤️️截图(来自https://blog.csdn.net/m0_66039322/article/details/132105539)

image.png

看,人工智障都说好

4.CTF(摘自百度百科)

CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。已经成为全球范围网络安全圈流行的竞赛形式,2013年全球举办了超过五十场国际性CTF赛事。而DEFCON作为CTF赛制的发源地,DEFCON CTF也成为了全球最高技术水平和影响力的CTF竞赛,类似于CTF赛场中的“世界杯” 。

祝各位武运昌盛,网站安全无漏洞(0DAY除外)

此致,敬礼

1 打赏
打赏 5 积分后可见