一个示例学习C语言到汇编层面

给出以下代码

#include<stdio.h>
int main() {
	int x = 0, y = 0, z = 0;
	while (1) {
		x = 0;
		y = 1;
		do {
			printf("%d\n", x);
			z = x + y;
			x = y;
			y = z;
		} while (x < 255);
	}
	return 0;
}

我们把这个程序编写成32位程序,然后我们放入IDA中进行分析
在这里插入图片描述

.text:00801870 ; Attributes: bp-based frame
.text:00801870
.text:00801870 ; int __cdecl main()
.text:00801870 _main           proc near               ; CODE XREF: _main_0↑j
.text:00801870
.text:00801870 var_24          = byte ptr -24h
.text:00801870 z               = dword ptr -20h
.text:00801870 y               = dword ptr -14h
.text:00801870 x               = dword ptr -8
.text:00801870
.text:00801870                 push    ebp
.text:00801871                 mov     ebp, esp
.text:00801873                 sub     esp, 0E4h
.text:00801879                 push    ebx
.text:0080187A                 push    esi
.text:0080187B                 push    edi
.text:0080187C
.text:0080187C __$EncStackInitStart_1:
.text:0080187C                 lea     edi, [ebp+var_24]
.text:0080187F                 mov     ecx, 9
.text:00801884                 mov     eax, 0CCCCCCCCh
.text:00801889                 rep stosd
.text:0080188B
.text:0080188B __$EncStackInitEnd_1:                   ; JMC_flag
.text:0080188B                 mov     ecx, offset _C91CCFE8__@cpp
.text:00801890                 call    j_@__CheckForDebuggerJustMyCode@4 ; __CheckForDebuggerJustMyCode(x)
.text:00801895                 mov     [ebp+x], 0
.text:0080189C                 mov     [ebp+y], 0
.text:008018A3                 mov     [ebp+z], 0
.text:008018AA
.text:008018AA loc_8018AA:                             ; CODE XREF: _main+80↓j
.text:008018AA                 mov     eax, 1
.text:008018AF                 test    eax, eax
.text:008018B1                 jz      short loc_8018F2
.text:008018B3                 mov     [ebp+x], 0
.text:008018BA                 mov     [ebp+y], 1
.text:008018C1
.text:008018C1 loc_8018C1:                             ; CODE XREF: _main+7E↓j
.text:008018C1                 mov     eax, [ebp+x]
.text:008018C4                 push    eax
.text:008018C5                 push    offset _Format  ; "%d\n"
.text:008018CA                 call    j__printf
.text:008018CF                 add     esp, 8
.text:008018D2                 mov     eax, [ebp+x]
.text:008018D5                 add     eax, [ebp+y]
.text:008018D8                 mov     [ebp+z], eax
.text:008018DB                 mov     eax, [ebp+y]
.text:008018DE                 mov     [ebp+x], eax
.text:008018E1                 mov     eax, [ebp+z]
.text:008018E4                 mov     [ebp+y], eax
.text:008018E7                 cmp     [ebp+x], 0FFh
.text:008018EE                 jl      short loc_8018C1
.text:008018F0                 jmp     short loc_8018AA
.text:008018F2 ; ---------------------------------------------------------------------------
.text:008018F2
.text:008018F2 loc_8018F2:                             ; CODE XREF: _main+41↑j
.text:008018F2                 xor     eax, eax
.text:008018F4                 pop     edi
.text:008018F5                 pop     esi
.text:008018F6                 pop     ebx
.text:008018F7                 add     esp, 0E4h
.text:008018FD                 cmp     ebp, esp
.text:008018FF                 call    j___RTC_CheckEsp
.text:00801904                 mov     esp, ebp
.text:00801906                 pop     ebp
.text:00801907                 retn
.text:00801907 _main           endp
.text:00801907

下图部分这一部分,属于编译器包装的,对程序的初始化
这里我们先不做研究
在这里插入图片描述以下这一段可以很明显看出对x,y,z
进行了初始化
在这里插入图片描述
所对应的部分
在这里插入图片描述
x和y在循环里的赋值如图
在这里插入图片描述
在这里插入图片描述
对于中间的循环部分
在这里插入图片描述
在这里插入图片描述
以上是大概的分析,接下来,我们进行细致的分析
在这里插入图片描述
当然了,在实际中,逆向分析的难度是很大的,这里只是方便大家理解学习,所以给了一个十六

相关推荐

  1. 汇编层面理解C++ this指针

    2024-06-17 20:44:03       32 阅读
  2. 汇编C语言转换

    2024-06-17 20:44:03       35 阅读
  3. Visual Studio C++ 的一个简单示例

    2024-06-17 20:44:03       11 阅读
  4. C语言中不常用一些函数

    2024-06-17 20:44:03       14 阅读
  5. C#编程语言的从入门深入学习大纲

    2024-06-17 20:44:03       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-17 20:44:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-17 20:44:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-17 20:44:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-17 20:44:03       20 阅读

热门阅读

  1. Docker学习

    2024-06-17 20:44:03       6 阅读
  2. 【力扣】目标和

    2024-06-17 20:44:03       7 阅读
  3. 从0到1实现YOLOv3

    2024-06-17 20:44:03       7 阅读
  4. 2024年反电诈重点:打击帮信罪&掩隐罪

    2024-06-17 20:44:03       7 阅读
  5. 第九章 Three.js 高级材质与着色器 (二)

    2024-06-17 20:44:03       5 阅读
  6. Jackson指定json的key

    2024-06-17 20:44:03       7 阅读
  7. 面向对象编程中的类详解

    2024-06-17 20:44:03       7 阅读