Как провести переполнение буфера в PHP / Python? - PullRequest
6 голосов
/ 17 января 2010

Вот пример в 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 ]

9 голосов
/ 17 января 2010

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

2 голосов
/ 18 января 2010

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

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

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

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

2 голосов
/ 17 января 2010

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

Но зачем тебе это делать?

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

1 голос
/ 17 января 2010

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

1 голос
/ 17 января 2010

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

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

0 голосов
/ 19 мая 2017
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()
...