最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

二進(jìn)制安全之堆溢出(系列)—— house of spirit

2020-03-27 14:20 作者:匯智知了堂  | 我要投稿

本文是二進(jìn)制安全之堆溢出系列的第四章節(jié),主要介紹house of spirit。

原理

目的:通過任意地址free達(dá)到篡改任意地址的目的

條件

在目標(biāo)地址周圍能夠偽造一個(gè)堆塊

能夠?qū)卧斓亩褖K進(jìn)行一次free

free之后能夠重新申請(qǐng)得到這個(gè)堆塊并篡改目標(biāo)地址內(nèi)容

流程

從任意地方偽造一個(gè)堆塊

將堆塊釋放到bin鏈

將偽造的堆塊malloc取出

達(dá)到通過堆實(shí)現(xiàn)任意地址寫入的效果

Demo

#include<stdio.h>

#include<malloc.h>

#include<unistd.h>

#include<string.h>

int main(){

? ? malloc(0);

? ? int size = 0x40;

? ? long p = 0;

? ? char s[10];

? ? *((&p)+1) = size+1+0x10;

? ? sleep(0);

? ? *((&p)+3+size/8) = 0x71;? ? ? ? //更改一個(gè)chunk的size位,避免前向合并,因?yàn)槭莊astbin,故不用再構(gòu)造第三個(gè)堆塊

? ? free((&p)+2);? ? ? ? ? ? ? ? ? ? ? ? ? ? //free掉第一個(gè)堆塊的數(shù)據(jù)空間

? ? sleep(0);

? ? void *q = malloc(size);

? ? printf("%p\n",q);

? ? sleep(0);

? ? strcpy(q,"aaaaaaaa");

? ? sleep(0);

? ? return 0;

}

調(diào)試

初始化p指針(偽造p堆塊)

pwndbg> stack

00:0000│ rsp? 0x7fffffffdbc8 —? 0x4006b4 (main+78) ?— mov? ? eax, dword ptr [rbp - 0x34]

01:0008│? ? ? 0x7fffffffdbd0 ?— 0x1

02:0010│? ? ? 0x7fffffffdbd8 ?— 0x40004007bd

03:0018│? ? ? 0x7fffffffdbe0 ?— 0x0? ? ?==>p

04:0020│ rax? 0x7fffffffdbe8 ?— 0x51 /* 'Q' */

?

pwndbg> x/20gz 0x7fffffffdbe0

0x7fffffffdbe0: 0x0000000000000000? 0x0000000000000051? ? ? ==>偽造的size位

0x7fffffffdbf0: 0x0000000000400770? 0x0000000000400570

偽造下一個(gè)堆塊

pwndbg> x/20gz 0x7fffffffdbe0

0x7fffffffdbe0: 0x0000000000000000? 0x0000000000000051

0x7fffffffdbf0: 0x0000000000400770? 0x0000000000400570

0x7fffffffdc00: 0x00007fffffffdcf0? 0x675fd3aa65176f00

0x7fffffffdc10: 0x0000000000400770? 0x00007ffff7a2d830

0x7fffffffdc20: 0x0000000000000000? 0x00007fffffffdcf8

0x7fffffffdc30: 0x0000000100000000? 0x0000000000000071? ? ? ==>偽造的下一個(gè)堆塊的size

free 第一個(gè)堆塊的數(shù)據(jù)空間

0x50: 0x7fffffffdbe0 ?— 0x0

相當(dāng)于把棧上偽造的堆塊,釋放到了bin鏈里面

將以上 free 的堆塊malloc出來

0x60: 0x0 此時(shí)bins中的chunk被分配給了 q

之前偽造的p堆塊

pwndbg> x/20gz 0x7fffffffdbe0

0x7fffffffdbe0: 0x0000000000000000? 0x0000000000000051? ? ? ==>偽造的size位

0x7fffffffdbf0: 0x0000000000400770? 0x0000000000400570

此時(shí)的 q 堆塊

pwndbg> x/20gz 0x7fffffffdbe0

0x7fffffffdbe0: 0x0000000000000000? 0x00007fffffffdbf0

0x7fffffffdbf0: 0x0000000000000000? 0x0000000000400570? ==>fastbin的第一個(gè)堆塊,fd指向0

為什么size位原本是0x51,現(xiàn)在變成0x00007fffffffdbf0了呢

從匯編代碼來看,malloc之后,這個(gè)位置被重新賦值了

0x400700 <main+154>? ? call? ?malloc@plt <0x400540>

0x400705 <main+159>? ? mov? ? qword ptr [rbp - 0x28], rax ==> 重新賦值

? 0x400709 <main+163>? ? mov? ? rax, qword ptr [rbp - 0x28]

?

RBP? 0x7fffffffdc10

RAX? 0x7fffffffdbf0 ?— 0x0

即如下過程

02:0010│? ? ? ? ? 0x7fffffffdbe0 ?— 0x0

03:0018│? ? ? ? ? 0x7fffffffdbe8 —? 0x7fffffffdbf0 ?— 0x0

04:0020│ rax rdx? 0x7fffffffdbf0 ?— 0x0

05:0028│? ? ? ? ? 0x7fffffffdbf8 —? 0x400570 (_start) ?— xor? ? ebp, ebp

06:0030│? ? ? ? ? 0x7fffffffdc00 —? 0x7fffffffdcf0 ?— 0x1

07:0038│? ? ? ? ? 0x7fffffffdc08 ?— 0x400ae2129b1e7e00

向 q 中寫入 aaaaaaaa

pwndbg> x/20gz 0x7fffffffdbe0

0x7fffffffdbe0:0x00000000000000000x00007fffffffdbf0

0x7fffffffdbf0:0x61616161616161610x0000000000400500


二進(jìn)制安全之堆溢出(系列)—— house of spirit的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
无锡市| 大埔区| 文化| 讷河市| 孟连| 罗甸县| 正定县| 平顺县| 湘西| 阳江市| 双柏县| 江孜县| 灵石县| 交城县| 湘乡市| 香格里拉县| 新兴县| 许昌市| 荥经县| 尚志市| 获嘉县| 新建县| 汕尾市| 陇南市| 永清县| 潼南县| 花莲县| 正宁县| 兰考县| 红安县| 西乌珠穆沁旗| 通州市| 收藏| 永宁县| 定结县| 浠水县| 乐亭县| 奉新县| 汤阴县| 青海省| 莆田市|