攻防世界-RE-nostringattached
攻防世界-RE-nostringattached
开始
使用查壳工具查看为32为EFL文件,未加壳。
使用IDApro分析代码,查看main函数,F5查看源码,发现只有 authenticate();函数有作用,继续查看。

很明显发现两个字符串加密就是flag,查看加密函数decrypt.

发现就是一个字符串相减的加密方法。

静态分析
那么先就要分析常量字符串 s和 a2,发现s和a2都是这样前面一个字节的ascii后面14 00 00,问题来了,字符是以几个字节为单位进行相减的。

下面是我找到的一个静态分析的:
全选s,然后使用shit+E提取C无符号字符数组,wchar_t为4字节,然后写一个脚本进行加密,脚本如下:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include <tchar.h>
#include <cstdlib>
using namespace std;
char s[] =
{
0x3A, 0x14, 0x00, 0x00, 0x36, 0x14, 0x00, 0x00, 0x37, 0x14,
0x00, 0x00, 0x3B, 0x14, 0x00, 0x00, 0x80, 0x14, 0x00, 0x00,
0x7A, 0x14, 0x00, 0x00, 0x71, 0x14, 0x00, 0x00, 0x78, 0x14,
0x00, 0x00, 0x63, 0x14, 0x00, 0x00, 0x66, 0x14, 0x00, 0x00,
0x73, 0x14, 0x00, 0x00, 0x67, 0x14, 0x00, 0x00, 0x62, 0x14,
0x00, 0x00, 0x65, 0x14, 0x00, 0x00, 0x73, 0x14, 0x00, 0x00,
0x60, 0x14, 0x00, 0x00, 0x6B, 0x14, 0x00, 0x00, 0x71, 0x14,
0x00, 0x00, 0x78, 0x14, 0x00, 0x00, 0x6A, 0x14, 0x00, 0x00,
0x73, 0x14, 0x00, 0x00, 0x70, 0x14, 0x00, 0x00, 0x64, 0x14,
0x00, 0x00, 0x78, 0x14, 0x00, 0x00, 0x6E, 0x14, 0x00, 0x00,
0x70, 0x14, 0x00, 0x00, 0x70, 0x14, 0x00, 0x00, 0x64, 0x14,
0x00, 0x00, 0x70, 0x14, 0x00, 0x00, 0x64, 0x14, 0x00, 0x00,
0x6E, 0x14, 0x00, 0x00, 0x7B, 0x14, 0x00, 0x00, 0x76, 0x14,
0x00, 0x00, 0x78, 0x14, 0x00, 0x00, 0x6A, 0x14, 0x00, 0x00,
0x73, 0x14, 0x00, 0x00, 0x7B, 0x14, 0x00, 0x00, 0x80, 0x14,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
unsigned char a[]=
{
0x01, 0x14, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x03, 0x14,
0x00, 0x00, 0x04, 0x14, 0x00, 0x00, 0x05, 0x14, 0x00, 0x00
};
int main()
{ int num=0;
for(int i=0;i<150;i++)
{
s[i]-=a[(num++)%20];
if(s[i])
printf("%c",s[i]);
}
return 0;
}
再附上一个writeup写的代码,更好直观理解,低地址存储低位,小端方式没毛病:
s1 = [0x0000143A, 0x00001436, 0x00001437, 0x0000143B, 0x00001480, 0x0000147A,
0x00001471, 0x00001478, 0x00001463,
0x00001466, 0x00001473, 0x00001467, 0x00001462, 0x00001465, 0x00001473,
0x00001460, 0x0000146B, 0x00001471,
0x00001478, 0x0000146A, 0x00001473, 0x00001470, 0x00001464, 0x00001478,
0x0000146E, 0x00001470, 0x00001470,
0x00001464, 0x00001470, 0x00001464, 0x0000146E, 0x0000147B, 0x00001476,
0x00001478, 0x0000146A, 0x00001473,
0x0000147B, 0x00001480]
s2 = [0x00001401, 0x00001402, 0x00001403, 0x00001404, 0x00001405]
dest = s1
v4 = 0
flag = ''
v6 = len(s1)
v7 = len(s2)
while v4 < v6:
i = 0
while i < v7 and v4 < v6:
dest[v4] -= s2[i]
flag += chr(dest[v4])
v4 += 1
i += 1
print(flag)
可以看到是以一个字符为单位的减法,14 00 00其实主要是占位循环而已,没多大用,运行即可得到flag。
动态分析
使用GDB进行动态分析,可以直接在Linux下运行,也可以使用IDA远程连接GDB动态调试(debuger选项中)。
我使用的kali安装GDB,好麻烦啊,难受。

浙公网安备 33010602011771号