Dword shoot

简介

Dword shoot,一种很简单的漏洞溢出技巧,所以就简单的说明一下吧。dword shoot漏洞是出现在双向链表表删除的时候出现的一种漏洞类型。(双向链表是什么不用我解释吧)在进行双向链表的操作过程中如果因为处置不当,比如溢出等等的情况下,构成双向链表的指向前一个和后一个节点的两个指针被恶意的改写的话,就会在链表删除的时候发生的漏洞。

漏洞原理与利用

这里我们先定义一个结构体作为双向链表的节点

1
2
3
4
5
6
struct node
{
char data[32];
struct node *fd; //指向前一个节点
struct node *bk; //指向前一个节点
};

一个简单的节点。现在我们写一个双向链表删除的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void delete(struct node *p)
{

struct node *FD;
struct node *BK;

/*获得前一个和后一个节点*/
FD = p->fd;
BK = p->bk;

/*从链表中解绑定*/
FD->bk = BK;
BK->fd = FD;

/*装的像一点*/
free(p);
}

很正常的链表删除的工作,如果没有人恶意的修改fd和bk这两个指针的话。但是,如果一个粗心的程序猿在操作的data的时候使用了比如gets这样的函数,那么我们就可以改写这两个指针了。现在我们将待删除的节点的两个指针改改写了。

fd = addr_shellcode
bk = free@got - 0x20

现在我们把fd改成了一个地址,shellcode的地址,然后将bk改成了指向了free@got - 0x20也就是got表中的free在减0x20的地址。(不要问我想干什么,你懂的)然后我们调用一下这个delete函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
void delete(struct node *p)
{

struct node *FD;
struct node *BK;

FD = p->fd; //FD = addr_shellcode 也就是FD现在指向了shellcode
BK = p->bk; //BK = free@got - 0x20 现在的BK指向了free@got - 0x20的地方

FD->bk = BK; //FD->bk 也就是addr_shellcode+0x24 = free@got 写shellcode的时候记得跳过这里
BK->fd = FD; //BK->fd 也就是(free@got-0x20)+0x20.其实就是free@got = addr_shellcode

free(p); //嘿嘿,现在调用free的话,会跳到shellcode哦
}

然后,就没有然后了。随你搞了233333

补充

当然,其实如果双向链表中的2个指针被改写的话,会发生很多有趣的事情。有的时候也许不能使用shellcode,或者是无法让程序删除节点。但是总有方法去达到目的的,具体的方法就要看脑洞了。

总之,c语言和汇编语言才基础才是王道。