上一次线上赛的一道题目
链接:http://pan.baidu.com/s/1qY9ztKC 密码:xlr2
这是一道代码混淆的题目,因为当时还不知道angr这样一个软件,所以我就用了自己的一种思路
本体是对32位密码进行顺次加密运算的(确实是顺次,我验算过),所以我的思路就是修改源代码,进行顺次爆破
主要思想是在每一次报错的goto跳转前加上一个唯一的m变量值,并在报错的代码处用n变量来保存上一次的m值,如果m=n则说明,是同一位发生错误,继续爆破该位,若m!=n则说明,上一位正确,已经跳转到下一位,则i++开始爆破下一位。
个人觉得方法还比较简单,工作量也比较小,上代码:
// ewwe.cpp : Defines the entry point for the console application. // #include<stdio.h> #include<stdlib.h> typedef char _BYTE; void main() { unsigned int v1; // [sp+Ch] [bp-24h]@0 unsigned __int8 v2; // [sp+14h] [bp-1Ch]@69 char v3; // [sp+16h] [bp-1Ah]@2 char v4; // [sp+16h] [bp-1Ah]@32 char v5; // [sp+16h] [bp-1Ah]@34 char v6; // [sp+17h] [bp-19h]@8 char v7; // [sp+18h] [bp-18h]@5 char v8; // [sp+18h] [bp-18h]@19 char v9; // [sp+18h] [bp-18h]@44 char v10; // [sp+19h] [bp-17h]@0 char v11; // [sp+19h] [bp-17h]@19 char v12; // [sp+1Ah] [bp-16h]@4 char v13; // [sp+1Ah] [bp-16h]@21 char v14; // [sp+1Bh] [bp-15h]@10 char v15; // [sp+1Bh] [bp-15h]@38 char v16; // [sp+1Ch] [bp-14h]@44 char v17; // [sp+1Dh] [bp-13h]@2 char v18; // [sp+1Dh] [bp-13h]@4 char v19; // [sp+1Fh] [bp-11h]@0 char v20; // [sp+1Fh] [bp-11h]@26 char table[]="abcdefghijklmnopqrstuvwxyz0123456789"; char a1[]="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; int i=0; int j=0; int m; int n=1; for(j;j<36;j++){ a1[i]=table[j]; if ( v1 + 0x717BAD35 > 0xFFFFFFFF ) goto LABEL_75; v17 = ((*(_BYTE *)a1 ^ 0x10) + 10) ^ 0x12; v3 = ((((((v17 + 1) ^ 0x1B) + 6) ^ 0x39) + 8) ^ 0x29) + 8; if ( ((unsigned __int8)((v3 ^ 0x3B) + 4) ^ 0xA) != 216 ) {m=1; goto LABEL_88;} if ( v1 + 4266592168 > 0xFFFFFFFF ) goto LABEL_15; v18 = ((*(_BYTE *)(a1 + 1) ^ 5) + 10) ^ 0x16; v12 = ((v18 + 8) ^ 0x2F) + 9;; while ( 1 ) { v7 = (v12 ^ 0x32) + 10; if ( ((unsigned __int8)((((v7 ^ 0xB) + 6) ^ 0x2B) + 6) ^ 6) != 132 ) {m=2; goto LABEL_88;} if ( v1 + 3722410627 <= 0xFFFFFFFF ) { v18 = ((*(_BYTE *)(a1 + 2) ^ 0x26) + 10) ^ 0x14; v7 = ((((v18 + 7) ^ 7) + 7) ^ 9) + 5; } do { v6 = v7 ^ 0x3D; if ( ((unsigned __int8)((((v7 ^ 0x3D) + 6) ^ 0x31) + 5) ^ 0xC) != 40 ) {m=3; goto LABEL_88;} if ( v1 + 2919940649 > 0xFFFFFFFF ) goto LABEL_83; v18 = ((*(_BYTE *)(a1 + 3) ^ 0x2F) + 5) ^ 0x29; v14 = (v18 + 10) ^ 0x1F; if ( ((unsigned __int8)(((((((v18 + 10) ^ 0x27) + 6) ^ 0x31) + 9) ^ 0x26) + 8) ^ 0x32) != 12 ) {m=4; goto LABEL_88;} if ( v1 + 1939742939 > 0xFFFFFFFF ) goto LABEL_82; v18 = *(_BYTE *)(a1 + 4) ^ 0x1F; v7 = ((((v18 + 9) ^ 0x21) + 4) ^ 0x27) + 9; if ( ((unsigned __int8)((((v7 ^ 0x2D) + 7) ^ 0x19) + 9) ^ 0x39) != 52 ) {m=5; goto LABEL_88;} } while ( v1 + 1190965352 > 0xFFFFFFFF ); v17 = (*(_BYTE *)(a1 + 5) + 9) ^ 0x26; v3 = ((((((v17 + 9) ^ 0x10) + 4) ^ 0x32) + 1) ^ 5) + 1; LABEL_15: if ( ((unsigned __int8)((v3 ^ 0xA) + 7) ^ 0x12) != 94 ) {m=6; goto LABEL_88;} if ( v1 + 4112981141 > 0xFFFFFFFF ) goto LABEL_59; if ( ((unsigned __int8)((((((((((*(_BYTE *)(a1 + 6) ^ 0x17) + 6) ^ 0x27) + 1) ^ 0x26) + 6) ^ 1) + 2) ^ 0x16) + 7) ^ 0x1C) != 45 ) {m=7; goto LABEL_88;} if ( v1 + 2939247801 > 0xFFFFFFFF ) goto LABEL_31; v19 = *(_BYTE *)(a1 + 7) ^ 0x1A; v11 = (((((v19 + 8) ^ 9) + 3) ^ 0x25) + 4) ^ 0x30; v8 = v11 + 7; if ( ((unsigned __int8)((((v11 + 7) ^ 0x24) + 5) ^ 0x2F) ^ 0x2B) != 79 ) {m=8; goto LABEL_88;} if ( v1 + 512742110 <= 0xFFFFFFFF ) break; while ( 1 ) { if ( ((unsigned __int8)((((v8 ^ 0x39) + 3) ^ 0x36) + 3) ^ 0x16) != 171 ) {m=9; goto LABEL_88;} if ( v1 + 3944755611 <= 0xFFFFFFFF ) { v19 = *(_BYTE *)(a1 + 28) ^ 0x30; v10 = (((((v19 + 5) ^ 0x11) + 8) ^ 0x13) + 8) ^ 0x21; LABEL_75: v2 = (((v10 ^ 0x35) + 4) ^ 0x19) + 7; goto LABEL_76; } LABEL_32: v4 = v8 ^ 0x1B; if ( ((unsigned __int8)((v8 ^ 9) + 6) ^ 0x21) != 107 ) {m=10; goto LABEL_88;} if ( v1 + 2337003254 <= 0xFFFFFFFF ) { v18 = ((*(_BYTE *)(a1 + 13) ^ 0x2C) + 9) ^ 0x35; v12 = (v18 + 7) ^ 0x29; v5 = ((((v18 + 7) ^ 0x21) + 8) ^ 0xA) + 6; if ( ((unsigned __int8)((v5 ^ 0x26) + 10) ^ 0x2D) != 81 ) {m=11; goto LABEL_88;} if ( v1 + 491014096 > 0xFFFFFFFF ) goto LABEL_42; v17 = *(_BYTE *)(a1 + 14) ^ 0x1F; v3 = ((((v17 + 5) ^ 0x3A) + 2) ^ 0x27) + 2; if ( ((unsigned __int8)((v3 ^ 0x1B) + 9) ^ 0x16) != 61 ) {m=12; goto LABEL_88;} if ( v1 + 979202538 > 0xFFFFFFFF ) goto LABEL_15; v19 = *(_BYTE *)(a1 + 15) ^ 0x10; v15 = (((v19 + 10) ^ 0x14) + 7) ^ 3; LABEL_39: v11 = (v15 + 1) ^ 0x1E; v4 = ((v11 + 9) ^ 0x1A) + 7; if ( ((unsigned __int8)((v4 ^ 0x24) + 2) ^ 3) != 234 ) {m=13; goto LABEL_88;} if ( v1 + 794401946 <= 0xFFFFFFFF ) break; } while ( 1 ) { if ( ((unsigned __int8)((v4 ^ 0x2D) + 5) ^ 2) != 237 ) {m=14; goto LABEL_88;} if ( v1 + 894565626 <= 0xFFFFFFFF ) { v18 = ((*(_BYTE *)(a1 + 30) ^ 6) + 9) ^ 0x19; v14 = (v18 + 6) ^ 0x2C; goto LABEL_82; } LABEL_69: v2 = ((((v11 + 8) ^ 0x1B) + 3) ^ 0x1E) + 10; if ( (v2 ^ 0x34) != 181 ) {m=15; goto LABEL_88;} if ( v1 + 604121011 <= 0xFFFFFFFF ) break; LABEL_76: if ( (v2 ^ 0x12) != 111 ) {m=16; goto LABEL_88;} if ( v1 + 2158141150 > 0xFFFFFFFF ) goto LABEL_49; v19 = *(_BYTE *)(a1 + 29) ^ 0x11; v11 = (((((v19 + 9) ^ 6) + 1) ^ 0x15) + 1) ^ 0x3E; v4 = ((v11 + 9) ^ 0xF) + 9; } v19 = *(_BYTE *)(a1 + 27) ^ 0x36; v11 = (((((v19 + 3) ^ 0x14) + 2) ^ 0x3B) + 7) ^ 0x24; v8 = v11 + 9; } v18 = ((*(_BYTE *)(a1 + 16) ^ 4) + 3) ^ 7; v12 = v18 + 15; v5 = ((((v18 + 15) ^ 0x33) + 6) ^ 0x1C) + 7; LABEL_42: if ( ((unsigned __int8)((v5 ^ 0x2A) + 8) ^ 0x2D) != 98 ) {m=17; goto LABEL_88;} if ( v1 + 3124487324 <= 0xFFFFFFFF ) { v18 = ((*(_BYTE *)(a1 + 17) ^ 0x20) + 3) ^ 0x1D; v16 = v18 + 9; v9 = ((((v18 + 9) ^ 0x3F) + 8) ^ 8) + 10; if ( ((unsigned __int8)((((v9 ^ 0x23) + 3) ^ 0x11) + 5) ^ 0x28) != 101 ) {m=18; goto LABEL_88;} if ( v1 + 4270394038 <= 0xFFFFFFFF ) { v18 = ((*(_BYTE *)(a1 + 18) ^ 0x22) + 5) ^ 0x12; v14 = (v18 + 8) ^ 0xA; if ( ((unsigned __int8)(((((((v18 + 8) ^ 0x25) + 1) ^ 0x29) + 4) ^ 0x1F) + 4) ^ 0xF) == 72 ) { if ( v1 + 38557390 > 0xFFFFFFFF ) goto LABEL_52; v19 = *(_BYTE *)(a1 + 19) ^ 0x11; LABEL_49: v18 = (v19 + 6) ^ 0x2E; goto LABEL_50; } m=32; LABEL_88: if(n==m) { goto label; } else { n=m; i++; j=-1; goto label; } } goto LABEL_62; } } v18 = ((*(_BYTE *)(a1 + 8) ^ 0xC) + 1) ^ 0x34; v14 = (v18 + 1) ^ 6; v13 = v14 + 8; if ( ((unsigned __int8)(((((((v14 + 8) ^ 0x27) + 8) ^ 0x3B) + 2) ^ 0x23) + 3) ^ 0x16) != 76 ) {m=19; goto LABEL_88;} if ( v1 + 1600544217 > 0xFFFFFFFF ) goto LABEL_56; v17 = ((*(_BYTE *)(a1 + 9) ^ 0xA) + 4) ^ 0x3D; if ( ((unsigned __int8)(((((((((v17 + 10) ^ 0x37) + 1) ^ 0x19) + 1) ^ 0x23) + 9) ^ 0x38) + 4) ^ 0x29) != 67 ) {m=20; goto LABEL_88;} if ( v1 + 2943137373 <= 0xFFFFFFFF ) { v20 = *(_BYTE *)(a1 + 10) ^ 0xD; LABEL_27: v17 = (v20 + 5) ^ 0x3A; if ( ((unsigned __int8)(((((((((v17 + 6) ^ 0x28) + 5) ^ 0x1B) + 1) ^ 0x1D) + 7) ^ 0x39) + 3) ^ 0x36) != 82 ) {m=21; goto LABEL_88;} if ( v1 + 2820845284 <= 0xFFFFFFFF ) { v18 = ((*(_BYTE *)(a1 + 11) ^ 0x20) + 3) ^ 0x3C; if ( ((unsigned __int8)(((((((v18 + 10) ^ 0x3A) + 1) ^ 3) + 11) ^ 0x36) + 7) ^ 0x29) != 209 ) {m=22; goto LABEL_88;} if ( v1 + 1784190321 > 0xFFFFFFFF ) goto LABEL_50; LABEL_31: v19 = *(_BYTE *)(a1 + 12) ^ 9; v11 = (((((v19 + 3) ^ 0x2F) + 1) ^ 0x38) + 1) ^ 0x3F; v8 = v11 + 8; goto LABEL_32; } } while ( 1 ) { LABEL_59: if ( ((unsigned __int8)(((((((((v17 + 5) ^ 0x3A) + 7) ^ 0x1A) + 7) ^ 0xC) + 2) ^ 0x28) + 5) ^ 0x2A) != 101 || v1 + 2621123087 > 0xFFFFFFFF ) {m=23; goto LABEL_88;} v18 = *(_BYTE *)(a1 + 23) ^ 0x23; v16 = v18 + 3; v9 = ((((v18 + 3) ^ 9) + 3) ^ 0x1B) + 9; LABEL_62: if ( ((unsigned __int8)((((v9 ^ 0x11) + 2) ^ 0x3A) + 8) ^ 0xC) != 115 ) {m=24; goto LABEL_88;} if ( v1 + 649342143 > 0xFFFFFFFF ) break; v17 = ((*(_BYTE *)(a1 + 24) ^ 0x29) + 2) ^ 0x18; if ( ((unsigned __int8)(((((((v17 + 3) ^ 8) + 5) ^ 0x22) + 10) ^ 0x22) + 5) ^ 0x3A) != 98 ) {m=25; goto LABEL_88;} if ( v1 + 975235895 <= 0xFFFFFFFF ) { v19 = *(_BYTE *)(a1 + 25) ^ 0x2B; v15 = (((v19 + 1) ^ 0x1F) + 7) ^ 2; if ( ((unsigned __int8)(((((((v15 + 5) ^ 0x20) + 5) ^ 0x37) + 4) ^ 8) + 9) ^ 0x1F) != 129 ) {m=26; goto LABEL_88;} if ( v1 + 1883000249 <= 0xFFFFFFFF ) { v19 = *(_BYTE *)(a1 + 26) ^ 9; v11 = (((((v19 + 3) ^ 0x35) + 3) ^ 0x2E) + 10) ^ 0xE; goto LABEL_69; } goto LABEL_39; } } while ( 1 ) { v14 = v16 ^ 0xB; if ( ((unsigned __int8)((((((((v16 ^ 0xB) + 6) ^ 0x24) + 9) ^ 0x1E) + 4) ^ 0x2A) + 5) ^ 0x21) != 98 ) {m=27; goto LABEL_88;} LABEL_52: if ( v1 + 188860014 <= 0xFFFFFFFF ) { v20 = *(_BYTE *)(a1 + 20) ^ 0x3C; if ( ((unsigned __int8)((((((((v20 + 4) ^ 0x27) + 3) ^ 4) + 9) ^ 3) + 4) ^ 0x36) ^ 0x27) != 150 ) {m=28; goto LABEL_88;} if ( v1 + 3222692128 > 0xFFFFFFFF ) goto LABEL_27; v18 = ((*(_BYTE *)(a1 + 21) ^ 0x2C) + 1) ^ 0x28; v14 = (v18 + 5) ^ 0x27; v13 = (v18 + 5) ^ 0x27; LABEL_56: if ( ((unsigned __int8)(((((v13 ^ 0x3A) + 7) ^ 1) + 10) ^ 0x2F) ^ 0x1B) != 69 ) {m=29; goto LABEL_88;} if ( v1 + 1175584883 <= 0xFFFFFFFF ) { v17 = ((*(_BYTE *)(a1 + 22) ^ 0x33) + 4) ^ 0x38; goto LABEL_59; } } LABEL_82: v6 = (((v14 + 7) ^ 0xF) + 10) ^ 0x24; LABEL_83: if ( ((unsigned __int8)(((v6 + 7) ^ 8) + 7) ^ 0x2E) != 187 ) {m=30; goto LABEL_88;} if ( v1 + 4239419545 <= 0xFFFFFFFF ) { if ( ((unsigned __int8)((((((((((((*(_BYTE *)(a1 + 31) ^ 8) + 7) ^ 0x2C) + 6) ^ 0x3C) + 3) ^ 0x17) + 8) ^ 0x30) + 6) ^ 0x3C) + 6) ^ 0x17) == 56 ) { printf("Congratulations!The flag is %s\n", a1); system("pause"); } {m=31; goto LABEL_88;} } LABEL_50: v16 = v18 + 7; } label:continue; } }