Sehr geehrtes Python Forum,
Ich lese gerade Hacking - Die Kunst des Exploits.
Die Beispiele sind in C geschieben.
Ich habe versucht die Beispiele in Python zu übertragen.
Bis jetzt ist mir das auch immer gelungen.
Doch jetzt bin ich in Kapitel 0x300 wo es darum geht, wie man Speicheraddressen auslesen kann bzw. manipulieren.
Kann mir jemand helfen, wie man Speicheraddressen auslesen und manipulieren kann.
Vielen Dank für Antworten!
MfG
Robin
Speicheraddressen
Mit Speicheradressen wollen wir Pythoniacs eigentlich nicht zu tun haben.
Aber Du kannst Dir gern ein C-Modul für Python schreiben, an das Du und aus dem Du Speicheradressen und deren Werte mit Python austauschen kannst.
Gruß
Aber Du kannst Dir gern ein C-Modul für Python schreiben, an das Du und aus dem Du Speicheradressen und deren Werte mit Python austauschen kannst.
Gruß
Zum Auslesen ist vielleicht schon ctypes.memmove() das, was du suchst. Das manipulierte Objekt kannst du dann bestimmt wieder in die Adresse zurückschreiben. Ehrlich gesagt habe ich davon aber auch nicht sooo viel Ahnung.
- Blade Runner
- User
- Beiträge: 21
- Registriert: Montag 23. Februar 2009, 11:41
Gerade deshalb mag ich Python: Weil ich nicht mit Speicheradressen herumfrickeln muss.
Solltest Du das also vorhaben, benutze einfach C oder C++.
Solltest Du das also vorhaben, benutze einfach C oder C++.
[quote="Roy Batty"]All those moments will be lost in time, like tears in rain ... time to die.[/quote]
Code: Alles auswählen
Python 2.5.4 (r254:67916, Feb 17 2009, 20:16:45)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> ctypes.memset(1, 4, 4)
Speicherzugriffsfehler
@Autor: id() benutzt in CPython die Speicheraddresse als id(). Manipulieren geht so direkt nicht (und das ist gut so™). aber zumindest gibt ctypes da ja einige lustige C Standard Funktionen vor.
Mit ctypes kann man doch recht lustige Sachen machen. safelite ist bestimmt auch erwähnenswert.
Ansonsten gibt es zumindest unter Linux (möglicherweise auch bei anderen Betriebssystemen mit procfs-Dateisystem) noch die Möglichkeit, durch "/proc/self/mem" im Speicher vom Programm rumzuspielen. Der OP könnte natürlich auch eine (ausnutzbare) Schwachstelle in der Python-Implementierung seines Vertrauens finden, und damit dann den Speicher manipulieren..
Ansonsten gibt es zumindest unter Linux (möglicherweise auch bei anderen Betriebssystemen mit procfs-Dateisystem) noch die Möglichkeit, durch "/proc/self/mem" im Speicher vom Programm rumzuspielen. Der OP könnte natürlich auch eine (ausnutzbare) Schwachstelle in der Python-Implementierung seines Vertrauens finden, und damit dann den Speicher manipulieren..
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Ich mache hier gerade auch lustige Sachen. Bin anscheinend zufällig auf eine Speicheradresse gestoßen, die ich mit diesem Code auslesen kann. Sobald ich die Anzahl der Leerzeichen bei `cout` verändere, kommt wieder etwas ganz anderes raus. ^^
Ich vermute ja, das ist ein Teil von dem, was der Compiler erzeugt. Denn soweit ich das verstanden habe, verbietet Linux es, dass fremde Prozesse auf irgendwelche Adressen Zugriff haben.
Achso, ich programmiere eigentlich kein C++. Habe mir nur heute ein paar Sachen angelesen speziell für diese Aufgabenstellung.
Code: Alles auswählen
#include <iostream>
using namespace std;
int main() {
cout << " " << reinterpret_cast<const char*>(0x8048a90) << endl;
}
Code: Alles auswählen
~$ g++ -o testprog test.cpp
~$ ./testprog
CC: (Debian 4.3.3-4) 4.3.3
Achso, ich programmiere eigentlich kein C++. Habe mir nur heute ein paar Sachen angelesen speziell für diese Aufgabenstellung.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Das sollte sich mit "strings" herausfinden lassen.snafu hat geschrieben:Ich vermute ja, das ist ein Teil von dem, was der Compiler erzeugt.