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.
Benutzeravatar
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Speicheraddressen

Beitragvon INFACT » 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

Beitragvon 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: 5428
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » 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

Beitragvon Blade Runner » 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++.
Roy Batty hat geschrieben:All those moments will be lost in time, like tears in rain ... time to die.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » 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

Beitragvon str1442 » 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

Beitragvon Trundle » 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: 5428
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » 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=]#include <iostream>
using namespace std;

int main() {
cout << " " << reinterpret_cast<const char*>(0x8048a90) << endl;
}[/code]

[code=]~$ g++ -o testprog test.cpp
~$ ./testprog
CC: (Debian 4.3.3-4) 4.3.3[/code]

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

Beitragvon birkenfeld » 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/

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder