XCTF Newbie_calculations

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  int v4; // eax
  int v5; // eax
  int v6; // eax
  int v7; // eax
  int v8; // eax
  int v9; // eax
  int v10; // eax
  int v11; // eax
  int v12; // eax
  int v13; // eax
  int v14; // eax
  int v15; // eax
  int v16; // eax
  int v17; // eax
  int v18; // eax
  int v19; // eax
  int v20; // eax
  int v21; // eax
  int v22; // eax
  int v23; // eax
  int v24; // eax
  int v25; // eax
  int v26; // eax
  int v27; // eax
  int v28; // eax
  int v29; // eax
  int v30; // eax
  int v31; // eax
  int v32; // eax
  int v33; // eax
  int v34; // eax
  int v35; // eax
  int v36; // eax
  int v37; // eax
  int v38; // eax
  int v39; // eax
  int v40; // eax
  int v41; // eax
  int v42; // eax
  int v43; // eax
  int v44; // eax
  int v45; // eax
  int v46; // eax
  int v47; // eax
  int v48; // eax
  int v49; // eax
  int v50; // eax
  int v51; // eax
  int v52; // eax
  int v53; // eax
  int v54; // eax
  int v55; // eax
  int v56; // eax
  int v57; // eax
  int v58; // eax
  int v59; // eax
  int v60; // eax
  int v61; // eax
  int v62; // eax
  int v63; // eax
  int v64; // eax
  int v65; // eax
  int v66; // eax
  int v67; // eax
  int v68; // eax
  int v69; // eax
  int v70; // eax
  int v71; // eax
  int v72; // eax
  int v73; // eax
  int v74; // eax
  int v75; // eax
  int v76; // eax
  int v77; // eax
  int v78; // eax
  int v79; // eax
  int v80; // eax
  int v81; // eax
  int v82; // eax
  int v83; // eax
  int v84; // eax
  int v85; // eax
  int v86; // eax
  int v87; // eax
  int v88; // eax
  int v89; // eax
  int v90; // eax
  int v91; // eax
  int v92; // eax
  int v93; // eax
  int v94; // eax
  int v95; // eax
  int v96; // eax
  int v97; // eax
  int v98; // eax
  int v99; // eax
  int v100; // eax
  int v101; // eax
  int v102; // eax
  int v103; // eax
  int v104; // eax
  int v105; // eax
  int v106; // eax
  int v107; // eax
  int v108; // eax
  int v109; // eax
  int v110; // eax
  int v111; // eax
  int v112; // eax
  int v113; // eax
  int v115; // [esp-8h] [ebp-9Ch]
  int v116; // [esp-4h] [ebp-98h]
  int v117; // [esp-4h] [ebp-98h]
  int i; // [esp+4h] [ebp-90h]
  int j; // [esp+8h] [ebp-8Ch]
  int v120[12]; // [esp+Ch] [ebp-88h] BYREF
  int v121[12]; // [esp+10h] [ebp-84h] BYREF
  int v122[12]; // [esp+14h] [ebp-80h] BYREF
  int v123[12]; // [esp+18h] [ebp-7Ch] BYREF
  int v124[12]; // [esp+1Ch] [ebp-78h] BYREF
  int v125[12]; // [esp+20h] [ebp-74h] BYREF
  int v126[12]; // [esp+24h] [ebp-70h] BYREF
  int v127[12]; // [esp+28h] [ebp-6Ch] BYREF
  int v128[12]; // [esp+2Ch] [ebp-68h] BYREF
  int v129[12]; // [esp+30h] [ebp-64h] BYREF
  int v130[12]; // [esp+34h] [ebp-60h] BYREF
  int v131[12]; // [esp+38h] [ebp-5Ch] BYREF
  int v132; // [esp+3Ch] [ebp-58h] BYREF
  int v133; // [esp+40h] [ebp-54h] BYREF
  int v134; // [esp+44h] [ebp-50h] BYREF
  int v135; // [esp+48h] [ebp-4Ch] BYREF
  int v136; // [esp+4Ch] [ebp-48h] BYREF
  int v137; // [esp+50h] [ebp-44h] BYREF
  int v138; // [esp+54h] [ebp-40h] BYREF
  int v139; // [esp+58h] [ebp-3Ch] BYREF
  int v140; // [esp+5Ch] [ebp-38h] BYREF
  int v141; // [esp+60h] [ebp-34h] BYREF
  int v142; // [esp+64h] [ebp-30h] BYREF
  int v143; // [esp+68h] [ebp-2Ch] BYREF
  int v144; // [esp+6Ch] [ebp-28h] BYREF
  int v145; // [esp+70h] [ebp-24h] BYREF
  int v146; // [esp+74h] [ebp-20h] BYREF
  int v147; // [esp+78h] [ebp-1Ch] BYREF
  int v148; // [esp+7Ch] [ebp-18h] BYREF
  int v149; // [esp+80h] [ebp-14h] BYREF
  int v150; // [esp+84h] [ebp-10h] BYREF
  _DWORD v151[2]; // [esp+88h] [ebp-Ch] BYREF

  for ( i = 0; i < 32; ++i )
    v120[i] = 1;
  v151[1] = 0;
  puts("Your flag is:");
  v3 = sub_401100(v120, 1000000000);
  v4 = sub_401220(v3, 999999950);
  sub_401100(v4, 2);
  v5 = sub_401000(v121, 5000000);
  v6 = sub_401220(v5, 6666666);
  v7 = sub_401000(v6, 1666666);
  v8 = sub_401000(v7, 45);
  v9 = sub_401100(v8, 2);
  sub_401000(v9, 5);
  v10 = sub_401100(v122, 1000000000);
  v11 = sub_401220(v10, 999999950);
  v12 = sub_401100(v11, 2);
  sub_401000(v12, 2);
  v13 = sub_401000(v123, 55);
  v14 = sub_401220(v13, 3);
  v15 = sub_401000(v14, 4);
  sub_401220(v15, 1);
  v16 = sub_401100(v124, 100000000);
  v17 = sub_401220(v16, 99999950);
  v18 = sub_401100(v17, 2);
  sub_401000(v18, 2);
  v19 = sub_401220(v125, 1);
  v20 = sub_401100(v19, 1000000000);
  v21 = sub_401000(v20, 55);
  sub_401220(v21, 3);
  v22 = sub_401100(v126, 1000000);
  v23 = sub_401220(v22, 999975);
  sub_401100(v23, 4);
  v24 = sub_401000(v127, 55);
  v25 = sub_401220(v24, 33);
  v26 = sub_401000(v25, 44);
  sub_401220(v26, 11);
  v27 = sub_401100(v128, 10);
  v28 = sub_401220(v27, 5);
  v29 = sub_401100(v28, 8);
  sub_401000(v29, 9);
  v30 = sub_401000(v129, 0);
  v31 = sub_401220(v30, 0);
  v32 = sub_401000(v31, 11);
  v33 = sub_401220(v32, 11);
  sub_401000(v33, 53);
  v34 = sub_401000(v130, 49);
  v35 = sub_401220(v34, 2);
  v36 = sub_401000(v35, 4);
  sub_401220(v36, 2);
  v37 = sub_401100(v131, 1000000);
  v38 = sub_401220(v37, 999999);
  v39 = sub_401100(v38, 4);
  sub_401000(v39, 50);
  v40 = sub_401000(&v132, 1);
  v41 = sub_401000(v40, 1);
  v42 = sub_401000(v41, 1);
  v43 = sub_401000(v42, 1);
  v44 = sub_401000(v43, 1);
  v45 = sub_401000(v44, 1);
  v46 = sub_401000(v45, 10);
  sub_401000(v46, 32);
  v47 = sub_401100(&v133, 10);
  v48 = sub_401220(v47, 5);
  v49 = sub_401100(v48, 8);
  v50 = sub_401000(v49, 9);
  sub_401000(v50, 48);
  v51 = sub_401220(&v134, 1);
  v52 = sub_401100(v51, -294967296);
  v53 = sub_401000(v52, 55);
  sub_401220(v53, 3);
  v54 = sub_401000(&v135, 1);
  v55 = sub_401000(v54, 2);
  v56 = sub_401000(v55, 3);
  v57 = sub_401000(v56, 4);
  v58 = sub_401000(v57, 5);
  v59 = sub_401000(v58, 6);
  v60 = sub_401000(v59, 7);
  sub_401000(v60, 20);
  v61 = sub_401100(&v136, 10);
  v62 = sub_401220(v61, 5);
  v63 = sub_401100(v62, 8);
  v64 = sub_401000(v63, 9);
  sub_401000(v64, 48);
  v65 = sub_401000(&v137, 7);
  v66 = sub_401000(v65, 6);
  v67 = sub_401000(v66, 5);
  v68 = sub_401000(v67, 4);
  v69 = sub_401000(v68, 3);
  v70 = sub_401000(v69, 2);
  v71 = sub_401000(v70, 1);
  sub_401000(v71, 20);
  v72 = sub_401000(&v138, 7);
  v73 = sub_401000(v72, 2);
  v74 = sub_401000(v73, 4);
  v75 = sub_401000(v74, 3);
  v76 = sub_401000(v75, 6);
  v77 = sub_401000(v76, 5);
  v78 = sub_401000(v77, 1);
  sub_401000(v78, 20);
  v79 = sub_401100(&v139, 1000000);
  v80 = sub_401220(v79, 999999);
  v81 = sub_401100(v80, 4);
  v82 = sub_401000(v81, 50);
  sub_401220(v82, 1);
  v83 = sub_401220(&v140, 1);
  v84 = sub_401100(v83, -294967296);
  v85 = sub_401000(v84, 49);
  sub_401220(v85, 1);
  v86 = sub_401220(&v141, 1);
  v87 = sub_401100(v86, 1000000000);
  v88 = sub_401000(v87, 54);
  v89 = sub_401220(v88, 1);
  v90 = sub_401000(v89, 1000000000);
  sub_401220(v90, 1000000000);
  v91 = sub_401000(&v142, 49);
  v92 = sub_401220(v91, 1);
  v93 = sub_401000(v92, 2);
  sub_401220(v93, 1);
  v94 = sub_401100(&v143, 10);
  v95 = sub_401220(v94, 5);
  v96 = sub_401100(v95, 8);
  v97 = sub_401000(v96, 9);
  sub_401000(v97, 48);
  v98 = sub_401000(&v144, 1);
  v99 = sub_401000(v98, 3);
  v100 = sub_401000(v99, 3);
  v101 = sub_401000(v100, 3);
  v102 = sub_401000(v101, 6);
  v103 = sub_401000(v102, 6);
  v104 = sub_401000(v103, 6);
  sub_401000(v104, 20);
  v105 = sub_401000(&v145, 55);
  v106 = sub_401220(v105, 33);
  v107 = sub_401000(v106, 44);
  v108 = sub_401220(v107, 11);
  sub_401000(v108, 42);
  sub_401000(&v146, v145);
  sub_401000(&v147, v132);
  v115 = v147;
  v109 = sub_401220(&v148, 1);
  v110 = sub_401000(v109, v115);
  sub_401220(v110, 1);
  v116 = v143;
  v111 = sub_401220(&v149, 1);
  v112 = sub_401100(v111, 1000000);
  sub_401000(v112, v116);
  v117 = v147;
  v113 = sub_401000(&v150, 1);
  sub_401100(v113, v117);
  sub_401000(v151, v150);
  sub_401C7F("CTF{", 1);
  for ( j = 0; j < 32; ++j )
    sub_401C7F("%c", SLOBYTE(v120[j]));
  sub_401C7F("}\n");
  return 0;
}

进入到main函数,源码如上,十分复杂,经过仔细观察可以发现,一长串的内容其实只有3个函数
我们发现:

for ( i = 0; i < 32; ++i )
    v120[i] = 1;

这里v120应该是32个字节,而定义时为int v120[12];,我们修改成32.
首先进入sub_401000函数:

DWORD *__cdecl sub_401000(_DWORD *a1, int a2)
{
  int v3; // [esp+Ch] [ebp-18h]
  int v4; // [esp+10h] [ebp-14h]
  int v5; // [esp+18h] [ebp-Ch]
  int v6; // [esp+1Ch] [ebp-8h]

  v4 = -1;
  v3 = -1 - a2 + 1;//v3=-a2
  v6 = 1231;
  v5 = a2 + 1231;
  while ( v3 )     //a1=a1-v3=a1+a2
  {
    ++v6;
    --*a1;
    --v3;
    --v5;
  }
  while ( v4 )     //v4=-1        a1=a1+v4=a1-1
  {
    --v5;
    ++*a1;
    --v4;
  }
  ++*a1;//a1=a1+1
  return a1;//a1=a1+a2
}

while(v4)是while(-1),其内由–v4这样的操作,v4一直减到0xffffffff时会产生溢出变成0,终止while
所以这个函数的其实就是add,我们把他修改为add函数
再来看sub_401100函数:

_DWORD *__cdecl sub_401100(_DWORD *a1, int a2)
{
  int v3; // [esp+Ch] [ebp-1Ch]
  int v4; // [esp+14h] [ebp-14h]
  int v5; // [esp+18h] [ebp-10h]
  int v6; // [esp+18h] [ebp-10h]
  int v7; // [esp+1Ch] [ebp-Ch]
  int v8; // [esp+20h] [ebp-8h] BYREF

  v4 = *a1;
  v5 = a2;
  v3 = -1;
  v8 = 0;
  v7 = a2 * v4;
  while ( a2 )
  {
    v6 = v7 * v4;
    sub_401000(&v8, *a1);//v8=v8+a1,重复a2次,所以v8=v8+a1*a2,v8开始是0,所以v8=a1*a2
    ++v7;
    --a2;
    v5 = v6 - 1;
  }
  while ( v3 )
  {
    ++v7;
    ++*a1;
    --v3;
    --v5;
  }
  ++*a1;
  *a1 = v8;//a1=a8=a1*a2
  return a1;//返回a1*a2
}

再来看sub_401220函数:

DWORD *__cdecl sub_401220(_DWORD *a1, int a2)
{
  int v3; // [esp+8h] [ebp-10h]
  int v4; // [esp+Ch] [ebp-Ch]
  int v5; // [esp+14h] [ebp-4h]
  int v6; // [esp+14h] [ebp-4h]

  v4 = -1;
  v3 = -1 - a2 + 1;//v3=-a2
  v5 = -1;
  while ( v3 )//a1=a1+v3=a1-a2
  {
    ++*a1;
    --v3;
    --v5;
  }
  v6 = v5 * v5;
  while ( v4 )//v4=-1,a1=a1+v4=a1-1
  {
    v6 *= 123;
    ++*a1;
    --v4;
  }
  ++*a1;//a1+=1
  return a1;//返回a1-a2
}

修改后的代码直接拉到codeblocks

#include <stdio.h>
#include <stdlib.h>

int *mul(int *a1,int a2){
    *a1=*a1*a2;
return a1;
}

int *add(int *a1,int a2){
    *a1=*a1+a2;
return a1;}

int *sub(int *a1,int a2){
    *a1=*a1-a2;
return a1;}
int main(int argc, const char **argv, const char **envp)
{
  int *v3; // eax
  int *v4; // eax
  int *v5; // eax
  int *v6; // eax
  int *v7; // eax
  int *v8; // eax
  int *v9; // eax
  int *v10; // eax
  int *v11; // eax
  int *v12; // eax
  int *v13; // eax
  int *v14; // eax
  int *v15; // eax
  int *v16; // eax
  int *v17; // eax
  int *v18; // eax
  int *v19; // eax
  int *v20; // eax
  int *v21; // eax
  int *v22; // eax
  int *v23; // eax
  int *v24; // eax
  int *v25; // eax
  int *v26; // eax
  int *v27; // eax
  int *v28; // eax
  int *v29; // eax
  int *v30; // eax
  int *v31; // eax
  int *v32; // eax
  int *v33; // eax
  int *v34; // eax
  int *v35; // eax
  int *v36; // eax
  int *v37; // eax
  int *v38; // eax
  int *v39; // eax
  int *v40; // eax
  int *v41; // eax
  int *v42; // eax
  int *v43; // eax
  int *v44; // eax
  int *v45; // eax
  int *v46; // eax
  int *v47; // eax
  int *v48; // eax
  int *v49; // eax
  int *v50; // eax
  int *v51; // eax
  int *v52; // eax
  int *v53; // eax
  int *v54; // eax
  int *v55; // eax
  int *v56; // eax
  int *v57; // eax
  int *v58; // eax
  int *v59; // eax
  int *v60; // eax
  int *v61; // eax
  int *v62; // eax
  int *v63; // eax
  int *v64; // eax
  int *v65; // eax
  int *v66; // eax
  int *v67; // eax
  int *v68; // eax
  int *v69; // eax
  int *v70; // eax
  int *v71; // eax
  int *v72; // eax
  int *v73; // eax
  int *v74; // eax
  int *v75; // eax
  int *v76; // eax
  int *v77; // eax
  int *v78; // eax
  int *v79; // eax
  int *v80; // eax
  int *v81; // eax
  int *v82; // eax
  int *v83; // eax
  int *v84; // eax
  int *v85; // eax
  int *v86; // eax
  int *v87; // eax
  int *v88; // eax
  int *v89; // eax
  int *v90; // eax
  int *v91; // eax
  int *v92; // eax
  int *v93; // eax
  int *v94; // eax
  int *v95; // eax
  int *v96; // eax
  int *v97; // eax
  int *v98; // eax
  int *v99; // eax
  int *v100; // eax
  int *v101; // eax
  int *v102; // eax
  int *v103; // eax
  int *v104; // eax
  int *v105; // eax
  int *v106; // eax
  int *v107; // eax
  int *v108; // eax
  int *v109; // eax
  int *v110; // eax
  int *v111; // eax
  int *v112; // eax
  int *v113; // eax
  int v115; // [esp-8h] [ebp-9Ch]
  int v116; // [esp-4h] [ebp-98h]
  int v117; // [esp-4h] [ebp-98h]
  int i; // [esp+4h] [ebp-90h]
  int j; // [esp+8h] [ebp-8Ch]
  int v120[32]; // [esp+Ch] [ebp-88h] BYREF
  int v121; // [esp+8Ch] [ebp-8h]

  for ( i = 0; i < 32; ++i )
    v120[i] = 1;
  v121 = 0;
  puts("Your flag is:");
  v3 = mul(v120, 1000000000);
  v4 = sub(v3, 999999950);
  mul(v4, 2);
  v5 = add(&v120[1], 5000000);
  v6 = sub(v5, 6666666);
  v7 = add(v6, 1666666);
  v8 = add(v7, 45);
  v9 = mul(v8, 2);
  add(v9, 5);
  v10 = mul(&v120[2], 1000000000);
  v11 = sub(v10, 999999950);
  v12 = mul(v11, 2);
  add(v12, 2);
  v13 = add(&v120[3], 55);
  v14 = sub(v13, 3);
  v15 = add(v14, 4);
  sub(v15, 1);
  v16 = mul(&v120[4], 100000000);
  v17 = sub(v16, 99999950);
  v18 = mul(v17, 2);
  add(v18, 2);
  v19 = sub(&v120[5], 1);
  v20 = mul(v19, 1000000000);
  v21 = add(v20, 55);
  sub(v21, 3);
  v22 = mul(&v120[6], 1000000);
  v23 = sub(v22, 999975);
  mul(v23, 4);
  v24 = add(&v120[7], 55);
  v25 = sub(v24, 33);
  v26 = add(v25, 44);
  sub(v26, 11);
  v27 = mul(&v120[8], 10);
  v28 = sub(v27, 5);
  v29 = mul(v28, 8);
  add(v29, 9);
  v30 = add(&v120[9], 0);
  v31 = sub(v30, 0);
  v32 = add(v31, 11);
  v33 = sub(v32, 11);
  add(v33, 53);
  v34 = add(&v120[10], 49);
  v35 = sub(v34, 2);
  v36 = add(v35, 4);
  sub(v36, 2);
  v37 = mul(&v120[11], 1000000);
  v38 = sub(v37, 999999);
  v39 = mul(v38, 4);
  add(v39, 50);
  v40 = add(&v120[12], 1);
  v41 = add(v40, 1);
  v42 = add(v41, 1);
  v43 = add(v42, 1);
  v44 = add(v43, 1);
  v45 = add(v44, 1);
  v46 = add(v45, 10);
  add(v46, 32);
  v47 = mul(&v120[13], 10);
  v48 = sub(v47, 5);
  v49 = mul(v48, 8);
  v50 = add(v49, 9);
  add(v50, 48);
  v51 = sub(&v120[14], 1);
  v52 = mul(v51, -294967296);
  v53 = add(v52, 55);
  sub(v53, 3);
  v54 = add(&v120[15], 1);
  v55 = add(v54, 2);
  v56 = add(v55, 3);
  v57 = add(v56, 4);
  v58 = add(v57, 5);
  v59 = add(v58, 6);
  v60 = add(v59, 7);
  add(v60, 20);
  v61 = mul(&v120[16], 10);
  v62 = sub(v61, 5);
  v63 = mul(v62, 8);
  v64 = add(v63, 9);
  add(v64, 48);
  v65 = add(&v120[17], 7);
  v66 = add(v65, 6);
  v67 = add(v66, 5);
  v68 = add(v67, 4);
  v69 = add(v68, 3);
  v70 = add(v69, 2);
  v71 = add(v70, 1);
  add(v71, 20);
  v72 = add(&v120[18], 7);
  v73 = add(v72, 2);
  v74 = add(v73, 4);
  v75 = add(v74, 3);
  v76 = add(v75, 6);
  v77 = add(v76, 5);
  v78 = add(v77, 1);
  add(v78, 20);
  v79 = mul(&v120[19], 1000000);
  v80 = sub(v79, 999999);
  v81 = mul(v80, 4);
  v82 = add(v81, 50);
  sub(v82, 1);
  v83 = sub(&v120[20], 1);
  v84 = mul(v83, -294967296);
  v85 = add(v84, 49);
  sub(v85, 1);
  v86 = sub(&v120[21], 1);
  v87 = mul(v86, 1000000000);
  v88 = add(v87, 54);
  v89 = sub(v88, 1);
  v90 = add(v89, 1000000000);
  sub(v90, 1000000000);
  v91 = add(&v120[22], 49);
  v92 = sub(v91, 1);
  v93 = add(v92, 2);
  sub(v93, 1);
  v94 = mul(&v120[23], 10);
  v95 = sub(v94, 5);
  v96 = mul(v95, 8);
  v97 = add(v96, 9);
  add(v97, 48);
  v98 = add(&v120[24], 1);
  v99 = add(v98, 3);
  v100 = add(v99, 3);
  v101 = add(v100, 3);
  v102 = add(v101, 6);
  v103 = add(v102, 6);
  v104 = add(v103, 6);
  add(v104, 20);
  v105 = add(&v120[25], 55);
  v106 = sub(v105, 33);
  v107 = add(v106, 44);
  v108 = sub(v107, 11);
  add(v108, 42);
  add(&v120[26], v120[25]);
  add(&v120[27], v120[12]);
  v115 = v120[27];
  v109 = sub(&v120[28], 1);
  v110 = add(v109, v115);
  sub(v110, 1);
  v116 = v120[23];
  v111 = sub(&v120[29], 1);
  v112 = mul(v111, 1000000);
  add(v112, v116);
  v117 = v120[27];
  v113 = add(&v120[30], 1);
  mul(v113, v117);
  add(&v120[31], v120[30]);
  printf("CTF{");
  for ( j = 0; j < 32; ++j )
    printf("%c", v120[j]);
  printf("}\n");
  return 0;
}

运行出结果,需要注意的是定义add sub mul三个函数的时候,由指针接收返回,也就需要定义为指针函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Paintrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值