首页
社区
课程
招聘
[原创]学习Switch的一点记录,勿喷勿喷
发表于: 2021-9-29 16:53 7133

[原创]学习Switch的一点记录,勿喷勿喷

2021-9-29 16:53
7133
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
插入代码
```#include "stdio.h"
#include "stdlib.h"
void switchFunction(int num)
{
    switch (num)
    {
    case 1 :
        printf("你输入的是1\n");
        break;
    case 2:
        printf("你输入的是2\n");
        break;
    case 3:
        printf("你输入的是3\n");
        break;   
    case 4:
        printf("你输入的是4\n");
        break;
    case 5:
        printf("你输入的是5\n");
        break;
    case 6:
        printf("你输入的是6\n");
        break;
    default:
        printf("你输入的是其他数字\n");
    }       
}
 
void main()
{
    int num;
    scanf("%d",&num);
    switchFunction(num);   
    system("pause");
}
 
 
00401149   mov         ecx,dword ptr [ebp-4
// ebp-4存放的就是局部变量,将其作为参数压入堆栈中。
 
0040114C   push        ecx
0040114D   call        @ILT+0(switchFunction) (00401005)
00401152   add         esp,4
00401020   push        ebp
//将ebp压入堆栈,此时的esp中存放的就是原始EBp的值
00401021   mov         ebp,esp
//此句执行,将当前ESP,(也就是保存原始EBP)保存在EBP寄存器中,用于堆栈还原的//时候找到原始EBP,此时的EBP+4也就是call执行时压入的地址,也就是当前函数返回地//址,call下一行地址,所以压入的参数也就是EBP+8
00401023   sub         esp,44h
//提升堆栈0x44个字节(68个字节),4的整数倍,默认是提升0x40,所以初步判断就是使用了一个局部变量
00401026   push        ebx
00401027   push        esi
00401028   push        edi
//以上三句都是保存即将使用的寄存器
00401029   lea         edi,[ebp-44h]
//取提升空间的地址,因为前几句EBP不变,所以通过EBP-0x44就能找到提升的地址,放入EDI
0040102C   mov         ecx,11h
//0x11 也就是17放入ECX中,作为循环变量
00401031   mov         eax,0CCCCCCCCh
//给EAX赋值为0xccccccccc.也就是int3断点
00401036   rep stos    dword ptr [edi]
//重复0x11次填充,也就是填充17*4=68个字节到申请的缓冲区。
00401038   mov         eax,dword ptr [ebp+8]
//取EBp+8,也就是main函数压入到堆栈的值,也就是main函数的局部变量(ebp-4),这里我输入的是3
0040103B   mov         dword ptr [ebp-4],eax
//eax=3
0040103E   mov         ecx,dword ptr [ebp-4]
//ecx=3
00401041   sub         ecx,1
//ecx=2
00401044   mov         dword ptr [ebp-4],ecx
//局部变量i=2
00401047   cmp         dword ptr [ebp-4],5
//将i和5进行比较,大于跳转,跳转地址正好是defult的地址
0040104B   ja          $L864+0Fh (004010b1)
//
0040104D   mov         edx,dword ptr [ebp-4]
//将i赋值给EDX
00401050   jmp         dword ptr [edx*4+4010CFh]
//4010cf是一个地址表,通过EDx的值乘以4,找到跳转地址,此时i=2,所以跳转到4010cf+8
也就是【004010d7=00401075
 
00401057   push        offset string "\xc4\xe3\xca\xe4\xc8\xeb\xb5\xc4\xca\xc71\n" (00427084)
0040105C   call        printf (00401190)
00401061   add         esp,4
00401064   jmp         $L864+1Ch (004010be)
$L856:
00401066   push        offset string "\xc4\xe3\xca\xe4\xc8\xeb\xb5\xc4\xca\xc72\n" (00427074)
0040106B   call        printf (00401190)
00401070   add         esp,4
00401073   jmp         $L864+1Ch (004010be)
$L858:
00401075   push        offset string "\xc4\xe3\xca\xe4\xc8\xeb\xb5\xc4\xca\xc73\n" (00427064)
0040107A   call        printf (00401190)
0040107F   add         esp,4
00401082   jmp         $L864+1Ch (004010be)
$L860:
00401084   push        offset string "\xc4\xe3\xca\xe4\xc8\xeb\xb5\xc4\xca\xc74\n" (00427054)
00401089   call        printf (00401190)
0040108E   add         esp,4
00401091   jmp         $L864+1Ch (004010be)
$L862:
00401093   push        offset string "\xc4\xe3\xca\xe4\xc8\xeb\xb5\xc4\xca\xc75\n" (00427044)
00401098   call        printf (00401190)
0040109D   add         esp,4
004010A0   jmp         $L864+1Ch (004010be)
$L864:
004010A2   push        offset string "\xc4\xe3\xca\xe4\xc8\xeb\xb5\xc4\xca\xc76\n" (00427034)
004010A7   call        printf (00401190)
004010AC   add         esp,4
004010AF   jmp         $L864+1Ch (004010be)
004010B1   push        offset string "\xc4\xe3\xca\xe4\xc8\xeb\xb5\xc4\xca\xc7\xc6\xe4\xcb\xfb\xca\xfd\xd7\xd6\
004010B6   call        printf (00401190)
004010BB   add         esp,4
004010BE   pop         edi
004010BF   pop         esi
004010C0   pop         ebx
004010C1   add         esp,44h
004010C4   cmp         ebp,esp
004010C6   call        __chkesp (00401210)
004010CB   mov         esp,ebp
004010CD   pop         ebp

插入代码
```


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-9-29 16:56 被QZ2019编辑 ,原因: 代码太乱
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//