2017-06-03 25 views
0

我是新來的系統安全,我試圖實現一個簡單的返回到libc的利用。隨着GCC的-fno-stack-protector集,現在我知道如何利用緩衝區溢出錯誤粉碎返回地址。現在我想通過覆蓋地址爲system()的一個函數的正確返回地址來指定目標程序的控制流程到C的system()函數(我編譯程序時使用了-static選項集,以便所有C的標準函數都在可執行代碼)。例如,目標程序是這樣的:x86_64 assembly labguage中stdlib.h的system()函數的參數在哪裏?

int main(int argc, char *argv[]) { 
    char buffer[8]; 
    gets(buffer); 
    return 0; 
} 

我可以用system()我找到gdb的拆機函數的地址覆蓋main()的返回地址。我想提供「/ bin/sh」作爲system()的參數,但我不知道地址空間中的system()函數的參數在哪裏。任何人都可以幫我弄清楚我在哪裏可以找到論點?

回答

5

x86-64上使用的調用約定將參數傳遞到寄存器中。第一個參數在RDI中傳遞。這與x86的主要區別在於,參數通常在堆棧上傳遞。

要傳遞的精雕細琢的參數傳遞給函數,你需要使它出現在RDI,無論是通過:

  1. 製作main()把該值存在。 (在這種情況下可能不可能)

  2. 使用ROP小工具。在存儲器中查找指令序列pop %rdi; retq,然後按照該順序返回到堆棧上的地址爲"/bin/sh"system()的序列的地址。

    如果找不到確切的序列,則可以使用包含RDI的不同彈出和返回序列,並推送額外的垃圾值以適應該序列。例如,如果您發現pop %rdi; pop %rbp; retq,則會在製作完成的RDI之後推送額外的值。

相關問題