攻防世界Reverse

Shuffle

首先拖进ida去查看伪代码,那就要找到伪代码,按常规操作:搜索字符串,跳转,F5伪代码。而这题我们可以看到字符串是没有我们想要的一些字符出现,而我们可以直接在左边里找到main函数,F5就能看到伪代码。
在这里插入图片描述
伪代码也有些长,我们直接看最后,结合着题目所给的提示:
在这里插入图片描述
代码如下:在这里插入图片描述
那我们就分析一下,它这么个for体,因为有个随机,我们是不好判断其中最后的输出方式,而我们可以直接去看看原始数据,就能发现
在这里插入图片描述
整理一下就可以了:SECCON{Welcome to the SECCON 2014 CTF!}

知识点:

这道题没什么太多知识点,这道题可以说是让我们认识了一下reverse,以及ida的一些简单的操作。
又整理一下ida快捷键的操作,这些是必用的。


a:将数据转换为字符串

f5:一键反汇编

esc:回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)

shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置

ctrl+w:保存ida数据库

ctrl+s:选择某个数据段,直接进行跳转

ctrl+鼠标滚轮:能够调节流程视图的大小

x:对着某个函数、变量按该快捷键,可以查看它的交叉引用

g:直接跳转到某个地址

n:更改变量的名称

y:更改变量的类型

/ :在反编译后伪代码的界面中写下注释

\:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多

;:在反汇编后的界面中写下注释

ctrl+shift+w:拍摄IDA快照

u:undefine,取消定义函数、代码、数据的定义


srm-50

先下载,打开发现:
在这里插入图片描述
它让我们输入e-mali地址,和密码。那我们就用ida打开去看看里面是怎么运行的。
那我们用ida打开,可以在Function name这里看到:
在这里插入图片描述
此时我们就能看到伪代码了!
在这里插入图片描述
那我们就去看看这个关键函数:
在这里插入图片描述
然后粗略分析了一下,就能得知这两个判断是很终重要的。一个是告诉了我们e-mali,另一个告诉我们了密码:
在这里插入图片描述
这样flag就出来了,不过密码需要我们去一个一个连接起来的。

知识点:

这道题的其实也没什么知识点的,用的还是ida,主要在于分析代码,找到这两个判断。

Mysterious

这道题其实在各个平台都基本能见到(无非换个flag)。
界面如下:
在这里插入图片描述
来看主函数(ida打开):
当然,你可以找字符串,就能直接找到我们想要的函数,如果直接到了主函数,需要我们一个一个点进函数里面,发现我们i想要的函数(这里就有点像t套娃,一个盒子接着一个盒子,所以题目所一个盒子吗)直接上目标函数:
在这里插入图片描述
到这里是有两种方法。一个直接看flag,分析flag由什么组成。另一个分析输入什么能满足条件(因为条件满足了,下面的语句就执行了)
可以看到_itoa这个函数,就是个复制,如果看上面的话,就是输入满组v10,v12,v14,v13就行了。这里要注意v10其实是加上了1,看前面的语句。
在这里插入图片描述
这道题其实没什么知识点补充的,还是分析!!!
知识点:
itoa是广泛使用的非标准C语言和C++语言扩展功能。但因为它是一个非标准的C / C++语言功能,因此不能好好的被所有编译器使用。在大多数Windows下的编译器通常在头文件包含非标准函数。itoa()函数把整数转换成字符串,并返回指向转换后的字符串的指针。


elrond32

刚开始用个PE去看看文件的一些信息(一般做题如果题目没有提示带壳,我是不会用这个的,现在用只是说明一下,不过还是用一下比较好)
在这里插入图片描述
32位的ELF的Linus的可执行文件,用ida打开:
在这里插入图片描述
而点进去看看,发现switch里面的case都会跳转到LABEL_19:
那我们就看看LABEL_19:这里是个什么:
在这里插入图片描述
此时我们就可以写个脚本呗:
在这里插入图片描述

但此时还没完,返回主函数发现还有个函数没解决sub_8048538((int)a2[1]);
在这里插入图片描述
那此时我们再来个脚本呗:

a = [105,115,101,110,103,97,114,100,0]
b = [0x0F,0x1F,0x04,0x09,0x1C,0x12,0x42,0x09,0x0C,0x44,0x0D,0x07,0x09,0x06,0x2D,0x37,0x59,0x1E,0x00,0x59,0x0F,0x08,0x1C,0x23,0x36,0x07,0x55,0x02,0x0C,0x08,0x41,0x0A,0x14]
for i in range(32):
    print(chr(b[i] ^ a[i%8]),end='')

这样flag就得到了flag{s0me7hing_S0me7hinG_t0lki3n}
这道题还可以,都是比较简单的,最主要的是有个数据的传递,写了两个脚本。
知识点:
还是考的是ida里面的分析能力,前面其实讲的很清楚了。


answer_to_everything

首先我们可以很轻松的找到主函数,此时我们就可以分析里面的内容了:
在这里插入图片描述
而这时我们会发现的确什么也没有,那这时我们可以通过搜索字符串看看有没有我们没有发现的隐藏的其它函数,这里是没有找到的,那我们可以从Function name里面找,这里函数也不多。所以都看看,就能找到了。
找到了__int64 deregister_tm_clones()这个东西,有点可疑,但还是什么都没有发现,返回主函数再来看看not_the_flag这个函数:
在这里插入图片描述
发现了这个小小角落里的东西,那我们就用sha1加密一下:
在这里插入图片描述
这便是我们想要的flag了。


知识点:
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512。

我们大致了解一下这个加密,以后再遇到了就有了思路。


Reversing-x64Elf-100

这道题还是很好找到主函数的,应该是考察我们的分析能力的(这种是比较常见的)
在这里插入图片描述
那我们就点进去看看这个函数sub_4006FD:
在这里插入图片描述
这个时候我们基本上就已经摸清了这道题了,该写出这个脚本了。
在这里插入图片描述
到这里就做出这道题了,再来复盘下,分析,脚本(两个考验基本功的地方),所以我们要再这两个地方加强练习。

知识点:

有个小知识(大家可能会迷糊)有时候我们会将一个值逆序储存来用,而像这道题却不用。这时因为计算机储存一个值时逆过来储存的,运算也一样。想一下,你输入一个值,逆序的进去,再逆序的出来,这样在屏幕上还是正序,不过用反编译的话,是表示在计算机里面的值,所以是逆序,而我们要拿出来用的话,就需要手动(或脚本)逆序一下,而这道题,只是用它来运算,不用再逆序一下了。


hackme

首先我们来看看这到题的一些信息(第一步都是这样的):
在这里插入图片描述
我们现在就知道了它是个64位的ELF文件(在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件)
此时我们就可以用ida打开来进行我们的静态分析了。我们再ida的界面里发现了Function name是看不到main函数的,那此时我们就可以从搜索字符串里面来找到main函数。
在这里插入图片描述
此时我们就靠这个来跳转到mian函数(ida里面并不是main函数,它实际上就是我们要找到函数):
在这里插入图片描述
我们分析此函数,发现了输入的有22位,再仔细一分析,发现了一些奇怪的一些东西,sub_406D90这个函数(不要点进去看),发现其实没有用,你点进去看看就不想看了,所以判断无用,而后面都是由v6 % 22这个整体来实现的,那我们就默认它从0开始到22呗。
在这里插入图片描述
并且我们还发现了byte_6B4270这个,追踪一下就可以发现它是个数组,和它的值(至关重要)
我们又仔细分析了一番函数,发现其中的规律,由此来写个脚本:
在这里插入图片描述

知识点:

&0xff:
首先我们要都知道, &表示按位与,只有两个位同时为1,才能得到1, 0x代表16进制数,0xff表示的数二进制1111 1111 占一个字节.和其进行&操作的数,最低8位,不会发生变化.
正好再本题种对应着unsigned __int8这个代码。


re-for-50-plz-50

先来看看这个文件信息,这都是老生常谈了。
在这里插入图片描述
没有什么太大的信息,此时我们再用ida打开它,去分析里面的一些内容。
此时我们就可以发现了一些于其它地方不同的,它的main函数没有办法去反编译,此时可以看到它是个MIPS,这个没办法去反编译,不过也不是完全不能反编译的,这需要一个插件。
先来讲讲这个插件的安装,可以到github里面找到:
点我!!!找插件,第二个哟!
接下来安装retdec本体。并解压到IDA插件目录(X:\IDA_Pro_v7.0\plugins)里。
还得安装Visual C++ Redistributable for Visual Studio 2015这个东西
等等·,这看起来就比较麻烦,而且我自己亲自试了试,环境一直佩不好(VS 不怎么喜欢用,用起来也不怎么方便)
那我们就需要会看懂MIPS指令了(其实只要看懂几个就行了)
在这里插入图片描述

此时我们就可以开始编写脚本了。
在这里插入图片描述

这样我们就得到了答案,这道题主要考察的是对MIPS指令的熟悉程度,如果没见过那就要卡很长时间了。

知识点

ADDIU ADDIU rt, rs, immediate 无溢出检测的带立即数的加法
LW LW rt, offset(base) 加载字
LB LB rt, offset(base) 8位加载
SLL SLL rd, rt, sa 逻辑左移 GPR[rd] ← GPR[rt] << sa, sa为常量 取值0-31
ADDI ADDI rd,rs,immediate 带立即数的加法
XORI XORI rt, rs, immediate 异或立即数 rt = rs ^ immediate


dmd-50

刚开始还是老样子了,看看文件的信息:
在这里插入图片描述
我们就用ida64位打开去看看里面的伪代码,是可以发现它是C++的语言写的,如果有点C++基础的话会好一点的。
在这里插入图片描述
而上面我们又发现了个MD5:
在这里插入图片描述
在这里插入图片描述
给了个grape(葡萄)这是由两次MD5加密的,而我们分析上面的代码,是经过一次md5加密的。
在这里插入图片描述
这样我们不就得到了flag了。

知识点

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。


parallel-comparator-200

下载开一看竟然是个C语言的代码,很少见呀!
话不多说,来看看究竟有什么不同的地方:
在这里插入图片描述
这样我们就有了个大致了解,我们就看看这个赋值是怎么运作的。
在这里插入图片描述
此时我们就需要看看*(char *)result这个东西了,它其实是个上面定义的一个函数:
在这里插入图片描述
此时我们分析可知argument[0]是个随机数(但其实实际上并不是随机数)
它的值是个108(调试时可以得到这个值,或着用爆破来实际看一下它的值究竟是个什么)
在这里插入图片描述
而我们也可以发现just_a_string这个原始数据是没有用的,这个其实是下面比较的事,不在我们的考虑范围之内。
脚本:

d = [0, 9, -9, -1, 13, -13, -4, -11, -9, -1, -7, 6, -13, 13, 3, 9, -13, -11, 6, -7]
a = 108
for i in range(20):
    for k in range(123):
        if (a + d[i]) ^ k == 0:
            print(chr(k),end='')
            break

知识点

这道题考的是代码审计,看的是我们看代码是否够精准,是否够准确,有一些函数我也看不懂,但我们也不用全都弄懂,只要我们能够看到我们需要的进行分析,然后编写脚本来进行破解。


posted @ 2022-12-28 20:38  望权栈  阅读(69)  评论(0编辑  收藏  举报  来源