概述
当我们使用构造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!n”);
}
else
{
printf(“Congratulation! You have passed the verification!n”);
}
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植入的过程。
最后
以上就是爱笑云朵为你收集整理的利用JMP ESP植入SHELLCODE的全部内容,希望文章能够帮你解决利用JMP ESP植入SHELLCODE所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复