今天工作时,反汇编中注意到_RTC_CheckEsp_这个函数,查了查资料,发觉这是个运行时检查函数,应该是用来检查缓冲区溢出的。
具体代码如下:
0135154B int 3
0135154C int 3
0135154D int 3
0135154E int 3
0135154F int 3
_RTC_CheckEsp:
01351550 jne esperror (1351553h)
01351552 ret
esperror:
01351553 push ebp
01351554 mov ebp,esp
调用出现的位置有:
printf("input a number: ");
013513BE mov esi,esp
013513C0 push offset string "input a number: " (135575Ch)
013513C5 call dword ptr [__imp__printf (13582B8h)]
013513CB add esp,4
013513CE cmp esi,esp
013513D0 call @ILT+305(__RTC_CheckEsp) (1351136h)
scanf("%d",&n);
013513D5 mov esi,esp
013513D7 lea eax,[n]
013513DA push eax
013513DB push offset string "%d\n" (1355758h)
013513E0 call dword ptr [__imp__scanf (13582B4h)]
013513E6 add esp,8
013513E9 cmp esi,esp
013513EB call @ILT+305(__RTC_CheckEsp) (1351136h)
printf和scanf函数都会先保存esp至esi中,printf/scanf函数调用结束后,调用_RTC_CheckEsp检查值有没有发生改变。
函数结束ret过程中也有类似操作,不过是esp和ebp进行比较。
注意到空白区域存在大量int 3,这些区域应该是跳转不到的,用一字节长的int 3中断填充。