• [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 }

  • 相关阅读:
    机器学习入坑指南(二):数据预处理
    03双向链表
    小甲鱼 例题
    快慢指针问题
    02循环单链表
    01静态链表
    阈值化
    图像金字塔与图片尺寸缩放
    水漫填充
    形态学滤波(4):使用分水岭算法对图像进行分割
  • 原文地址:https://www.cnblogs.com/Tsuiyields/p/13915283.html
Copyright © 2020-2023  润新知