2016-07-28 4 views
-1

Wenn ein Objekt ist wandelbar, dann ist es möglich, einen modifizierbaren Puffer durch nicht die Angabe des zweiten Argument von buffer()(das ist eine integrierte Funktion) wie folgt zu erhalten:Gibt es eine Möglichkeit, Puffer() schreibbar zu machen, ohne zu kopieren, wenn das Größenargument gesetzt ist?

>>> s = bytearray(1000000) # a million zeroed bytes 
>>> t = buffer(s, 1)   # slice cuts off the first byte 
>>> s[1] = 5     # set the second element in s 
>>> t[0]      # which is now also the first element in t! 
'\x05' 

in meinem Fall jedoch , Muss ich 0x7fffffff als den Größenparameter spezifizieren. In diesem Fall:

>>> b = buffer(bytearray('a'), 1,0x7fffffff) 

how to make b writeable without copying it’s data? In meinem Fall ist _ctypes Unterstützung deaktiviert und das Programm wird nicht als root gestartet.
Natürlich ist etwas wie memoryview verfügbar, aber ich verliere die Möglichkeit, den Speicher an jeder virtuellen Adresse zu lesen.

Antwort

0

Die Kopie ist notwendig. Der interne Puffer des Bytearrays ist einfach nicht 2 GiB lang; Wenn Sie einen Puffer mit 2 GiB wünschen, müssen Sie die Daten des Bytearrays in einen neuen Puffer kopieren.

Wenn Sie Python irgendwie dazu zwingen sollten, den Puffer als die gewünschte Größe zu behandeln, ohne eine Kopie zu erstellen, würde das Schreiben in diesen Speicher den Speicher Ihres Prozesses beschädigen und/oder einen Segfault verursachen.

+0

Haben Sie auf das Sicherheitsetikett geachtet? Ich habe vergessen, diese Frage zu beantworten (https://bugs.python.org/issue21831 "sie verwenden die Version von Python, die anfällig ist"). Ich habe die Möglichkeit erhalten, beliebigen Python-Code auf einer Website auszuführen. Aber ihr Bounty-Programm wird nur belohnt, wenn ich die Sandbox für den Interpreter * verlasse (ich benötige dazu nativen Assembler-Code) *. – user2284570

+0

'Schreiben in den Speicher würde den Speicher Ihres Prozesses beschädigen. Dies ist, was ich tun möchte: Ich muss direkt auf Systemaufrufe zugreifen, um die os-Level-Sandbox zu umgehen. Dies erfordert die Möglichkeit, eine native Assembly auszuführen, so dass ich die Python-Level-Sandbox * umgehen kann (die Python-Sandbox verhindert, dass ich die sand-Level-Sandbox verlasse) *. – user2284570

+0

@ user2284570: Nun, wenn Sie versuchen, diesen Fehler auszunutzen, stoßen Sie auf das zusätzliche Problem, dass Puffer-Objekte, die mit 'buffer' erstellt wurden, überhaupt nicht beschreibbar sind, ob Sie ein Größen-Argument übergeben oder nicht Python-Side-API, um sie schreibbar zu machen. Sie haben über das Bytearray mit 's [1] = 5' geschrieben, nicht mit dem Pufferobjekt. – user2357112

Verwandte Themen