一、xor
拉入ExeinfoPe分析
程序为64位
拉入64位IDA分析
找到main函数,F5查看伪代码
发现是字符异或,再与global比较,使用我们跟进global
注意这里不能直接复制,要将global中保存到奇怪字符全部转换为ascll码,然后再去异或
运用脚本
a= [0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26,
0x4F, 0x2E, 0x40, 0x11, 0x78, 0x0D,
0x5A, 0x3B, 0x55, 0x11,
0x70, 0x19, 0x46, 0x1F, 0x76, 0x22,
0x4D, 0x23, 0x44, 0x0E, 0x67,
0x06, 0x68, 0x0F, 0x47, 0x32,0x4F]
flag=''
flag+='f'
for i in range(1,len(a)):
flag+=chr(a[i]^a[i-1])
print(flag)
二、reverse3
拉入ExeinfoPe分析
拉入32位IDA分析
找到main函数,F5查看伪代码
分析代码发现,该代码是输入一个字符串后然后经过sub_4110BE函数进行加密再通过一个for循环进行变换,然后与Str2中字符串进行比较
所以我们跟进Str2
得到Str2中保存的字符串
接着我们去找加法方式是什么
返回main函数,跟进sub_4110BE函数
感觉很像base64加密,跟进aAbcdefghijklmn
确实是base64加密,运用解题脚本
import base64
s="e3nifIH9b_C@n@dH"
x=""
for i in range(0,len(s)):
x+=chr(ord(s[i])-i)
print(base64.b64decode(x))
得到flag
flag{i_l0ve_you}
三、不一样的flag
01、运行程序
上下左右,应该是走迷宫
02、拉入ExeinfoPe分析
03、拉入32位IDA分析
shift+F12,查看字符串
这个应该就是走迷宫了,接下来看他怎么走
找到main函数,F5查看伪代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v3; // [esp+17h] [ebp-35h]
int v4; // [esp+30h] [ebp-1Ch]
int v5; // [esp+34h] [ebp-18h]
signed int v6; // [esp+38h] [ebp-14h]
int i; // [esp+3Ch] [ebp-10h]
int v8; // [esp+40h] [ebp-Ch]
__main();
v4 = 0;
v5 = 0;
qmemcpy(&v3, _data_start__, 0x19u);
while ( 1 )
{
puts("you can choose one action to execute");
puts("1 up");
puts("2 down");
puts("3 left");
printf("4 right\n:");
scanf("%d", &v6);
if ( v6 == 2 )
{
++v4;
}
else if ( v6 > 2 )
{
if ( v6 == 3 )
{
--v5;
}
else
{
if ( v6 != 4 )
LABEL_13:
exit(1);
++v5;
}
}
else
{
if ( v6 != 1 )
goto LABEL_13;
--v4;
}
for ( i = 0; i <= 1; ++i )
{
if ( *(&v4 + i) < 0 || *(&v4 + i) > 4 )
exit(1);
}
if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 49 )
exit(1);
if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35 )
{
puts("\nok, the order you enter is the flag!");
exit(0);
}
}
}
不能走‘1’,找到‘#’就能得到flag
从‘*’开始,走‘0’不走‘1’,走到‘#’
便得到
222441144222
包上flag上交
四、SimpleRev
拉入ExeinfoPe分析
拉入64位IDA分析
找到main函数,F5查看伪代码
跟进Decry
unsigned __int64 Decry()
{
char v1; // [rsp+Fh] [rbp-51h]
int v2; // [rsp+10h] [rbp-50h]
int v3; // [rsp+14h] [rbp-4Ch]
int i; // [rsp+18h] [rbp-48h]
int v5; // [rsp+1Ch] [rbp-44h]
char src[8]; // [rsp+20h] [rbp-40h]
__int64 v7; // [rsp+28h] [rbp-38h]
int v8; // [rsp+30h] [rbp-30h]
__int64 v9; // [rsp+40h] [rbp-20h]
__int64 v10; // [rsp+48h] [rbp-18h]
int v11; // [rsp+50h] [rbp-10h]
unsigned __int64 v12; // [rsp+58h] [rbp-8h]
v12 = __readfsqword(0x28u);
*(_QWORD *)src = 357761762382LL; //SLCDN
v7 = 0LL;
v8 = 0;
v9 = 512969957736LL; //wodah
v10 = 0LL;
v11 = 0;
text = (char *)join(key3, &v9); //text=killshadow
strcpy(key, key1);
strcat(key, src); //key=ADSFKNDCLS
v2 = 0;
v3 = 0;
getchar();
v5 = strlen(key);
for ( i = 0; i < v5; ++i )
{
if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 )
key[i] = key[v3 % v5] + 32;
++v3;
} //key=adsfkndcls
printf("Please input your flag:", src);
while ( 1 )
{
v1 = getchar();
if ( v1 == 10 )
break;
if ( v1 == 32 )
{
++v2;
}
else
{
if ( v1 <= 96 || v1 > 122 )
{
if ( v1 > 64 && v1 <= 90 )
str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
}
else
{
str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
}
if ( !(v3 % v5) )
putchar(32);
++v2;
}
}
if ( !strcmp(text, str2) )
puts("Congratulation!\n");
else
puts("Try again!\n");
return __readfsqword(0x28u) ^ v12;
}
分析完程序,运用c++脚本
#include <iostream>
using namespace std;
int main()
{
char key[] = "adsfkndcls";
char text[] = "killshadow";
int v3 = 10;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 128; j++)
{
if (j < 'A' || j > 'z' || j > 'Z' && j < 'a')
{
continue;
}
if ((j - 39 - key[v3 % 10] + 97) % 26 + 97 == text[i])
{
cout << char(j);
v3++;
break;
}
}
}
}
运行得到
五、Java逆向解密
下载附件得到.class文件
直接用jd-gui工具打开
得到代码
import java.util.ArrayList;
import java.util.Scanner;
public class Reverse {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Please input the flag );
String str = s.next();
System.out.println("Your input is );
System.out.println(str);
char[] stringArr = str.toCharArray();
Encrypt(stringArr);
}
public static void Encrypt(char[] arr) {
ArrayList<Integer> Resultlist = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
int result = arr[i] + 64 ^ 0x20;
Resultlist.add(Integer.valueOf(result));
}
int[] KEY = {
180, 136, 137, 147, 191, 137, 147, 191, 148, 136,
133, 191, 134, 140, 129, 135, 191, 65 };
ArrayList<Integer> KEYList = new ArrayList<>();
for (int j = 0; j < KEY.length; j++)
KEYList.add(Integer.valueOf(KEY[j]));
System.out.println("Result:");
if (Resultlist.equals(KEYList)) {
System.out.println("Congratulations);
} else {
System.err.println("Error);
}
}
}
分析代码,首先让我们输入一个字符串,然后经过一个for循环进行异或,然后将得到的新字符串与KEY进行比较
运用脚本
strs = [180, 136, 137, 147, 191, 137, 147, 191,
148, 136, 133, 191, 134, 140, 129, 135, 191, 65]
flag = ""
for i in range(0,len(strs)):
flag += chr(strs[i] - ord('@') ^ 0x20)
print(flag)
得到flag
flag{This_is_the_flag_!}