基本的栈溢出
栈溢出介绍 栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。这种问题是一种特定的缓冲区溢出漏洞,类似的还有堆溢出,bss 段溢出等溢出方式。栈溢出漏洞轻则可以使程序崩溃,重则可以使攻击者控制程序执行流程。此外,我们也不难发现,发生栈溢出的基本前提是: 程序必须向栈上写入数据。 写入的数据大小没有被良好地控制。 基本栈栈是一种先进后出的数据结构,主要有PUSH和POP两种操作,都是对栈顶的元素进行操作。 内存中从高地址向低地址生长,高地址为父函数的栈帧 基本实例: 最典型的栈溢出利用是覆盖程序的返回地址为攻击者所控制的地址,当然需要确保这个地址所在的段具有可执行权限 1234567891011121314151617181920212223#include <stdio.h>#include <string.h>void success(void){ puts("flag{You Hava already controlled...
格式化字符串
格式化字符串漏洞格式化字符串漏洞函数: 以printf函数为例,它的第一个参数就是格式化字符串:“Color %s,Number %d,Float %4.2f” 然后printf函数会根据这个格式化字符串来解析对应的其它参数。 漏洞原理利用:程序崩溃:最简单的的攻击方法,只需要输入一串%s就可以 %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s 对于每一个 %s,printf() 都会从栈上取一个数字,把该数字视为地址,然后打印出该地址指向的内存内容,由于不可能获取的每一个数字都是地址,所以数字对应的内容可能不存在,或者这个地址是被保护的,那么便会使程序崩溃 在 Linux 中,存取无效的指针会引起进程收到 SIGSEGV 信号,从而使程序非正常终止并产生核心转储 基本的格式化字符串漏洞的格式12//比如正确的写法是:printf("%s",...