[WP]XCTF-Reversing-Newbie_calculations
1、32 位程序,无壳
2、运行程序发现没有动静,可以猜测代码中有需要大量时间的冗余代码。
3、载入 IDA 中
main 函数调用了很多函数看着很吓人,其实只有三种函数。sub_401000, sub_401100, sub_401220
sub_401000 --> add 加法运算
这里不需要分析一个负数减到 0 到底进行多少次运算,我们可以试想一下如果 v4 是一个正数,例如 3,那么第一个循环也就进行了三次,a1 实际上进行的运算为 a1 -= 3,那么不管 v4 是多少,实际上都是 a1 -= v4而已。在进行这种负数的分析时,可以直接用结果来简化分析,而不考虑中间究竟是如火变化的。
sub_401100 --> mul 乘法运算
循环加也就是一个乘法运算
sub_401220 --> sub 减法运算
4、根据 IDA 中的 main 函数稍加修改后得到 EXP,运行得到 flag。
1 #include<iostream> 2 using namespace std; 3 4 int add(int a1, int a2) 5 { 6 return (a1 + a2); 7 } 8 9 int mul(int a1, int a2) 10 { 11 return (a1 * a2); 12 } 13 14 int sub(int a1, int a2) 15 { 16 return (a1 - a2); 17 } 18 19 int main() 20 { 21 int v3; // eax@4 22 int v4; // eax@4 23 int v5; // eax@4 24 int v6; // eax@4 25 int v7; // eax@4 26 int v8; // eax@4 27 int v9; // eax@4 28 int v10; // eax@4 29 int v11; // eax@4 30 int v12; // eax@4 31 int v13; // eax@4 32 int v14; // eax@4 33 int v15; // eax@4 34 int v16; // eax@4 35 int v17; // eax@4 36 int v18; // eax@4 37 int v19; // eax@4 38 int v20; // eax@4 39 int v21; // eax@4 40 int v22; // eax@4 41 int v23; // eax@4 42 int v24; // eax@4 43 int v25; // eax@4 44 int v26; // eax@4 45 int v27; // eax@4 46 int v28; // eax@4 47 int v29; // eax@4 48 int v30; // eax@4 49 int v31; // eax@4 50 int v32; // eax@4 51 int v33; // eax@4 52 int v34; // eax@4 53 int v35; // eax@4 54 int v36; // eax@4 55 int v37; // eax@4 56 int v38; // eax@4 57 int v39; // eax@4 58 int v40; // eax@4 59 int v41; // eax@4 60 int v42; // eax@4 61 int v43; // eax@4 62 int v44; // eax@4 63 int v45; // eax@4 64 int v46; // eax@4 65 int v47; // eax@4 66 int v48; // eax@4 67 int v49; // eax@4 68 int v50; // eax@4 69 int v51; // eax@4 70 int v52; // eax@4 71 int v53; // eax@4 72 int v54; // eax@4 73 int v55; // eax@4 74 int v56; // eax@4 75 int v57; // eax@4 76 int v58; // eax@4 77 int v59; // eax@4 78 int v60; // eax@4 79 int v61; // eax@4 80 int v62; // eax@4 81 int v63; // eax@4 82 int v64; // eax@4 83 int v65; // eax@4 84 int v66; // eax@4 85 int v67; // eax@4 86 int v68; // eax@4 87 int v69; // eax@4 88 int v70; // eax@4 89 int v71; // eax@4 90 int v72; // eax@4 91 int v73; // eax@4 92 int v74; // eax@4 93 int v75; // eax@4 94 int v76; // eax@4 95 int v77; // eax@4 96 int v78; // eax@4 97 int v79; // eax@4 98 int v80; // eax@4 99 int v81; // eax@4 100 int v82; // eax@4 101 int v83; // eax@4 102 int v84; // eax@4 103 int v85; // eax@4 104 int v86; // eax@4 105 int v87; // eax@4 106 int v88; // eax@4 107 int v89; // eax@4 108 int v90; // eax@4 109 int v91; // eax@4 110 int v92; // eax@4 111 int v93; // eax@4 112 int v94; // eax@4 113 int v95; // eax@4 114 int v96; // eax@4 115 int v97; // eax@4 116 int v98; // eax@4 117 int v99; // eax@4 118 int v100; // eax@4 119 int v101; // eax@4 120 int v102; // eax@4 121 int v103; // eax@4 122 int v104; // eax@4 123 int v105; // eax@4 124 int v106; // eax@4 125 int v107; // eax@4 126 int v108; // eax@4 127 int v109; // ST1C_4@4 128 int v110; // eax@4 129 int v111; // eax@4 130 int v112; // ST20_4@4 131 int v113; // eax@4 132 int v114; // eax@4 133 int v115; // ST20_4@4 134 int v116; // eax@4 135 signed int i; // [sp+4h] [bp-90h]@1 136 signed int j; // [sp+8h] [bp-8Ch]@4 137 int v120[33]; // [sp+Ch] [bp-88h]@3 138 139 140 for (i = 0; i < 32; ++i) 141 v120[i] = 1; 142 v120[32] = 0; 143 cout << "Your flag is:"; 144 v3 = mul(v120[0], 1000000000); 145 v4 = sub(v3, 999999950); 146 v120[0] = mul(v4, 2); 147 v5 = add(v120[1], 5000000); 148 v6 = sub(v5, 6666666); 149 v7 = add(v6, 1666666); 150 v8 = add(v7, 45); 151 v9 = mul(v8, 2); 152 v120[1] = add(v9, 5); 153 v10 = mul(v120[2], 1000000000); 154 v11 = sub(v10, 999999950); 155 v12 = mul(v11, 2); 156 v120[2] = add(v12, 2); 157 v13 = add(v120[3], 55); 158 v14 = sub(v13, 3); 159 v15 = add(v14, 4); 160 v120[3] = sub(v15, 1); 161 v16 = mul(v120[4], 100000000); 162 v17 = sub(v16, 99999950); 163 v18 = mul(v17, 2); 164 v120[4] = add(v18, 2); 165 v19 = sub(v120[5], 1); 166 v20 = mul(v19, 1000000000); 167 v21 = add(v20, 55); 168 v120[5] = sub(v21, 3); 169 v22 = mul(v120[6], 1000000); 170 v23 = sub(v22, 999975); 171 v120[6] = mul(v23, 4); 172 v24 = add(v120[7], 55); 173 v25 = sub(v24, 33); 174 v26 = add(v25, 44); 175 v120[7] = sub(v26, 11); 176 v27 = mul(v120[8], 10); 177 v28 = sub(v27, 5); 178 v29 = mul(v28, 8); 179 v120[8] = add(v29, 9); 180 v30 = add(v120[9], 0); 181 v31 = sub(v30, 0); 182 v32 = add(v31, 11); 183 v33 = sub(v32, 11); 184 v120[9] = add(v33, 53); 185 v34 = add(v120[10], 49); 186 v35 = sub(v34, 2); 187 v36 = add(v35, 4); 188 v120[10] = sub(v36, 2); 189 v37 = mul(v120[11], 1000000); 190 v38 = sub(v37, 999999); 191 v39 = mul(v38, 4); 192 v120[11] = add(v39, 50); 193 v40 = add(v120[12], 1); 194 v41 = add(v40, 1); 195 v42 = add(v41, 1); 196 v43 = add(v42, 1); 197 v44 = add(v43, 1); 198 v45 = add(v44, 1); 199 v46 = add(v45, 10); 200 v120[12] = add(v46, 32); 201 v47 = mul(v120[13], 10); 202 v48 = sub(v47, 5); 203 v49 = mul(v48, 8); 204 v50 = add(v49, 9); 205 v120[13] = add(v50, 48); 206 v51 = sub(v120[14], 1); 207 v52 = mul(v51, -294967296); 208 v53 = add(v52, 55); 209 v120[14] = sub(v53, 3); 210 v54 = add(v120[15], 1); 211 v55 = add(v54, 2); 212 v56 = add(v55, 3); 213 v57 = add(v56, 4); 214 v58 = add(v57, 5); 215 v59 = add(v58, 6); 216 v60 = add(v59, 7); 217 v120[15] = add(v60, 20); 218 v61 = mul(v120[16], 10); 219 v62 = sub(v61, 5); 220 v63 = mul(v62, 8); 221 v64 = add(v63, 9); 222 v120[16] = add(v64, 48); 223 v65 = add(v120[17], 7); 224 v66 = add(v65, 6); 225 v67 = add(v66, 5); 226 v68 = add(v67, 4); 227 v69 = add(v68, 3); 228 v70 = add(v69, 2); 229 v71 = add(v70, 1); 230 v120[17] = add(v71, 20); 231 v72 = add(v120[18], 7); 232 v73 = add(v72, 2); 233 v74 = add(v73, 4); 234 v75 = add(v74, 3); 235 v76 = add(v75, 6); 236 v77 = add(v76, 5); 237 v78 = add(v77, 1); 238 v120[18] = add(v78, 20); 239 v79 = mul(v120[19], 1000000); 240 v80 = sub(v79, 999999); 241 v81 = mul(v80, 4); 242 v82 = add(v81, 50); 243 v120[19] = sub(v82, 1); 244 v83 = sub(v120[20], 1); 245 v84 = mul(v83, -294967296); 246 v85 = add(v84, 49); 247 v120[20] = sub(v85, 1); 248 v86 = sub(v120[21], 1); 249 v87 = mul(v86, 1000000000); 250 v88 = add(v87, 54); 251 v89 = sub(v88, 1); 252 v90 = add(v89, 1000000000); 253 v120[21] = sub(v90, 1000000000); 254 v91 = add(v120[22], 49); 255 v92 = sub(v91, 1); 256 v93 = add(v92, 2); 257 v120[22] = sub(v93, 1); 258 v94 = mul(v120[23], 10); 259 v95 = sub(v94, 5); 260 v96 = mul(v95, 8); 261 v97 = add(v96, 9); 262 v120[23] = add(v97, 48); 263 v98 = add(v120[24], 1); 264 v99 = add(v98, 3); 265 v100 = add(v99, 3); 266 v101 = add(v100, 3); 267 v102 = add(v101, 6); 268 v103 = add(v102, 6); 269 v104 = add(v103, 6); 270 v120[24] = add(v104, 20); 271 v105 = add(v120[25], 55); 272 v106 = sub(v105, 33); 273 v107 = add(v106, 44); 274 v108 = sub(v107, 11); 275 v120[25] = add(v108, 42); 276 v120[26] = add(v120[26], v120[25]); 277 v120[27] = add(v120[27], v120[12]); 278 v109 = v120[27]; 279 v110 = sub(v120[28], 1); 280 v111 = add(v110, v109); 281 v120[28] = sub(v111, 1); 282 v112 = v120[23]; 283 v113 = sub(v120[29], 1); 284 v114 = mul(v113, 1000000); 285 v120[29] = add(v114, v112); 286 v115 = v120[27]; 287 v116 = add(v120[30], 1); 288 v120[30] = mul(v116, v115); 289 v120[31] = add(v120[31], v120[30]); 290 cout << "CTF{"; 291 for (j = 0; j < 32; ++j) 292 cout << char(v120[j]); 293 cout << "}\n"; 294 return 0; 295 }