-
-
[原创]学习Switch的一点记录,勿喷勿喷
-
发表于: 2021-9-29 16:53 7275
-
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 ecx0040114D call @ILT+0(switchFunction) (00401005)00401152 add esp,400401020 push ebp//将ebp压入堆栈,此时的esp中存放的就是原始EBp的值00401021 mov ebp,esp//此句执行,将当前ESP,(也就是保存原始EBP)保存在EBP寄存器中,用于堆栈还原的//时候找到原始EBP,此时的EBP+4也就是call执行时压入的地址,也就是当前函数返回地//址,call下一行地址,所以压入的参数也就是EBP+800401023 sub esp,44h//提升堆栈0x44个字节(68个字节),4的整数倍,默认是提升0x40,所以初步判断就是使用了一个局部变量00401026 push ebx00401027 push esi00401028 push edi//以上三句都是保存即将使用的寄存器00401029 lea edi,[ebp-44h]//取提升空间的地址,因为前几句EBP不变,所以通过EBP-0x44就能找到提升的地址,放入EDI0040102C 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=30040103E mov ecx,dword ptr [ebp-4]//ecx=300401041 sub ecx,1//ecx=200401044 mov dword ptr [ebp-4],ecx//局部变量i=200401047 cmp dword ptr [ebp-4],5//将i和5进行比较,大于跳转,跳转地址正好是defult的地址0040104B ja $L864+0Fh (004010b1)//0040104D mov edx,dword ptr [ebp-4]//将i赋值给EDX00401050 jmp dword ptr [edx*4+4010CFh]//4010cf是一个地址表,通过EDx的值乘以4,找到跳转地址,此时i=2,所以跳转到4010cf+8也就是【004010d7】=0040107500401057 push offset string "\xc4\xe3\xca\xe4\xc8\xeb\xb5\xc4\xca\xc71\n" (00427084)0040105C call printf (00401190)00401061 add esp,400401064 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,400401073 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,400401082 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,400401091 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,4004010A0 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,4004010AF 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,4004010BE pop edi004010BF pop esi004010C0 pop ebx004010C1 add esp,44h004010C4 cmp ebp,esp004010C6 call __chkesp (00401210)004010CB mov esp,ebp004010CD pop ebp |
插入代码
```
[培训]传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-9-29 16:56
被QZ2019编辑
,原因: 代码太乱
赞赏
他的文章
- 低价处理所有编程书籍 6612
- [原创]C语言实现学生成绩管理,二维数组练习,大佬绕过 5983
- [分享]分享几套个人觉得不错Android逆向和网络协议的视频 8097
- [原创]时代在进步 7548
- [原创]一参,一局部,一返回,最简单的C程序剖析 4458
赞赏
雪币:
留言: