easyre

简单的re,直接放入ida中,找到main函数,就可以发现flag。

reverse1

在ida中可以得到一开始的字符串{hello_world},接着看main函数

for ( i = 0; ; ++i )
{
v10 = i;
if ( i > j_strlen(Str2) ) // "{hello_world}"
break;
if ( Str2[i] == 'o' ) // "{hello_world}"
Str2[i] = '0'; // "{hello_world}"
}

将o变为0就可以得到最后的flag了

reverse2

和reverse1一个道理,在此就不再赘述了。

内涵的软件

也是直接ida得flag

新年快乐

这道题有UPX,使用工具将其脱壳就行,最后将脱壳后的文件放入ida就可以得到flag了。

xor

for ( n33 = 1; n33 < 33; ++n33 )
__b[n33] ^= __b[n33 - 1];
if ( !strncmp(
__b,
global, // "f\nk\fw&O.@\x11x\rZ;U\x11p\x19F\x1Fv\"M#D\x0Eg\x06h\x0FG2O"
0x21u) )
printf("Success");

对global的值进行异或,一样从第二位开始与前一个值进行异或即可获得flag。python脚本如下

list_xor = [102,10,107,12,119,38,79,46,64,17,120,13,90,59,85,17,112,25,70,31,118,34,77,35,68,14,103,6,104,15,71,50,79]
flag = "f"

for i in range(1,len(list_xor)):
flag += chr(list_xor[i] ^ list_xor[i-1])
print(flag)

reverse3

sub_41132F("please enter the flag:", v7);
sub_411375("%20s", (char)Str);
v3 = j_strlen(Str);
Source = (const char *)sub_4110BE(Str, v3, v14);
strncpy(Destination, Source, 0x28u);
v11 = j_strlen(Destination);
for ( i = 0; i < v11; ++i )
Destination[i] += i;
MaxCount = j_strlen(Destination);
if ( !strncmp(Destination, Str2, MaxCount) ) // "e3nifIH9b_C@n@dH"
sub_41132F("rigth flag!\n", v8);
else
sub_41132F("wrong flag!\n", v8);
return 0;
}

该题首先需要我们输入一段字符串,接着进行编码,将编码后的字符串赋值给Destination,再计算其长度,并进行一些修改后与”e3nifIH9b_C@n@dH”字符串进行对比。

现在就需要知道进行了什么类型的编码

if ( !p_Str || !a2 )
return 0;
v9 = a2 / 3;
if ( (int)(a2 / 3) % 3 )
++v9;
v10 = 4 * v9;
*(_DWORD *)a3 = v10;
v12 = malloc(v10 + 1);
if ( !v12 )
return 0;
j_memset(v12, 0, v10 + 1);
p_Str_1 = p_Str;
v11 = a2;
v4 = 0;
while ( v11 > 0 )
{
algn_41A145[1] = 0;
algn_41A145[0] = 0;
byte_41A144[0] = 0;
for ( n3 = 0; n3 < 3 && v11 >= 1; ++n3 )
{
byte_41A144[n3] = *p_Str_1;
--v11;
++p_Str_1;
}
if ( !n3 )
break;
switch ( n3 )
{
case 1:
*((_BYTE *)v12 + v4) = aAbcdefghijklmn[(int)(unsigned __int8)byte_41A144[0] >> 2];
v5 = v4 + 1;
*((_BYTE *)v12 + v5) = aAbcdefghijklmn[((algn_41A145[0] & 0xF0) >> 4) | (16 * (byte_41A144[0] & 3))];
*((_BYTE *)v12 + ++v5) = aAbcdefghijklmn[64];
*((_BYTE *)v12 + ++v5) = aAbcdefghijklmn[64];
v4 = v5 + 1;
break;
case 2:
*((_BYTE *)v12 + v4) = aAbcdefghijklmn[(int)(unsigned __int8)byte_41A144[0] >> 2];
v6 = v4 + 1;
*((_BYTE *)v12 + v6) = aAbcdefghijklmn[((algn_41A145[0] & 0xF0) >> 4) | (16 * (byte_41A144[0] & 3))];
*((_BYTE *)v12 + ++v6) = aAbcdefghijklmn[((algn_41A145[1] & 0xC0) >> 6) | (4 * (algn_41A145[0] & 0xF))];
*((_BYTE *)v12 + ++v6) = aAbcdefghijklmn[64];
v4 = v6 + 1;
break;
case 3:
*((_BYTE *)v12 + v4) = aAbcdefghijklmn[(int)(unsigned __int8)byte_41A144[0] >> 2];
v7 = v4 + 1;
*((_BYTE *)v12 + v7) = aAbcdefghijklmn[((algn_41A145[0] & 0xF0) >> 4) | (16 * (byte_41A144[0] & 3))];
*((_BYTE *)v12 + ++v7) = aAbcdefghijklmn[((algn_41A145[1] & 0xC0) >> 6) | (4 * (algn_41A145[0] & 0xF))];
*((_BYTE *)v12 + ++v7) = aAbcdefghijklmn[algn_41A145[1] & 0x3F];
v4 = v7 + 1;
break;
}
}
*((_BYTE *)v12 + v4) = 0;
return v12;
}

大致就是base64的编码。过程知道了,那么我们只需要将”e3nifIH9b_C@n@dH”这段字符串逆向还原再base64解码就能获得flag了,python脚本如下:

import base64
string = "e3nifIH9b_C@n@dH"
flag = ""
for i in range(0,len(string)):
flag += chr(ord(string[i]) - i)
print(base64.b64decode(flag).decode())

helloword

一道安卓逆向,使用ApkIDE进行逆向,找到main函数,再搜索flag字符串就可以获得本题的flag了。

不一样的flag

没有壳,直接丢进ida中进行分析

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
char _11110100001010000101111__[29]; // [esp+17h] [ebp-35h] BYREF
int v4; // [esp+34h] [ebp-18h]
int n4; // [esp+38h] [ebp-14h] BYREF
int i; // [esp+3Ch] [ebp-10h]
_BYTE v7[12]; // [esp+40h] [ebp-Ch] BYREF

__main();
_11110100001010000101111__[26] = 0;
*(_WORD *)&_11110100001010000101111__[27] = 0;
v4 = 0;
strcpy(_11110100001010000101111__, "*11110100001010000101111#");
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", &n4);
if ( n4 == 2 )
{
++*(_DWORD *)&_11110100001010000101111__[25];
}
else if ( n4 > 2 )
{
if ( n4 == 3 )
{
--v4;
}
else
{
if ( n4 != 4 )
LABEL_13:
exit(1);
++v4;
}
}
else
{
if ( n4 != 1 )
goto LABEL_13;
--*(_DWORD *)&_11110100001010000101111__[25];
}
for ( i = 0; i <= 1; ++i )
{
if ( *(_DWORD *)&_11110100001010000101111__[4 * i + 25] > 4u )
exit(1);
}
if ( v7[5 * *(_DWORD *)&_11110100001010000101111__[25] - 41 + v4] == '1' )
exit(1);
if ( v7[5 * *(_DWORD *)&_11110100001010000101111__[25] - 41 + v4] == '#' )
{
puts("\nok, the order you enter is the flag!");
exit(0);
}
}
}

大致可以知道这是一个走迷宫的题目,如果走到了#,这个走到#的路线的选择就是flag,这里猜测的迷宫地图如下:

*1111
01000
01010
00010
1111#

由此就可以知道flag就是flag{222441144222}