1
我一直在努力爲「緩衝區溢出linux 64位」挑戰測試程序。啓動程序時,它會提示輸入密碼。緩衝區溢出 - linux 64bit
其目的是在密碼字段處利用緩衝區溢出故障來訪問shell部分。因爲我是這個領域的初學者。我去網上學習了一些教程。在我的研究之前和期間,我在這個網站上多次下降,以便更好地瞭解main.c
中的源代碼,也可以在下面的鏈接中找到。
我用GDB和objdump的在Linux上的斷點和拆卸。
調查結果/採取措施:
- 進入存儲在
RSP
當我做的 外殼地址,這是一種在我的電腦0x555555559bd
在 ASCII轉換的密碼。 - 然後,我倒過來,我得到:
½IUUUU
。 - 當我輸入這個值作爲密碼時,我的地址
0x555555559bd
正好在RSP
註冊表中。 - 我也知道我可以粉碎
RBP
的值,例如鍵入:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa½IUUUU
。 - 該地址寫在
"½IUUUU"
在RBP
。
問:這就是我阻止我只是想知道我可以做做地址0x9bd
跳什麼樣的注射?
這是包含源代碼和cc命令的文件: http://mtnb.be/test_login_overflow.rar。
代碼:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define BANNER "\n\
BUFFER OVER FLOW TEST\n\
"
char passwd[33] = {0};
void readPasswd(){
FILE *file = fopen("/home/user/passwd", "r");
if (!file){
puts("ERROR: Unable to read /home/user/passwd");
exit(1);
}
fread(passwd, 1, 32, file);
}
void runShell()
{
system("bash");
}
int check_passwd(){
char debug = 0;
char buffer[33] = {0};
puts("Enter your password:");
fflush(stdout);
scanf("%s", buffer);
if (debug){
printf("runShell @ %p\n", runShell);
fflush(stdout);
}
if (strncmp(passwd, buffer, 32))
return 0;
else
return 1;
}
void login()
{
while (1){
if (check_passwd())
break;
puts("Invalid password !");
fflush(stdout);
}
puts("Welcome admin, here is your shell !");
fflush(stdout);
runShell();
}
int main()
{
char passwd[33] = {0};
puts(BANNER);
fflush(stdout);
readPasswd();
login();
return 0;
}