Speicheraddressen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Freitag 20. März 2009, 16:33

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:
problembär

Freitag 20. März 2009, 16:52

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ß
Benutzeravatar
snafu
User
Beiträge: 5459
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Freitag 20. März 2009, 17:52

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. ;)
shcol (Repo | Doc | PyPi)
Benutzeravatar
Blade Runner
User
Beiträge: 21
Registriert: Montag 23. Februar 2009, 11:41

Freitag 20. März 2009, 18:11

Gerade deshalb mag ich Python: Weil ich nicht mit Speicheradressen herumfrickeln muss.
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]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 20. März 2009, 18:52

Ich würde auch sagen, dass es am sinnvollsten da ist tatsächlich auch C zu nutzen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Freitag 20. März 2009, 18:55

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.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Freitag 20. März 2009, 19:46

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..
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
snafu
User
Beiträge: 5459
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Freitag 20. März 2009, 22:25

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.
shcol (Repo | Doc | PyPi)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 20. März 2009, 23:06

snafu hat geschrieben:Ich vermute ja, das ist ein Teil von dem, was der Compiler erzeugt.
Das sollte sich mit "strings" herausfinden lassen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten