2012-07-13 49 views
1

我試圖通過改變它的EIP來破解另一個程序。有兩個程序正在運行,一個是目標,它告訴「核心函數」函數(例如接收密碼字符串作爲參數並返回true或false)的函數在內存中。 然後現在我知道核心函數在哪裏,我想用其他程序修改EIP,以便目標程序可以調用我的函數,並簡單地從它中獲得一個真實值,並打印出一個美麗的「訪問許可」。如何在不同的流程中更改EIP?

我的代碼是現在這個樣子:

目標計劃:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 


int checkPwd(char *pwd) 
{ 
    printf("\nstill in the function\n"); 
    if(strcmp(pwd, "patrick") == 0) return true; 
    else return false; 
} 


int main() 
{ 
    char pwd[16]; 

    printf("%d", checkPwd); 
    scanf("%s", &pwd); 
    system("pause"); 
    if(checkPwd(pwd)) printf("Granted!\n"); 
    else printf("Not granted\n"); 
    system("pause"); 
} 

攻擊計劃:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <memory.h> 

int returnTrue() 
{ 
    return true; 
} 
int main() 
{ 
    int hex; 
    scanf("%d", &hex); 
    memcpy((void*)hex, (void*)returnTrue, sizeof(char)*8); 
    system("pause"); 
} 

我想補充一點,我想直接把十六進制代碼(不scanf部分)在攻擊者程序中,並沒有工作,它墜毀。

所以我想我在這裏錯過了理論的一部分。我很高興知道它是什麼。

在此先感謝。

+0

對於這樣的事情,你應該包含目標程序的程序集轉儲。 – Mysticial 2012-07-13 03:06:55

+1

通過與堆棧上的返回地址混合來覆蓋EIP。 – user7116 2012-07-13 03:21:03

+0

@sixlettervariables你是什麼意思? – 2012-07-13 03:25:48

回答

5

這不起作用 - 進程佔用不同的內存空間!

現代操作系統旨在保護用戶程序免受這種類型的攻擊。一個進程無法訪問另一個進程的內存 - 實際上,數據的地址只在該進程內有效。

程序運行時,它有自己的內存視圖,只能看到內核指示memory management unit (MMU)映射的內存。

一些參考:

+0

在內存中搜索值並更改它的程序如何? SO對此做了什麼?因爲它完美的作品。 – 2012-07-13 03:24:16

+0

@PatrickBassut:你想更清楚一下你的意思嗎?你想做的事對普通用戶程序來說是不可能的,但我確信涉及內核的黑客(因此通常是某種管理特權)可以做到這一點,例如,遊戲教練。 – Ashe 2012-07-13 03:59:25

+0

我的意思是我說的。你希望我清楚什麼部分?但是沒關係,現在你提到「普通用戶程序」是不可能的。但是仍然可能通過黑客入侵內核。那麼,我所說的程序是否會破解內核?好的。 – 2012-07-13 04:02:39

2

有可能注入的功能到另一個過程,但它是一個涉及多一點比你想象的。首先,您需要通過創建兩個函數來實現此功能的適當長度。

static int realFunction() { ... } 
static void realFunctionEnd() {} 

現在,當你複製功能在你做的長度:

realFunctionEnd - realFunction 

這會給你的尺寸。現在你不能僅僅調用其他函數,因爲如上所述他們不能保證在另一個進程中處於同一地址,但是你可以假設,我將假定windows,kernal32.dll在相同的地址,所以你可以實際上在創建遠程線程時將其傳遞給realFunction。

現在,至於你真正的問題。你需要做的是注入一個dll或者將一個函數複製到另一個進程中,然後掛鉤你需要改變的函數。您可以通過複製另一個函數並使該代碼可執行,然後使用跳轉到您的注入代碼覆蓋目標函數的前五個字節來完成此操作,或者可以執行適當的繞行類型掛接。無論哪種情況都應該起作用。或者,您可以在函數中找到偏移量,然後通過編寫適當的操作碼來代替實際代碼來修補它,例如返回true。

需要某種注射或修補才能完成此操作,您有基本的想法,但目前還有一點比您想象的還要多。我有工作代碼的窗口複製到另一個進程的功能,但我相信這是一個很好的學習經驗。

+0

函數必須是靜態的嗎?如果是,爲什麼?我該如何將第二個函數用作「結束標誌」?爲什麼我不能保證地址在另一個過程中不會相同?有沒有任何操作系統程序改變它? – 2012-07-13 04:08:54

+1

如果我沒有記錯,靜態函數按順序保留,但是這不能保證,因爲它依賴於編譯器,但是對於VC++而言,它確實如此。這兩個函數在內存中一個接一個地發生,因此它們的地址也是一個接一個地。這個屬性以及一個函數名實際上是一個指向地址空間的指針,你可以把它看作一個常數無符號整型。一個操作系統可能有地址空間佈局隨機化,或者它只是沒有將exe圖像設置爲其首選基地址。您可以關閉ASLR,以保持地址類似。 – sean 2012-07-13 04:15:02

+0

明白了。關於測量功能的大小。這是否適用於任何情況?因爲聲明第一個函數時,內存中的下一個空間可能會被其他東西填充。謝謝您的幫助。 – 2012-07-13 04:21:17

相關問題