软件漏洞分析入门(一)

混合汇编和内联汇编

准备从这篇开始把软件安全方面的一些知识点记录成笔记,做成一个系列,希望可以坚持下来。能力有限,知识点也比较浅陋,如果笔记有疏漏请大家多多包涵。

由于笔记侧重点在于对软件漏洞的分析和实践操作,一些汇编的基础知识并不包含在这个系列之内,默认大家已经具有了一定的汇编基础了,所以笔者不会在所有的语句旁边都加上注释。

通过VS2022进行C和x86汇编混合编程

这里为什么不用更方便的 VS2010 呢,一个是因为很多的软件安全教材都比较老了,跟不上新时代,还有就是如果在 VS2022 最新版上都能调试成功,那么之前的很多老版本也都完全可以用这种方式调试成功

;func.asm

.model	flat  ;伪指令 确定工作模式
PUBLIC	_TestDemo ;extern int TestDemo();   
_TEXT	SEGMENT ;代码段
_TestDemo PROC
		MOV EAX, 2222  ;
		RET
_TestDemo ENDP
_TEXT	ENDS
END
//main.c

#include <stdio.h>
int TestDemo(void);
int main()
{
    
    
	int c = TestDemo();
	printf("%d\n",c);
}

可以看到,在项目文件的 main.c 里面,是没有 TestDemo 函数的定义的, TestDemo 的定义在另一个 func.asm 汇编语句里面,为了使主代码知道 TestDemo 的内容,需要一个链接器来把两个文件链接编译再生成可执行程序

将两个文件添加到 VS2022 的项目中,由于是需要链接 asm 汇编文件,所以需要设置如下

右键 项目 --> 生成依赖性 --> 生成自定义

image-20220409104827797

勾选 masm

image-20220409105026755

右键 func.asm 选择 属性,项类型选择 Microsoft Macro Assembler 让IDE识别

image-20220409105438787

项目属性中,链接器下的子系统设置要改成 console

image-20220409111413490

由于实验是x86汇编,所以生成编译文件必须是x86格式

image-20220409105541694

编译运行

image-20220409105642134

通过VS2022进行X86嵌入式汇编编程

现在我们将汇编代码嵌入 main.c 内联执行
相比于上面的代码,这次小小改进一下,增加了输入的部分,使其成为一个能正常运行的加法器
相比混合汇编,这种内联汇编不需要链接编译,因为汇编的代码就在 main.c 里面,只要包含了能识别汇编的依赖项,就可以直接编译运行

//main.c

#include <stdio.h>
#include <stdlib.h>
int TestDemo(int a, int b)
{
    
    
    //汇编部分
  __asm{
    
    
   mov eax, a    ; Get first argument
   mov ecx, b  	 ; Get second argument
   add eax, ecx  ; 将eax,ecx的值加到eax上
  };
}
int main()
{
    
    
	int a,b,c;
	scanf("%d %d",&a,&b);
	c = TestDemo(a,b);
	printf("%d\n",c);
	system("pause");
}
为了使代码正常运行,同样需要进行设置

和之前一样,也需要添加依赖项 masm

image-20220409110808978

subsystem 设置也要改成 console

image-20220409110932090

编译运行

image-20220409111044484

以上两种便是最常见的汇编代码调用方式,在完成一个程序的编译生成之后,就可以开始对其可执行文件进行反汇编的分析了

猜你喜欢

转载自blog.csdn.net/SimoSimoSimo/article/details/125157746