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}