​Newbie_calculations(等价替换)

简介: ​Newbie_calculations(等价替换)

程序刚一进来就是在初始化数组可以看到大小为0x20*sizeof(DWORD)的大小最后在128的位置进行了填写0

应该是一个字符串用0结尾(猜的)


c871f700b9870a6f87ae4cfc86c631bd_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


在控制台输出了Your flag is:



接下来可以发现add esp,8这句话所以有两个参数,一个是数组的首地址,还有一个是0x93B9ACA00h



分析MyMul函数,进入函数可以先看到,一个检测栈溢出的东东,不用管这是自动生成的。


6ad1bbb750106ab01cde319c5989b20f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


然后就是初始化变量了可以看到每一个块都初始化了一个变量

var_14=*arg_0  
var_C=arg_0
var_10=arg_4
var_1C=-1
var_8=0
var_C=*arg_0 *arg_4

7612e92b13c4207b8f3ea61e0cc2fe9e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


下面是一个 while循环比较的是arg4==0则循环结束

然后又初始化了一些变量,看完循环可以发现有些定义的变量又会重新赋值,没啥意义后面的操作

主要看传入MyAdd函数的参数一个var8的地址和*arg0


3bd98bac815ee6d8011936b34008dd15_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


MyAdd我们等下再观看,先看下后面的操作

由于var1c的值是FFFFFFFF,再看到后面的代码只有arg0被使用到,循环里面arg0是一直加1,要加FFFFFFFF次,

所以等于arg0-1但是loc_4011F6到loc_4011FB又加了1,所以这里的值不变,然后var8的值写入arg0里面,

arg0是个指针,往他指向的空间里面写值,返回值就是arg0的值,也就是指向的地址,所以这里最主要的还是需要查看MyAdd这个函数嘿嘿


25c134aa69a64ce297e37b9ef4b8ff8e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


对于上面的话理解不了的话可以F5看下画红框的就等于啥也没干-1+1只是为了给我们运行程序加时间而已


2f88d56dc38945dcc409e08bb873d496_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


来到MyAdd函数模式是差不多的就不多讲,看看主要部分首先确定循环的次数



v18=0-arg4


d66227dc08d5c9610bcfba4adaa1fc5e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


循环内部就是一直在-1减了0-arg4次,减的是负数,所以是等于



*arg0=arg4+*arg0


96e5adf1154abca9202517a802a54bf1_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


再回到上一个函数MyMul我们知道传入的局部变量var8的值是0那么循环arg4次

第一次: 0+*arg0

第二次:0+*arg0 +*arg0

...

推导下去就是

*arg0 =arg4*(*arg0 )

不能理解就看下F5的图吧


c020f839d2d2e323c0aafcb5347d847d_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


再看减法的和加法一模一样所以就不再解释,就是sub换成add了


87b0c0f61fc709c815d62a2580cd28dc_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


最后解题的方法我是在函数的内部修改汇编代码,改成+ - *就OK了


2c0e7c4e70c6a80dfe3916462ea0ca09_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


4207a025aa47e592080879b993d92a4b_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


ab6729e46c262ece25443cf2b657396d_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


运行完就有答案了


268dc8b379391321d50c0e36e6b9ed13_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


另外一种解法


#include "main.h"
int *__cdecl sub_401100(int *a1, int a2)//a1 * a2
{
*a1 = *a1 * a2;
return a1;
}
int *__cdecl sub_401000(int *a1, int a2)//a1 + a2
{
*a1 = *a1 + a2;
return a1;
}
int *__cdecl sub_401220(int *a1, int a2)//实际上就是a1 - a2
{
*a1 = *a1 -a2;
return a1;
}
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; // ST1C_4
int *v110; // eax
int *v111; // eax
int v112; // ST20_4
int *v113; // eax
int *v114; // eax
int v115; // ST20_4
int *v116; // eax
signed int i; // [esp+4h] [ebp-90h]
signed int j; // [esp+8h] [ebp-8Ch]
int v120[32]; // [esp+Ch] [ebp-88h]
int v121; // [esp+8Ch] [ebp-8h]
for (i = 0; i < 32; ++i)
v120[i] = 1;
v121 = 0;
puts("Your flag is:");
v3 = sub_401100(v120, 1000000000);
v4 = sub_401220(v3, 999999950);
sub_401100(v4, 2);
v5 = sub_401000(&v120[1], 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(&v120[2], 1000000000);
v11 = sub_401220(v10, 999999950);
v12 = sub_401100(v11, 2);
sub_401000(v12, 2);
v13 = sub_401000(&v120[3], 55);
v14 = sub_401220(v13, 3);
v15 = sub_401000(v14, 4);
sub_401220(v15, 1);
v16 = sub_401100(&v120[4], 100000000);
v17 = sub_401220(v16, 99999950);
v18 = sub_401100(v17, 2);
sub_401000(v18, 2);
v19 = sub_401220(&v120[5], 1);
v20 = sub_401100(v19, 1000000000);
v21 = sub_401000(v20, 55);
sub_401220(v21, 3);
v22 = sub_401100(&v120[6], 1000000);
v23 = sub_401220(v22, 999975);
sub_401100(v23, 4);
v24 = sub_401000(&v120[7], 55);
v25 = sub_401220(v24, 33);
v26 = sub_401000(v25, 44);
sub_401220(v26, 11);
v27 = sub_401100(&v120[8], 10);
v28 = sub_401220(v27, 5);
v29 = sub_401100(v28, 8);
sub_401000(v29, 9);
v30 = sub_401000(&v120[9], 0);
v31 = sub_401220(v30, 0);
v32 = sub_401000(v31, 11);
v33 = sub_401220(v32, 11);
sub_401000(v33, 53);
v34 = sub_401000(&v120[10], 49);
v35 = sub_401220(v34, 2);
v36 = sub_401000(v35, 4);
sub_401220(v36, 2);
v37 = sub_401100(&v120[11], 1000000);
v38 = sub_401220(v37, 999999);
v39 = sub_401100(v38, 4);
sub_401000(v39, 50);
v40 = sub_401000(&v120[12], 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(&v120[13], 10);
v48 = sub_401220(v47, 5);
v49 = sub_401100(v48, 8);
v50 = sub_401000(v49, 9);
sub_401000(v50, 48);
v51 = sub_401220(&v120[14], 1);
v52 = sub_401100(v51, -294967296);
v53 = sub_401000(v52, 55);
sub_401220(v53, 3);
v54 = sub_401000(&v120[15], 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(&v120[16], 10);
v62 = sub_401220(v61, 5);
v63 = sub_401100(v62, 8);
v64 = sub_401000(v63, 9);
sub_401000(v64, 48);
v65 = sub_401000(&v120[17], 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(&v120[18], 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(&v120[19], 1000000);
v80 = sub_401220(v79, 999999);
v81 = sub_401100(v80, 4);
v82 = sub_401000(v81, 50);
sub_401220(v82, 1);
v83 = sub_401220(&v120[20], 1);
v84 = sub_401100(v83, -294967296);
v85 = sub_401000(v84, 49);
sub_401220(v85, 1);
v86 = sub_401220(&v120[21], 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(&v120[22], 49);
v92 = sub_401220(v91, 1);
v93 = sub_401000(v92, 2);
sub_401220(v93, 1);
v94 = sub_401100(&v120[23], 10);
v95 = sub_401220(v94, 5);
v96 = sub_401100(v95, 8);
v97 = sub_401000(v96, 9);
sub_401000(v97, 48);
v98 = sub_401000(&v120[24], 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(&v120[25], 55);
v106 = sub_401220(v105, 33);
v107 = sub_401000(v106, 44);
v108 = sub_401220(v107, 11);
sub_401000(v108, 42);
sub_401000(&v120[26], v120[25]);
sub_401000(&v120[27], v120[12]);
v109 = v120[27];
v110 = sub_401220(&v120[28], 1);
v111 = sub_401000(v110, v109);
sub_401220(v111, 1);
v112 = v120[23];
v113 = sub_401220(&v120[29], 1);
v114 = sub_401100(v113, 1000000);
sub_401000(v114, v112);
v115 = v120[27];
v116 = sub_401000(&v120[30], 1);
sub_401100(v116, v115);
sub_401000(&v120[31], v120[30]);
printf("CTF{");
for (j = 0; j < 32; ++j)
printf("%c", (v120[j]));
printf("}\n");
system("pause");
return 0;
}

相关文章
|
2天前
|
设计模式
ES6中新增Array.from()函数的用法详解
ES6中新增Array.from()函数的用法详解
29 1
|
2天前
|
JavaScript
js开发:请解释什么是ES6的默认参数(default parameters),并给出一个示例。
ES6允许在函数参数中设置默认值,如`function greet(name = &#39;World&#39;) {...}`。当调用函数不传入`name`参数时,它将默认为&#39;World&#39;,提升代码简洁性和可读性。例如:`greet()`输出&quot;Hello, World!&quot;,`greet(&#39;Alice&#39;)`输出&quot;Hello, Alice!&quot;。
16 4
|
2天前
ES6的Array.from({length:N})方法创建长度为N的undefined数组,等价于 [...Array(N)]
ES6的Array.from({length:N})方法创建长度为N的undefined数组,等价于 [...Array(N)]
|
Java 编译器
规避Variable used in lambda expression should be final or effectively final而引发了方法参数值拷贝的问题
规避Variable used in lambda expression should be final or effectively final而引发了方法参数值拷贝的问题
159 0
|
索引
Ts中string、number和any等类型 不能当做索引用,怎么处理?
Ts中string、number和any等类型 不能当做索引用,怎么处理?
293 0
TS之任意值
任意值(Any)用来表示允许赋值为任意类型。
177 0
|
分布式计算 JavaScript 前端开发