利用JMP ESP植入SHELLCODE
当我们使用构造shellcode覆盖返回地址跳转到shellcode植入点的位置进行攻击时,常常很难找到该地址的具体位置,无法到达目标计算机上去调试,因此更常用的是利用JMP ESP指令来进行攻击。 代码: #include <stdio.h>
#include <windows.h> #include <stdlib.h> #define PASSWORD “1234567” int verify_password (char *password) { int authenticated; char buffer[44]; authenticated=strcmp(password,PASSWORD); strcpy(buffer,password);//over flowed here! return authenticated; } int main() { int valid_flag=0; char password[1024]; FILE * fp; LoadLibrary(“user32.dll”);//prepare for messagebox if(!(fp=fopen(“password.txt”,“rw+”))) { exit(0); } fscanf(fp,"%s",password); valid_flag = verify_password(password); if(valid_flag) { printf(“incorrect password! ”); } else { printf(“Congratulation! You have passed the verification! ”); } fclose(fp); system(“pause”); return 0; } 运行环境:Windows10,VC6.0 其原理是:通过Ollydbg查找JMP ESP的地址,将其覆盖到函数的返回地址,通过观察此时esp指向的位置,在该位置处植入shellcode,通过vc6.0寄存器可观察到其正好指向返回地址的下一个地址,因此可在覆盖返回地址的代码后继续植入shellcode。 从上图Register可看出esp指向的地址:0x0019FAE8正是函数verify_password返回地址的下一个地址。 下面通过Ollydbg查找JMP ESP指令的地址: 在Ollydbg中任意导入一个exe文件,alt+E,选择Kernel.dll库,得到地址为:746B9A57 这里通过调用User32.dll的MessageBoxA和Kernel.dll的ExitProcess来构造shellcode,此处若Depends查看基址不成功,可通过在写新的程序在Ollydbg中调试得到。 新程序中调用上面所说的两个函数,代码为: # include <stdio.h> include <windows.h> int main() { MessageBox(NULL,“nihao”,“test”,NULL); exit(0); return 0; } 在Ollydbg中可调试得到MessageBoxA地址为:0x73808940,ExitProcess的地址为:0x7467ADE0,如下图所示: 查找到上述三处地址后,即可构造shellcode,如下: 对于上述机器码可通过Ollydbg生成,参考如下: 构造完成后即存入与代码目录的password.txt文本中,执行程序结果: 上图显示shellcode植入成功,已经调用MessageBoxA函数弹出对话框和事先设定的内容。 最后成功调用Exit函数使程序正常退出,而不会因为覆盖正确的返回值而引发异常。 点击对话框后程序正常退出: 至此则完成了利用JMP ESP进行shellcode植入的过程。