[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 << "}
";
294     return 0;
295 }

原文地址:https://www.cnblogs.com/Tsuiyields/p/13915283.html