notsequence 寒假逆向生涯(9/100)
notsequence
這題目,挺簡單的,首先無殼,直接拖進ida,然后查看了一下偽代碼
輕易發現只需要滿足三點就行
- sub_80486CD((int)&unk_8049BE0)
- (unsigned __int8)sub_8048783((int)&unk_8049BE0, v2) ^ 1
- v2 == 20
第一個滿足條件
sub_80486CD((int)&unk_8049BE0)
偽代碼
signed int __cdecl sub_80486CD(int a1) {int j; // [sp+0h] [bp-14h]@4int v3; // [sp+4h] [bp-10h]@4int i; // [sp+8h] [bp-Ch]@1int v5; // [sp+Ch] [bp-8h]@1v5 = 0;for ( i = 0; i <= 1024 && *(_DWORD *)(4 * i + a1); i = v5 * (v5 + 1) / 2 ){v3 = 0;for ( j = 0; j <= v5; ++j )v3 += *(_DWORD *)(4 * (j + i) + a1);if ( 1 << v5 != v3 )return -1;++v5;}return v5; }c++核心代碼
v5=0; for(int i =0;i<=1024 && a[i];i=v5*(v5+1)/2) {v3=0;for(j=0;j<=v5;++j)v3+=a[i+j]; //if(1<<v5 != v3)//滿足2的v5次方==v3return -1;++v5; }解釋
- v5取值0,1,2,3,4,5,6,7……
- v5決定了for循環依次得執行1,2,3,4,5,6,7,8次……(即依次取輸入數組第i項后1,2,3,4,5,6,7,8個元素)
- i取值為0,1,3,6,10,15,21,28………………
則v3依次為輸入數組的第i項之后v5+1個數之和
舉個例子:
v5=0 i=0 for循環執行一次
v3就為 a[0]
v5=1 i=1 for循環執行兩次
v3就為 a[1]+a[2]
v5=2 i=3 for循環執行三次
v3就為 a[3]+a[4]+a[5]
v5=3 i=6 for循環執行四次
v3就為 a[6]+a[7]+a[8]+a[9]
………………
a[0] a[1]+a[2] a[3]+a[4]+a[5] a[6]+a[7]+a[8]+a[9] …………………………………………特別注意這個關系
v5=行號-1
代表著 每一行值的和必須等于2的(行號-1)次方
第二個滿足條件
sub_8048783
偽代碼
signed int __cdecl sub_8048783(int a1, signed int a2) {int v3; // [sp+10h] [bp-10h]@2int v4; // [sp+14h] [bp-Ch]@2signed int i; // [sp+18h] [bp-8h]@1int v6; // [sp+1Ch] [bp-4h]@1v6 = 0;for ( i = 1; i < a2; ++i ){v4 = 0;v3 = i - 1;if ( !*(_DWORD *)(4 * i + a1) )return 0;while ( a2 - 1 > v3 ){v4 += *(_DWORD *)(4 * (v3 * (v3 + 1) / 2 + v6) + a1);++v3;}if ( *(_DWORD *)(4 * (v3 * (v3 + 1) / 2 + i) + a1) != v4 )return 0;++v6;}return 1; }c++核心代碼
int v6 =0; for(int i=1;i<a2;++i){v4=0;v3=i-1;if(!a[i])return 0;while(a2-1>v3){v4+=a1[v3*(v3+1)/2+v6];++v3;}if(a1[v3*(v3+1)/2+i]!=v4)return 0;++v6; } return 1;仔細觀察了一下,就感覺這個下標v3*(v3+1)/2+i和上面的下標v3*(v3+1)/2+v6所對應的元素值和v4之間的關系挺重要的,用vs加點東西輸出一下試試
#include <iostream> using namespace std; int main() {int a1[2000] = { 0 };int a2 = 20;int v6 = 0;for (int i = 1; i < a2; ++i) {int v4 = 0;int v3 = i - 1;if (!a1[i])//return 0;while (a2 - 1 > v3) {v4 += a1[v3 * (v3 + 1) / 2 + v6];cout << v3 * (v3 + 1) / 2 + v6 << endl;++v3;}cout <<"這個下標為:" <<(v3 * (v3 + 1) / 2 + i)<<endl;if (a1[v3 * (v3 + 1) / 2 + i] != v4);++v6;}}
首先提醒一下,我們這里輸出的全是輸入數組的下標,我們把它們合并一下,看看情況如何:
0 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 95 96 97 98 99 100 101 102 103 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209特別注意這個關系
仔細觀察代碼和下標關系
每一列的和等于一列中最后一行斜下角(后一列,后一行)那個數字
綜上所述
需要滿足條件為:
好家伙,搞了半天,不就是楊輝三角嘛。。。。
自行查看(第11條和第12條):
https://baike.baidu.com/item/%E6%9D%A8%E8%BE%89%E4%B8%89%E8%A7%92/215098?fr=aladdin
11.第n行數字的和為2(n-1)。1=2(1-1),1+1=2(2-1),1+2+1=2(3-1),1+3+3+1=2(4-1),1+4+6+4+1=2(5-1),1+5+10+10+5+1=2(6-1)
。這個對應的不就是第一條嘛
12.斜線上數字的和等于其向左(從左上方到右下方的斜線)或向右拐彎(從右上方到左下方的斜線),拐角上的數字。1+1=2,1+1+1=3,1+1+1+1=4,1+2=3,1+2+3=6,1+2+3+4=10,1+3=4,1+3+6=10,1+4=5。
對照來看,不就是一個對齊了,方便看,一個沒對齊嘛,體諒一下,我輸完挺難的。。。
第三個滿足條件
v2==20的條件也就是楊輝三角的層數等于20
GAMEOVER(上代碼)
輸入20層的楊輝三角的c++代碼
#include <iostream> using namespace std; int main() {int a[30][30] = { 0 };int j = 1;for (int i = 1; i <= 20; i++)a[i][1] = 1;for (int i = 2; i <= 20; i++)for (int j = 1; j <= i; j++)a[i][j] = a[i - 1][j - 1] + a[i - 1][j];for (int i = 1; i <= 20; i++)for (int j = 1; j <= i; j++)cout << a[i][j];} 1111211331146411510105116152015611721353521711828567056288119368412612684369111045120210252210120451011115516533046246233016555111112662204957929247924952206612111378286715128717161716128771528678131114913641001200230033432300320021001364911411151054551365300350056435643550053003136545510515111612056018204368800811440128701144080084368182056012016111713668023806188123761944824310243101944812376618823806801361711181538163060856818564318244375848620437583182418564856830608161531811191719693876116282713250388755829237892378755825038827132116283876969171191然后再去md5網站進行加密一下,包上RCTF{},即得到flag:
flag:RCTF{37894beff1c632010dd6d524aa9604db}
總結
以上是生活随笔為你收集整理的notsequence 寒假逆向生涯(9/100)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: secret-galaxy-300
- 下一篇: deedeedee crazy 寒