[英]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 &main
或disas main
來找到main
的實際運行時地址。 但請注意,gdb 禁用 ASLR,因此,如果您在針對 PIE 可執行文件的漏洞利用中使用 GDB 找到的代碼地址,它們僅在 GDB 下運行時才有效。 “正常”運行它將隨機化映射可執行文件的虛擬地址。 (這就是為什么我建議構建一個位置相關的可執行文件)。 但更有可能您只想返回可執行堆棧上的可執行代碼,在這種情況下,堆棧 ASLR 很重要,並且堆棧 ASLR 仍然發生在普通的舊位置相關可執行文件中(除非您也禁用它,如 gdb 那樣)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.