我是靠谱客的博主 爱笑云朵,最近开发中收集的这篇文章主要介绍利用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!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。
查看ESP指向的地址
从上图Register可看出esp指向的地址:0x0019FAE8正是函数verify_password返回地址的下一个地址。
下面通过Ollydbg查找JMP ESP指令的地址:
在Ollydbg中任意导入一个exe文件,alt+E,选择Kernel.dll库,得到地址为:746B9A57
JMP ESP地址
这里通过调用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,如下图所示:
MessageBoxA地址
ExitProcess地址
查找到上述三处地址后,即可构造shellcode,如下:
构造shellcode
对于上述机器码可通过Ollydbg生成,参考如下:
shellcode注释1
shellcode注释2
构造完成后即存入与代码目录的password.txt文本中,执行程序结果:
运行结果
上图显示shellcode植入成功,已经调用MessageBoxA函数弹出对话框和事先设定的内容。
最后成功调用Exit函数使程序正常退出,而不会因为覆盖正确的返回值而引发异常。
点击对话框后程序正常退出:
Exit使程序正常退出
至此则完成了利用JMP ESP进行shellcode植入的过程。

最后

以上就是爱笑云朵为你收集整理的利用JMP ESP植入SHELLCODE的全部内容,希望文章能够帮你解决利用JMP ESP植入SHELLCODE所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部