知识点回顾:部分题目解析(以base64解码为主)

本次题目出自平台NSSCTF平台

题目链接:主页 | NSSCTFicon-default.png?t=N7T8https://www.nssctf.cn/index

以此题为例子

将其下载(ps:由于程序容易被识别为危险文件,要保留之后才能下载下来)

HDCTF easy_re 

首先我们要注意有以下几个标签:

这就说明需要进行脱壳操作以及basa64字符的处理

知识延申:

upx壳处理

【逆向】UPX工具使用及加壳_upx.exe-CSDN博客icon-default.png?t=N7T8https://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)icon-default.png?t=N7T8https://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 加密的过程:

  1. 准备待加密的二进制数据。
  2. 将待加密的二进制数据按每 3 个字节(24 位)进行分组。
  3. 将每个字节转换为对应的 8 位二进制数。
  4. 将这 24 位二进制数按每 6 位进行分组,得到 4 个 6 位的组。
  5. 将每个 6 位的组转换为十进制数,作为索引查表获取相应的 Base64 字符。
  6. 将获得的 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解密的)

  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值