弧注入

定义:通过修改函数返回地址的方式改变了程序的控制流的这种技术成为弧注入。原理:在程序的控制流“图”中插入一段新的“弧”(表示控制流转移),而不是代码注入。应用:利用弧注入执行一个函数序列,每个函数都是用攻击者提供的参数就可以安装并运行类似与一本包含函数连的小程序代码,从而增大攻击的危害性

很多高明的攻击者偏爱采用这种技术,包括在栈上安装一个已有函数的地址(如system()或者exec()),可以用于执行命令或者已经存在于本地系统上的其他程序)以及乡音的参数。当返回地址从栈中弹出时,程序的控制就被返回到攻击者指定的函数中。通过条用system()或exec()这样的函数就可以轻易的在受攻击的机器上建立一个shell。

下面讲解时需要用到栈结构,可能会有些人看不明白,但是如果不这样更加讲解的话无法讲不明白,当然这部分由于个人没有办法将整个攻击过程实现出来是比较遗憾的。

下面通过书中例子来讲解如果通过弧注入的方式来进行攻击:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>

int get_buff(char *user_input)
{
    char buff[4];
    memcpy(buff, user_input, sizeof(user_input) + 1);
    return 0;
}

int main(int argc, char *argv[])
{
    get_buff(argv[1]);
    return 0;
}
2.7.1

在上面的代码中,如果user_input比buff缓冲区大,那么就会发生缓冲区溢出,那么来看看攻击者如何利用弧注入的技术来进行攻击的吧。

  1. 首先覆盖原有地址,替换为f()的地址
  2. f()执行完成后再指向g()的地址
  3. g()执行完成后再指向h()的地址
  4. 执行完所有的函数后最后再返回

首先攻击者在事件缓冲区内放入一些有用的数据,假设例子中缓冲区呗填充字符覆写main() 函数的帧指针已经被第2真的帧指针锁覆盖,整个第2真都是由攻击者作为利用的一部分而构造出来的。当呗利用的函数get_buff()返回时,将执行图2.7.1c的两种形式等价的基于帧指针的返回指令序列之一。不管使用的是那种形式,帧指针都会被移动到栈指针中。程序的控制会被转移到位于栈中的一个地址,改地址已经被修改为指向某个任意函数f()了,这个函数被调用,锁传入的参数则实现被安装于栈中。攻击者必须提供对被调用函数而言数量和参数类型均适合的参数。图2.7.1b中假设该函数接受一个指向字符串(如system())的指针。由于字符串的实际内容也是有攻击者提供的,因此也位于栈中,被置于函数实参之后。

当f()返回时,他将存储的eip从栈中弹出,并且将程序的控制权转移到该地址,被2.7.1c中eip的返回指令序列地址覆盖。指令序列通常是为了让其返回到被利用函数而产生的,可位于进程代码段的任何地方。返回序列将帧指针(第3帧)赋值给栈栈指针,然后将程序控制权转交给下一个奖杯调用的任意函数(例子:g())

发表评论

电子邮件地址不会被公开。 必填项已用*标注