第五空间-2021-StrangeLanguage

二木 王者

(py打包+brainfuck语言+bf反编译+异或)

我们拿到这道题,看这个图标我们就可以知道,就是PY打包的。

image-20230925084727166

我们使用 pyinstxtractor.py 将其解包

image-20230925084930674

可以得到如图的文件夹

将其反编译

image-20230925084950468

网上找一个pyc反编译网站

image-20230925085128512

我们可以看到,这里调用了brainfuck.main,这个文件,我们去我们刚刚解包的地方,寻找这个文件分析即可

我们可以发现有一个pyd的文件,什么是pyd文件呢?简单来说就是py的dll文件,动态链接库,也就是说,我们也可以ida进行分析。

image-20230925085250601

这里我需要厘清的概念

[原创]python编译后的pyd爆破-软件逆向-看雪-安全社区|安全招聘|kanxue.com

  • py: python 脚本文件(source code)
  • pyc: 脚本文件编译得到的字节码, 二进制文件,python文件经过编译器编译之后的文件。可以提高文件加载速度。(py的汇编)
  • pyo: 脚本文件开启优化编译选项(-O)编译得到的字节码,二进制文件,优化编译后的文件。可以通过python -O file.py生成。
  • pyd: 基本的Windows DLL文件,python的动态链接库。

我们将pyd文件放入ida进行分析

我们查看字符串可以发现了一个一长串的字符串

image-20230925090043146

我们去网上搜索后可以发现,这个就是我们的bf语言。

然后我们可以到github上拉取一个项目

https://github.com/eterevsky/bfc

去把这个下载进入ubuntu中,cd 进文件夹,然后执行make命令即可将其编译成elf文件

编译成elf文件之后,将前面的bf,代码保存在一个.bf文件中,我的是1.bf.

同文件夹下我们执行以下命令

1
2
3
4
5
./bfc 1.bf 1.c   //将我们的bf文件转换为c语言

gcc 1.c -o 1 //将c文件进行编译变成可执行文件(这样我们就可以调试啦)


然后分析我们的文件

我们可以发现输出字符串,有两个no,第一个不难猜出为判断长度。

image-20230925092601913

放入ida,我们可以发现我们的密文,动调将其调试出来

image-20230925091125218

通过调试,我们可以知道,flag的总长度为38位,去除flag{},就为32位,确实能和我们上面提出的来的数据长度吻合,然后我们对其进行黑盒分析,输入数据,输出来观察,我们可以发现是进行了异或运算。而且是前一位异或了后一位。我们由此写出脚本即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int main()
{
int arr[40] = {0x53, 0xF, 0x5A, 0x54, 0x50, 0x55, 0x3, 0x2, 0x0,

0x7, 0x56, 0x7, 0x7, 0x5B, 0x9, 0x0, 0x50, 0x5, 0x2,

0x3, 0x5D, 0x5C, 0x50, 0x51, 0x52, 0x54, 0x5A, 0x5F,

0x2, 0x57, 0x7, 0x34};

for (int i = 32; i >=0;i--)
{
arr[i - 1] ^= arr[i];
}

for (int i = 0; i<32; i++)
{
printf("%c", arr[i]);
}
return 0;
}

可以得出 flag{d78b6f30225cdc811adfe8d4e7c9fd34}

 评论