本次题目出自平台NSSCTF平台
题目链接:主页 | NSSCTFhttps://www.nssctf.cn/index
以此题为例子
将其下载(ps:由于程序容易被识别为危险文件,要保留之后才能下载下来)
HDCTF easy_re
首先我们要注意有以下几个标签:
这就说明需要进行脱壳操作以及basa64字符的处理
知识延申:
upx壳处理
【逆向】UPX工具使用及加壳_upx.exe-CSDN博客https://blog.csdn.net/qq_43633973/article/details/102573376#:~:text=%E5%B0%9D%E8%AF%95%E5%A6%82%E4%B8%8B%EF%BC%9A%20%E6%89%93%E5%BC%80cmd%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%BF%9B%E5%85%A5%E5%88%B0upx.exe%E6%89%80%E5%9C%A8%E7%9A%84%E4%BD%8D%E7%BD%AE%EF%BC%8C%E8%BE%93%E5%85%A5upx.exe%20-h%20%E6%9C%89%E5%A6%82%E4%B8%8B%E5%8F%8D%E5%BA%94%EF%BC%9A%20%E9%9A%8F%E4%BE%BF%E6%89%BE%E4%BA%86%E4%B8%80%E4%B8%AAexe%E7%A8%8B%E5%BA%8F%EF%BC%88%E4%B9%8B%E5%89%8D%E4%B8%8A%E8%AF%BE%E7%9A%84%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81%EF%BC%8CC%2B%2B%E7%BC%96%E5%86%99%E7%9A%84%EF%BC%89%20sampe_mal.exe%E6%94%BE%E5%9C%A8%E8%BF%99%E4%B8%AAupx.exe%E7%9A%84%E5%90%8C%E7%BA%A7%E7%9B%AE%E5%BD%95%E4%B8%8B%EF%BC%9A%EF%BC%88%E8%BF%99%E6%A0%B7%E5%B0%B1%E4%B8%8D%E7%94%A8%E6%95%B2%E7%BB%9D%E5%AF%B9%E5%9C%B0%E5%9D%80%E4%BA%86%EF%BC%89,%E8%BE%93%E5%85%A5%E5%8A%A0%E5%A3%B3%E5%91%BD%E4%BB%A4%EF%BC%9Aupx%20sample_mal.exe%20%3A%E6%98%BE%E7%A4%BA%E5%8A%A0%E5%A3%B3%E6%88%90%E5%8A%9F%E3%80%82%20%E5%8F%AF%E4%BB%A5%E7%94%A8PEiD%E6%9F%A5%E7%9C%8B%E4%B8%8B%EF%BC%9A%E5%8F%91%E7%8E%B0%E5%8A%A0%E5%A3%B3%E6%88%90%E5%8A%9F%E3%80%82%20%E4%BD%BF%E7%94%A8%E8%84%B1%E5%A3%B3%E5%91%BD%E4%BB%A4%EF%BC%9Aupx%20-d%20sample_mal.exe%3A%E6%8F%90%E7%A4%BA%E8%84%B1%E5%A3%B3%E6%88%90%E5%8A%9F%E3%80%82UPX 可执行文件压缩工具的介绍与使用 - 掘金 (juejin.cn)
https://juejin.cn/post/7273803674789593127在我们将其进行查壳的过程当中我们可以发现
我们可以看到,这里有upx的提示信息,我们因此可以推断出该程序进行过upx的加壳处理
为啥要进行脱壳呢?
如果你没有脱壳,那将是这样的情况:
找不到main函数,无法对函数进行逆向的脚本编辑
那么如何进行脱壳处理呢?
首先,你得有一个upx插件(这个在网上应该都能找得到)
经过解压操作,将你要脱壳的文件夹复制到该文件夹当中
在上方的搜索栏里面,输入cmd
回车,进入这个界面
先输入
upx - d + 文件名
如果你希望这个脱壳的文件会换成新的,那么在上述的基础上,再输入 -o 新的文件名
将脱壳后的文件拖到ida64位中
main函数就能被找到了
按F5,跳转到main函数的界面
得到了如下的伪C代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
int i; // [rsp+2Ch] [rbp-4h]
_main(argc, argv, envp);
func(a, encode_a);
puts("Please input your flag:");
scanf("%s", s);
for ( i = 1; i <= 32; ++i )
f3(s);
func(s, encode_s);
if ( !strcmp(encode_s, a) )
puts("Congratulations! You get the flag");
else
puts("Sorry,try again");
return 0;
}
注意,伪C代码和C语言的代码类似,也是能将其识别和运行的
我们进入上方的func函数进行观察
发现有这样一串之后会跟常见的字符串
、
经过跟踪,我们发现了一串字符串
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
这个是base64的加密算法
base64加密算法
Base64 是一种常用的编码方式,它可以将二进制数据转换为可打印的 ASCII 字符串。下面是 Base64 加密的过程:
- 准备待加密的二进制数据。
- 将待加密的二进制数据按每 3 个字节(24 位)进行分组。
- 将每个字节转换为对应的 8 位二进制数。
- 将这 24 位二进制数按每 6 位进行分组,得到 4 个 6 位的组。
- 将每个 6 位的组转换为十进制数,作为索引查表获取相应的 Base64 字符。
- 将获得的 4 个 Base64 字符连接在一起,得到加密后的字符串。
在这个过程中,需要使用到一个 Base64 编码表,其中包含了 64 个字符(A-Z、a-z、0-9、+ 和 /),用于将 6 位的二进制数转换为相应的 Base64 字符。
请注意,Base64 只是一种编码方式,而不是加密算法。它是公开的、可逆的,主要用于将二进制数据在网络传输或存储时转换为 ASCII 字符串。
SERDVEZ7WTB1X2hAdjJfL1wvXEA1N2VyM2RfN2hlX3IzdjNyczN9
进行base64解密之后
但是,这个并不是我们要找的最后的flag
我们发现,在点击进来这个f3(s)里面之后,我们就能发现该fag进行了一定的加密运算操作,运算操作步骤如下:
这里是一个典型的交换操作,将前后进行互换的一种操作,也就是说,将其进行一定的反向操作,我们就可能得到相应的flag
这段代码实现了对称交换(symmetric swap)的操作。具体来说,在循环中,每次都将字符串的前半部分和后半部分对称位置的字符进行交换,从而实现了对整个字符串进行对称交换的效果。
通过这种方式,最终实现了将字符串逆序排列的功能。这种对称交换是一种常见的字符串操作,可以用于许多不同的应用场景中。
那么,将其进行对称交换回来就能得到相应的结果(也就是我们所谓的flag)
但是,我们要注意的是这个for循环经历了32次,每2次就相当于没变
先交换过来+再交换过去=没变
所以,我们得到的经过base64解码的答案就是我们所需要的flag
HDCTF{Y0u_h@v2_/\/\@57er3d_7he_r3v3rs3}
解码过后,这个就是我们得到的flag(经过base64解密的)