-
重点讨论缓冲区溢出攻击,这部分属于逃避检测的手段
-
堆栈缓冲区溢出的产生
-
shellcode 在缓冲区溢出攻击中的作用
-
缓冲区溢出攻击的各种防范措施及类型
缓冲区攻击
这部分原因主要是在应用程序开发中不细心的编程而导致,当然这是种有点搞笑的说法(您的编程人员有多的不细心?)
C 语言的因为具有高级控制、数据结构表示、访问底层机器资源的能力,也可以移植到一系列处理器结构中。Unix 就是最早使用高级语言编程的操作系统之一。这里面就涉及到了计算机体系结构、汇编语言、计算机存储、编译器原理等诸多知识体系迭代到必然产生出“缓冲区溢出”。但是由于广泛高级编程语言,很多常见更广泛的库函数,特别是那些与字符串输入和处理相关的不能对使用缓冲区的长度进行检查(美好的 JAVA,成为了各位涨薪的手段)
-
缓冲区溢出是接口的一种状况,此时大量输入被放置都缓冲区或数据存储区,超过其所分配的存储能力,覆盖了其他信息。可以利用这样的状况破环系统或插入特别的代码(代码注入),以获得系统访问权(不过也可以载入恶意代码,DDOS、Rootkit)
-
进程试图存储超出缓冲区存储容量(长度)的数据,从而导致相邻的内存区域被覆盖。(后果是:程序使用数据收到破环,程序中发生意外的控制权移动,内存非法访问,导致程序终止) 进程注入技术 !!!(请注意这是目前最新的技术)
缓冲区溢出代码: int main(int argc,char *argv[]){ int vaild = FALSE; char str1[8]; char str2[10]; next_tag(str1); gets(str2); if (strncmp(str1,str2,8) ==0 ){ vaild = TRUE; print("bufferl:str1(%s),str2(%s),vaild(%d) \n",str1,str2,vaild); } }
cc -g -0 bufferl bufferl.c ./bufferl
这段代码的问题在于 gets() 对数据复制的数量没有包含任何检查,如果输入行它超过字符串多于 7 个,怎么搞??其他两个问题你可以考虑考虑,不过更多的代码的逻辑漏洞出现的问题。
-
缓冲区溢出就是将任何未做检查的数据复制到一个缓冲区能够导致相邻的内存区域受到破坏
利用缓冲区的要求
-
能够在控制下使用外部的数据资源能够被触发
-
缓冲区如何存储在进程中的内存中,以及破坏相邻的内存区域和改变执行流的可能性
栈缓冲区溢出(stack smashing)
-
栈帧(数据存储的地方)
具体步骤你去看看程序设计语言,编译器,处理器的体系结构
-
https://repository.dinus.ac.id/docs/ajar/Operating_System.pdf
改写保存的帧指针和返回地址的可能性,形成了栈溢出攻击的核心
-
缓冲区溢出如何能够使得hello不返回调用它的主函数
void Hello(char *tag){ char inp[16]; printf("Enter value for %s\n", tag); printf("hello you %s is %s\n", tag,inp); }
cc -g 0 buffer2 buffer2.c ./buffer2 ./buffer2 perl -e 'print pack("H*","");' | ./buffer2
这就是栈溢出是如何进行的。
-
shellcode 前先看
-
缓冲区溢出攻击的目标函数结构
void gctinp(char *inp,int size){ /* code */ puts("Input value: "); fgets(inp,siz,stdin); printf("buffer getinp read %s\n", inp); } void display(char *val) { /* code */ char tmp[16]; sprintf(tmp,"read val: %s \n",val); puts(tmp); } int int main(int argc, char const *argv[]) { /* code */ char buf[16]; getinp(buf,sizeof(buf)); display(buf); printf("buffer donw \n"); }
cc -0 buffer buffer.c ./buffer ./buffer
-
寻找缓冲区溢出时,复制和合并外部数据源的所有地方都可能会发生缓冲区溢出
在栈的缓冲区溢出的结果表明,在栈顶部附近的内存发生变化,尤其是返回地址和指向旧栈帧的指针都以毁坏,一般需要shell 命令重新跑下子就可,但是......
-