運行環境:Microsoft Visual C++6.0,Windows 10
以下演示通過修改函式回傳地址繞過密碼驗證,并彈出自定義對話框。
C程式代碼:
#include <stdio.h>
#include <windows.h>
#define PASSWORD "1234567"
int verify_password (char *password)
{
int authenticated;
char buffer[44];
authenticated=strcmp(password,PASSWORD);
strcpy(buffer,password);//over flowed here!
return authenticated;
}
int main()
{
int valid_flag=0;
char password[1024];
FILE * fp;
LoadLibrary("user32.dll");//prepare for messagebox
if(!(fp=fopen("password.txt","rw+")))
{
exit(0);
}
fscanf(fp,"%s",password);
valid_flag = verify_password(password);
if(valid_flag)
{
printf("incorrect password!\n");
}
else
{
printf("Congratulation! You have passed the verification!\n");
}
fclose(fp);
return 0;
}
其中的password. txt見圖中UltraEdit的內容,最終載入到與C程式同目錄的檔案夾中,如下圖專案的檔案夾所示,載入成功后,在VC中打開password文本如下圖所示。其中的十六進制對應的匯編命令如下圖,其中的兩處地址會隨運行環境不同而改變,需要自行在電腦查找,第一處是user32. dll中的Messgaboxa函式的地址:0x74E48970(見圖1),這是在Windows10和vc6中找到的地址,可通過Ollydbg進行查找,如圖所示,注意在輸入程序中將地址逆序輸入。第二處則是圖1中最后4位地址:0x0019FAB0,其對應的是代碼中buffer陣列的初始地址,可通過VC6進行逐步除錯(F11)得到,注意除錯程序中打開暫存器和記憶體視圖,如下圖5所示。
圖中不buffer陣列的地址后的紅色字體表示password文本已經將buffer陣列覆寫,顯示的正好是password文本的十六進制指令。當verify_password函式執行完畢時到達回傳地址處,其已被覆寫為:0x0019FAB0,其正好是buffer的位置,從而程式將跳轉到該地址執行構造的shellcode,彈出對話框:failwest.,如圖6所示。致此便完成了覆寫回傳地址的shellcode植入,后期可通過呼叫exit函式使程式正常退出。當然在實際攻擊程序中,很難找到要攻擊的計算機的回傳地址,因此常用jmp esp來進行攻擊。





uj5u.com熱心網友回復:
Microsoft Visual C++6.0是如何安進Windows 10的?求教uj5u.com熱心網友回復:
MEDEV檔案需要替換,網上有教程,可以看看,另外啟動后如果要打開檔案需要以管理員身份運行,不然可能出現閃退uj5u.com熱心網友回復:
是MSDEV這個檔案轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/31915.html
標籤:基礎類
