Frage

Hintergrundgeschichte: Während eines Programms unter Ausführung strace Ich bemerke, dass '/dev/urandom' sein wird open'ed. Ich würde gerne wissen, woher dieser Anruf kommt (er ist nicht Teil des Programms selbst, er ist Teil des Systems).

Mit GDB versuche ich zu brechen (mithilfe von GDB catch syscall open) Programmausführung, wenn die open Der Anruf wird ausgestellt, damit ich einen Backtrace sehen kann. Das Problem ist, dass open wird genannt viel, wie ein paar hundertmal, so dass ich den spezifischen Anruf nicht eingrenzen kann, der sich öffnet /dev /urandom. Wie soll ich den spezifischen Anruf einschränken? Gibt es eine Möglichkeit, nach Argumenten zu filtern, und wenn ja, wie mache ich das für eine Systemsanlage?

Jeder Rat wäre hilfreich - vielleicht gehe ich alles falsch vor.

War es hilfreich?

Lösung

GDB ist ein ziemlich leistungsfähiges Werkzeug, hat aber eine kleine Lernkurve.

Grundsätzlich möchten Sie einen bedingten Haltepunkt einrichten.

Verwenden Sie zunächst die -i -Flagge zu Strace oder Objdumph -d, um die Adresse der offenen Funktion oder realistischer in der Kette des Ankommens zu finden, z. B. in der PLT.

Legen Sie einen Haltepunkt an diese Adresse fest (wenn Sie Debug -Symbole haben, können Sie diese stattdessen verwenden, und ich gehe davon aus, dass Sie dies nicht tun - obwohl Sie sie möglicherweise für Bibliotheksfunktionen haben, wenn nichts anderes.

break * 0x080482c8 

Als nächstes müssen Sie es bedingt machen

(Idealerweise konnten Sie ein String -Argument mit einer gewünschten Zeichenfolge vergleichen. Ich habe dies nicht innerhalb der ersten Minuten nach dem Versuch zum Laufen gebracht.)

Hoffen wir, dass wir davon ausgehen können, dass die Zeichenfolge irgendwo im Programm oder einer der Bibliotheken, die sie lädt, eine Konstante ist. Sie können in/proc/pid/maps schauen, um eine Vorstellung davon zu bekommen, was geladen wird und wo und dann Grep verwenden, um zu überprüfen Fand es tatsächlich im Speicher, indem Sie den hohen Teil der Adresse aus Karten mit dem niedrigen Teil der Datei kombinieren. (Bearbeiten: Es ist wahrscheinlich einfacher, LDD für die ausführbare Datei zu verwenden, als in/proc/pid/maps zu schauen)

Als nächstes müssen Sie etwas über den ABI der Plattform wissen, an dem Sie arbeiten, insbesondere wie Argumente übergeben werden. Ich habe in letzter Zeit an Arms gearbeitet, und das ist sehr schön, da die ersten Argumente einfach in Registern R0, R1, R2 ... usw. sind. X86 ist etwas weniger bequem - es scheint, dass sie auf den Stapel gehen, dh, * ($ ESP+4), *($ ESP+8), *($ ESP+12).

Nehmen wir also an, wir sind auf einem x86 und möchten überprüfen, ob das erste Argument in ESP+4 der Adresse entspricht, die wir für die Konstante gefunden haben, die wir versuchen, es zu fangen. Nur ESP+4 ist a Zeiger auf Ein Char -Zeiger. Wir müssen es also zum Vergleich Dereference.

cond 1 *(char **)($esp+4)==0x8048514

Dann können Sie tippen Lauf und hoffe auf das Beste

Wenn Sie Ihren Haltepunktzustand fangen und sich mit Info -Registern und dem Befehl X um den Speicher umsehen, erscheint der Befehl Rückgabe, den Anrufstapel zu überwinden, bis Sie etwas finden, das Sie erkennen.

Andere Tipps

Wie Andre Puel sagte:

break open if strcmp($rdi,"/dev/urandom") == 0

Könnte den Job machen.

(Angepasst aus einer Frage bearbeiten)

Folgen Chris 'Antwort, Hier ist der Prozess, der mir schließlich das dazu gebracht hat, nach dem ich suchte:

(Ich versuche herauszufinden, welche Funktionen das rufen open SYSCALL auf "/dev/urandom"))

  1. Verwenden Sie LDD für ausführbare Datei, um geladene Bibliotheken zu finden
  2. grep Durch jeden BIB (Shell -Befehl) sucht nach "Urandom"
  3. Öffnen Sie die Bibliotheksdatei im HEX -Editor und suchen Sie die Adresse der String
  4. Finden Sie heraus rdi - Ihre Kilometerleistung kann variieren
  5. Jetzt können wir den bedingten Haltepunkt festlegen: break open if $rdi == _addr_
  6. Programm ausführen und warten Sie, bis die Pause getroffen wird
  7. Lauf bt Backtrace sehen

Nach all dem finde ich, dass GLIBs g_random_int () und g_rand_new () urandom verwenden. GTK+ und Orbit nannten diese Funktionen - wenn jemand neugierig war.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top