标签:class 字符 本地 bash 利用 地址 sprint 实验 print
栈溢出是缓冲区溢出中最为常见的一种攻击手法,其原理是,程序在运行时栈地址是由操作系统来负责维护的,在我们调用函数时,程序会将当前函数的下一条指令的地址压入栈中,而函数执行完毕后,则会通过ret指令从栈地址中弹出压入的返回地址,并将返回地址重新装载到EIP指令指针寄存器中,从而继续运行,然而将这种控制程序执行流程的地址保存到栈中,必然会给栈溢出攻击带来可行性。
前面的笔记《缓冲区溢出与攻防博弈》中已经具体的介绍了缓冲区溢出的基本知识,也了解到了攻防双方技术的博弈过程,本次我们将来看几个简单的本地溢出案例,本次测试环境为Windows10系统+VS 2013编译器,该编译器默认开启GS保护,在下方的实验中需要手动将其关闭。
C语言中通常会提供给我们标准的函数库,这些标准函数如果使用不当则会造成意想不到的后果,如果被黑客利用轻者本地提权重则入侵整个系统,这也是为什么说C语言难学的原因啦,下方函数应该注意使用。
strcpy() vfscanf()
strcat() vsprintf()
sprintf() vscanf()
scanf() vsscanf()
sscanf() streadd()
fscanf() strecpy()
如下案例,就是利用了 strcpy() 函数对字符串边界检测不严格而造成的,如下代码编译。
#include <stdio.h>
#include <string.h>
void jumps(){
__asm{
jmp ebp;
}
}
void geting(char *temp){
char name[10];
strcpy(name, temp);
printf("%s \n", name);
}
int main(int argc,char *argv[])
{
geting(argv[1]);
return 0;
}
标签:class 字符 本地 bash 利用 地址 sprint 实验 print
原文地址:https://www.cnblogs.com/LyShark/p/11434201.html