-
-
[原创]第二题 南冥神功
-
2021-5-12 12:53 4737
-
第二题 南冥神功
找到main函数,首先看了最后的判断条件。
即要让下面这个数组中的每个数都不为0:
到上面的核心代码找到唯一修改这个数组值的地方:
然后分析一下那几个跳转的逻辑熟悉程序功能,就是每个输入的序号和输入在一个指定数组中的对应索引来作为每次的运算,进而决定要修改目标数组的位置。
注意到有好几个跳转错误逻辑的条件,那这里很大的缩小了满足的输入。所以用dfs来搜一下应该是可行的。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | #include <stdio.h> #include <malloc.h> #include <string.h> char a[] = { 83 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 1 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 0 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , }; char t[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; char flag[ 100 ], tmp_a[ 90 ]; unsigned int v9, v21; int check() { int i, j; for (i = 0 ; i < 9 ; i + + ) { for (j = 0 ; j < 10 ; j + + ) { if (a[ 10 * i + j] = = 0 ) return 0 ; } } return 1 ; } int fun( int v4, int v5) { int v7, v8, v20, v10, i, v17, v12, v19, v18; char * v13; v7 = (v4 + v5 / 6 ) % 6 ; v8 = v5 + v4; v20 = v7; v10 = 5 - v8 % 6 ; for (i = 0 ; i < 2 ; i + + ) { switch (v10) { case 1 : + + v9; break ; case 2 : v17 = (v21 + + & 1 ) = = 0 ; v9 + = v17; break ; case 3 : v12 = (v21 + + & 1 ) ! = 0 ; v9 - = v12; break ; case 4 : - - v9; break ; case 5 : v19 = (v21 - - & 1 ) ! = 0 ; v9 - = v19; break ; default: v18 = (v21 - - & 1 ) = = 0 ; v9 + = v18; break ; } if ( v9 > 9 ) return 0 ; if ( v21 > 8 ) return 0 ; v13 = &a[ 10 * v21 + v9]; if ( * v13 ) return 0 ; * v13 = 1 ; v10 = v20; } return 1 ; } void dfs( int step) { int i; if (step > 48 ) return ; if (check()) { printf( "%d\n" , step); printf( "found: %s\n" , flag); getchar(); } puts(flag); for (i = 0 ; i < 36 ; i + + ) { flag[step] = t[i], flag[step + 1 ] = 0 ; int tmp = v9, tmp1 = v21; char * tmp_a = (char * )alloca( 90 ); memcpy(tmp_a, a, 90 ); if (fun(step, i)) dfs(step + 1 ); v9 = tmp, v21 = tmp1; memcpy(a, tmp_a, 90 ); } return ; } int main(void) { dfs( 0 ); return 0 ; } / / GJ0V4LA4VKEVQZSVCNGJ00N |
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2021-5-12 12:56
被Bxb0编辑
,原因:
赞赏
他的文章
看原图