簡體   English   中英

為什么我不能使用 memory 地址設置斷點

[英]Why cant i set Breakpoints using the memory addresses

當我遇到 x68_64 bufferOverFlows 的本教程時,我正在學習匯編處理器架構和漏洞利用開發,因此我復制了 vuln 代碼並使用 gcc 編譯它。 我編譯的二進制文件不允許我設置斷點,但是當我從網站下載二進制文件時(“我不想這樣做”)它工作正常,memory 地址正常

但是當我使用 gdb 在我的編譯程序中轉儲 main 時,我的 memory 地址如下所示: 0x000000000000085e <+83>: lea -0xd0(%rbp),%rax

End of assembler dump.

當我嘗試在 scanf function: (gdb) break *0x000000000000085e Breakpoint 1 at 0x85e (gdb) run 之后設置中斷點時

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

void validate(char *pass) {
   if (strcmp(pass, "[REDACTED]") == 0) {
        printf("ACCESS GRANTED!");
        printf("Oh that's just idio... Oh my god!\n");
    } else {
        printf("Damn it, I had something for this...\n");
    }
}

int main(int argc, char **argv) {
    char password[200];
    printf("C:/ENTER PASSWORD: ");
    scanf("%s", password);
    validate(password);
   return 0;
}

您可以在虛擬地址上設置斷點,但objdump不知道您的 PIE 可執行文件將映射到 memory 的位置,因此它使用0作為基地址。 為了使事情變得更簡單,請禁用 PIE( 您的發行版顯然默認啟用)。 大概您的教程是在這很常見之前編寫的。 使用gcc -fno-pie -no-pie -g foo.c -o foo 然后您在objdump -drwC -Mintel中看到的地址將匹配運行時地址。

但是 IDK 為什么需要數字地址; 從那里使用b main和單步。 即使您省略-g ,您仍然會有函數的符號名稱。


要解決所提出的問題,請參閱在 GDB 中的第一條機器代碼指令處停止在 GDB 入口點上設置斷點,以在不禁用 ASLR 的情況下剝離 PIE 二進制文件

一旦你的可執行文件有一個正在運行的進程,你可以p &maindisas main來找到main的實際運行時地址。 但請注意,gdb 禁用 ASLR,因此,如果您在針對 PIE 可執行文件的漏洞利用中使用 GDB 找到的代碼地址,它們在 GDB 下運行時才有效。 “正常”運行它將隨機化映射可執行文件的虛擬地址。 (這就是為什么我建議構建一個位置相關的可執行文件)。 但更有可能您只想返回可執行堆棧上的可執行代碼,在這種情況下,堆棧 ASLR 很重要,並且堆棧 ASLR 仍然發生在普通的舊位置相關可執行文件中(除非您也禁用它,如 gdb 那樣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM