• XSS.stack #1 – первый литературный журнал от юзеров форума

[help] Use-after-free?

swagcat228

X-pert
Эксперт
Регистрация
23.12.2019
Сообщения
284
Реакции
232
Депозит
300
В общем, я был тут
1585979242800.png

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

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


циклилась она на этих строчках либца, когда пробивала всю память, словно буром. а раздуплил меня сегфол
1585979350600.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




Ребят, скажите, это и есть юз-афтер-фри?
как дальше ее юзать?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
эмм. эни айдиас, пипл?
Вижу ты решаешь вот эти таски. Это задание на remote heap overflow, пример с UAF у тебя был тут -> https://exploit.education/phoenix/heap-two/

Если застрял, посмотри - погугли, как решали другие люди этот таск.

По поводу UAF

Use-After-Free — это уязвимость использования памяти после освобождения. UAF происходит, когда программа пытается получить доступ к участку памяти или объекту, после того, как эта часть памяти была освобождена или обращение к объекту который был удален. Это может вызвать сбой программы. И в зависимости от потока выполнения кода в программе мы можем получить выполнение произвольного кода.

Эксплуатация уязвимостей Use-After-Free сводится к тому, что:

1) Нужно подготовить кучу, разместить в ней какие-то данные, обычно для этого используют технику Heap Spraying
2) Освободить используемую память или удалить объект который будет вызван позже или обращение к памяти которая была освобождена
3) Заменить освобожденную память на другую или удаленный объект на поддельный вредоносный объект, который будет иметь тот же размер
4) Затриггерить узвимость т.е. вызвать саму уязвимость — proffit


 
1) Нужно подготовить кучу, разместить в ней какие-то данные, обычно для этого используют технику Heap Spraying
2) Освободить используемую память или удалить объект который будет вызван позже или обращение к памяти которая была освобождена
3) Заменить освобожденную память на другую или удаленный объект на поддельный вредоносный объект, который будет иметь тот же размер
4) Затриггерить узвимость т.е. вызвать саму уязвимость — proffit
спасибо за ответ!

1) +
2) +
3) а вот тут начинаются непонятки.
1586028295300.png

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

1586028449600.png


забивает приличный такой кусман памяти за 255 итераций.
и, поскольку на 256 не проходит if() - идё дальше, и начинает всё это удалять.
а дальше самое интересное. В libc функция, которая удаляет обьекты из пямяти ловит loop - и лупит в бесконечность до сегфола.

Я не могу понять как это можно контролировать, или как ей скормить что-то, что она потом затригеррит.
:(
 
я подумал о том, что если запустить много раз эту программу (к примеру эмулируя множество сетевых подключений к серверу), и забить всю память (к примеру выполняя не 256, а 255 итераций) то возможно получится попасть на кусок памяти с заблаговременно подготовленными данными?
 
Пожалуйста, обратите внимание, что пользователь заблокирован

вот тут ребята пишут, что оно не проходимо....
Видимо этот автор не осилил. Просто на ск мне известно Phoenix это тот же Protostar. И задание Final2 такое же.... Посмотри на это
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх