• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

подскажите по use-after-free

swagcat228

Заблокирован
19.12.2019
341
86
BIT
0
В общем, я был тут
1585978188600.png

то есть в heap. и зациклил выделение памяти. она с помощью calloc() выделялась выделялась, а потом пробила хип c помощью memmove(). и выззвала функцию free() все это из libc вызывала испытуемая программа.

так вот, прошёл я сквозь все слои либца, сквозь стэк, и ущёл в бесконечность. мне аж немного не по себе стало)
1585978108600.png


а раздуплил меня сегфол
1585978596200.png



вот код самой проги:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define REQSZ 128

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

void check_path(char *buf) {
  char *start;
  char *p;
  int l;

  /*
   * Work out old software bug
   */

  p = rindex(buf, '/');
  l = strlen(p);
  if (p) {
    start = strstr(buf, "ROOT");
    if (start) {
      while (*start != '/') start--;
      memmove(start, p, l);
    }
  }
}

void get_requests(int in_fd, int out_fd) {
  char *buf;
  char *destroylist[256];
  int dll;
  int i;

  dll = 0;
  while (1) {
    if (dll >= 255) break;

    buf = calloc(REQSZ, 1);
    if (read(in_fd, buf, REQSZ) != REQSZ) break;
    
    printf("%s\n", buf);
    if (strncmp(buf, "FSRD", 4) != 0) break;

    check_path(buf + 4);

    dll++;
  }

  for (i = 0; i < dll; i++) {
    write(out_fd, "Process OK\n", strlen("Process OK\n"));
    free(destroylist[i]);
  }
}

int main(int argc, char **argv, char **envp) {
  printf("%s\n", BANNER);
  fflush(stdout);

  get_requests(0, 1);
  return 0;
}


а вот пэйлоад которым я её кормлю:
python -c "print('FSRD\ /ROOT' * 12228)" > ./smash




Ребят, скажите, это и есть юз-афтер-фри?
как дальше ее юзать?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!