攻防世界---->Newbie_calculations

news/2024/10/4 19:40:18 标签: 学习方法, 笔记, 算法

学习笔记

前言:试过od动态分析, 然后发现,那些函数不完全是混淆,怎么剥离 - - 不会

现在学会了。

参考:

xctf-Newbie_calculations - jane_315 - 博客园 (cnblogs.com)icon-default.png?t=O83Ahttps://www.cnblogs.com/jane315/p/13769641.html#:~:text=%E6%9F%A5%E5%A3%B3%E6%97%A0%E5%A3%B3%EF%BC%8C%E4%BD%BF

下载 查壳。

32ida打开。

先运行一下:

输入没反应,不回显。。。?

ida跟进看看。

可以得知 flag是%c一个一个打印出来的。(已老实)

函数分析前置知识:

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

int main()
{
	/*关键点;while(X的值) 0和非0值。*/
	
	
	//对照实验:
	//第一组:
	int s = -100; //X ->负数
	int i = 0;	//i--
	int s2 = 100; //X ->正数
	int k = 0;	//k--
	//第二组:
	int s1 = -100;//X ->负数
	int j = 0;//j++
	int s3 = 100; //X ->正数
	int l = 0;//l++


	
	while (s) //符号为 “ - ”时
	{
		i--;	// i实际取值	呈自增 
		s--;
	}
	printf("i--->%d\ns--->%d\n", i, s);
	
	while (s2)	//符号为“ + ” 时
	{
		k--;	//k 呈自减
		s2--;
	}
	printf("k--->%d\ns2--->%d\n", k, s2);
	printf("\n");

	while (s1)//符号为 “ - ”时
	{
		j++;	//j实际取值呈 自减
		s1--;
	}
	printf("j--->%d\ns1--->%d\n", j, s1);
	while (s3)//符号为 “ + ”时
	{
		l++; // l呈自增。
		s3--;
	}
	printf("l--->%d\ns3--->%d\n", l, s3);
	printf("\n");
	system("pause");
	return 0;
}


运行结果:

原因:

回归本题正式:

分析:

①        sub_401100

所以 sub_401000实际ret的值就是 v120:

说的很乱 :

直白点:

sub_401220的判断分析,同上就好:

编写脚本:

 = = 

踩坑 

尼玛 ,提取main值的时候记得修改v120的范围。(改成32)

(我说,为什么我提取出来和网上wp不一样??)

脚本:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int sub_401100(int *a1, int a2) 
{
	*a1= *a1 * a2;
	return a1;
};

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

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



int main()
{
	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 = 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]);
	v115 = v120[27];
	v109 = sub_401220(&v120[28], 1);
	v110 = sub_401000(v109, v115);
	sub_401220(v110, 1);
	v116 = v120[23];
	v111 = sub_401220(&v120[29], 1);
	v112 = sub_401100(v111, 1000000);
	sub_401000(v112, v116);
	v117 = v120[27];
	v113 = sub_401000(&v120[30], 1);
	sub_401100(v113, v117);
	sub_401000(&v120[31], v120[30]);
	printf("CTF{");
	for (j = 0; j < 32; ++j)
		printf("%c", v120[j]);
	printf("}\n");
	return 0;
}

结果:

CTF{daf8f4d816261a41a115052a1bc21ade}

题外话:

>>>题整体不难,难点,C语言循环的理解。分析混淆代码。


http://www.niftyadmin.cn/n/5690278.html

相关文章

opus基础简介(github)

Opus 音频编解码器 Opus 是一种用于通过互联网进行交互式语音和音频传输的编解码器。 Opus 能够处理各种交互式音频应用&#xff0c;包括网络语音通话 (Voice over IP)、视频会议、游戏内语音聊天&#xff0c;甚至远程实时音乐表演。它可以从低比特率的窄带语音扩展到非常高…

畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)

畅阅读系统小程序 目录 基于java的畅阅读系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师…

【运维类资料集】实施运维方案(word)

编写目的&#xff1a; 作为项目运维服务质量管理的总纲&#xff0c;规范和指导公司运维服务质量管理&#xff0c;加强运维服务质量管理的有效性。保证运维服务的整体质量&#xff0c;提升公司运维服务的整体质量水平。使公司能够为客户提供更高质量的运维服务&#xff0c;保障公…

LabVIEW混合控制器质量检测

随着工业自动化水平的提高&#xff0c;对控制器的精度、稳定性、可靠性要求也在不断上升。特别是在工程机械、自动化生产、风力发电等领域&#xff0c;传统的质量检测方法已无法满足现代工业的高要求。因此&#xff0c;开发一套自动化、精确、可扩展的混合控制器质量检测平台成…

数据工程师岗位常见面试问题-3(附回答)

数据工程师已成为科技行业最重要的角色之一&#xff0c;是组织构建数据基础设施的骨干。随着企业越来越依赖数据驱动的决策&#xff0c;对成熟数据工程师的需求会不断上升。如果您正在准备数据工程师面试&#xff0c;那么应该掌握常见的数据工程师面试问题&#xff1a;包括工作…

`git restore` 和 `git checkout` 用于丢弃工作区的改动, `git switch` 和 `git checkout` 用来切换分支

git restore 和 git checkout 都可以用于丢弃工作区的改动 但它们有一些区别&#xff0c;尤其是在 Git 2.23 引入了新的命令后。 主要区别 git checkout 是一个多用途命令&#xff1a; 它用于切换分支。它还可以用于恢复工作区中特定文件的更改。由于功能过于复杂&#xff0c…

高性能防静电主轴4033 AC-ESD 在线路板切割中的非凡表现

随着电子产品的日益小型化/集成化&#xff0c;线路板的制造也面临着更高的挑战。线路板分板作为电子制造流程中的关键环节&#xff0c;其效率和精度直接影响到最终产品的质量和市场竞争力。因此专用的高性能防静电主轴SycoTec 4033 AC-ESD凭借其卓越的性能&#xff0c;成为众多…

同轴电缆笔记

同轴电缆笔记 射频同轴电缆的阻抗标准为什么是50Ω或75Ω呢&#xff1f; 在PCB设计中&#xff0c;在合理的范围内&#xff0c;传输线阻抗的具体数值并不重要。只要控制好整条传输线的阻抗&#xff0c;不要出现阻抗不连续的情况就好了。设计中的其他因素往往决定了我们用什么样…