Seite 1 von 1

Speicheraddressen

Verfasst: Freitag 20. März 2009, 16:33
von INFACT
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 :wink:

Verfasst: Freitag 20. März 2009, 16:52
von problembär
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ß

Verfasst: Freitag 20. März 2009, 17:52
von snafu
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. ;)

Verfasst: Freitag 20. März 2009, 18:11
von Blade Runner
Gerade deshalb mag ich Python: Weil ich nicht mit Speicheradressen herumfrickeln muss.
Solltest Du das also vorhaben, benutze einfach C oder C++.

Verfasst: Freitag 20. März 2009, 18:52
von Leonidas
Ich würde auch sagen, dass es am sinnvollsten da ist tatsächlich auch C zu nutzen.

Verfasst: Freitag 20. März 2009, 18:55
von str1442

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
:o Wer braucht denn bitte memset in Python? :D Damit kann ich mir scheinbar sogar genüsslich nen Modul zusammenschiessen indem ich ausnutze, das id() eine Speicheraddresse zurückgibt und das dann als Pseudopointer benutzen. `ctypes.memset(id(ctypes), ...)` hat aber schon was.

@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.

Verfasst: Freitag 20. März 2009, 19:46
von Trundle
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..

Verfasst: Freitag 20. März 2009, 22:25
von snafu
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. ^^

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
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.

Verfasst: Freitag 20. März 2009, 23:06
von birkenfeld
snafu hat geschrieben:Ich vermute ja, das ist ein Teil von dem, was der Compiler erzeugt.
Das sollte sich mit "strings" herausfinden lassen.