攻防世界-RE-nostringattached

攻防世界-RE-nostringattached

开始

使用查壳工具查看为32为EFL文件,未加壳。

使用IDApro分析代码,查看main函数,F5查看源码,发现只有 authenticate();函数有作用,继续查看。

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

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

静态分析

那么先就要分析常量字符串 sa2,发现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,好麻烦啊,难受。

posted @ 2021-04-27 22:00  ddddd1234654732  阅读(128)  评论(1)    收藏  举报
Live2D