-
-
[原创]学习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编辑
,原因: 代码太乱
赞赏
他的文章
- 低价处理所有编程书籍 6257
- [原创]C语言实现学生成绩管理,二维数组练习,大佬绕过 5707
- [分享]分享几套个人觉得不错Android逆向和网络协议的视频 7810
- [原创]时代在进步 7215
- [原创]一参,一局部,一返回,最简单的C程序剖析 4284
看原图
赞赏
雪币:
留言: