it-swarm.com.de

Können Software-Passwörter durch Reverse Engineering umgangen werden?

Angenommen, ich habe Administratorrechte in meinem Betriebssystem (Windows oder was auch immer). Wenn Software [~ # ~] xyz [~ # ~] installiert und ausgeführt wird, bedeutet dies, dass eine Kommunikation zwischen dem Betriebssystem und [~ # ~] xyz [~ # ~] und das Betriebssystem führt alles aus und sieht alles, was [~ # ~] xyz [~ # ~] tut.

Hier ist meine Wahrnehmung von Passwörtern (wie .Zip-Passwörtern):

(enter image description here

Ist es möglich, die Softwarelogik zu ändern, um den Befehl anstelle eines anderen Befehls auszuführen? Wenn ja, kann nichts vor Rissen geschützt werden?

40
T.Todua

Kurz gesagt, ja, Sie können die ausführbare Datei ändern, einen Debugger verwenden usw., um die Logik des ausgeführten Codes zu ändern.

Aber das kann nicht genug sein.

Um Ihr Beispiel für ".Zip-Passwörter" zu verwenden, verwenden passwortgeschützte Archive das Passwort, um einen Verschlüsselungsschlüssel abzuleiten. Wenn Sie kein korrektes Kennwort angeben, ist der generierte Schlüssel falsch. Selbst wenn Sie ihn so ändern, dass er einen falschen Schlüssel verwendet, wird die Zip-Datei nicht erfolgreich entschlüsselt.

Ein anderes Szenario könnte eine ausführbare setuid-Datei beinhalten, die mit höheren Berechtigungen ausgeführt wird. Sie können es unter einem Debugger ausführen oder in Ihr Benutzerkonto kopieren und Änderungen vornehmen. Dadurch wird es jedoch nur mit den Berechtigungen Ihres Benutzers ausgeführt, wodurch die Ausnutzungsmöglichkeiten zunichte gemacht werden.

79

Nun, Ihre Wahrnehmung von .Zip-Passwörtern ist nicht korrekt. Der Ansatz, der auch von vielen anderen Programmen verwendet wird, besteht darin, immer einen Entschlüsselungsalgorithmus auszuführen und ein Ergebnis zu erhalten, bevor das Programm überhaupt die Entscheidung "gutes oder schlechtes Passwort" trifft. Der Trick ist, dass die Entschlüsselung bei jedem Passwort Müll erzeugt, außer bei einem guten, das "magisch" (oder besser gesagt - mathematisch) die richtigen Daten berechnet. Das Programm weiß also nicht , wie das gute Passwort lautet.

Der "gute oder schlechte" Moment, den Sie hacken möchten, prüft nur, ob das Ergebnis Müll ist. Es ist nicht sehr vorteilhaft, das außer Kraft zu setzen.

42
kubanczyk

Ja und Nein.

Da noch niemand ein reales Beispiel (nicht computerbezogen) gefunden hat, werde ich es hier versuchen:

Stellen Sie sich vor, Sie versuchen einen Flug zu besteigen. Sie benötigen eine Bordkarte, sonst lassen Sie die Sicherheitsleute nicht durch. Wenn Sie Zugriff auf das System haben und es ändern können (sagen wir, Sie sind der CEO), können Sie die Sicherheit umgehen? Ja! Du kannst:

  • Entfernen Sie die Sicherheitsleute (entfernen Sie die gesamte Authentifizierungskomponente).
  • Bitten Sie die Jungs, alle einzulassen (entfernen Sie den Scheck "Wenn der Passagier eine gültige Bordkarte hat").
  • Bitten Sie die Jungs, Zugang zu gewähren, wenn jemand eine spezielle Bordkarte vorlegt (fügen Sie eine neue Validierungsregel hinzu, um gefälschte Anmeldeinformationen zuzulassen).

Nun ein weiteres Szenario: Eine Reihe von Safes werden in einer Bank gespeichert. Um einen Safe zu öffnen, benötigen Sie einen physischen Schlüssel, um das Schloss zu drehen.

Kannst du den vorherigen Trick ziehen? Ja, das kannst du, aber es wird nicht helfen. Es ist nicht so, dass der Sicherheitsbeamte, der dort steht, Zugang zu allen Safes hat - er hat keinen Schlüssel zu einem der Safes. Sie können ihn zum Teufel schlagen, aber er besitzt nicht nur das Notwendige (den physischen Schlüssel), um die Schlösser zu öffnen.

Sie können versuchen, das Schloss zu öffnen (Brute-Forcing), aber es wäre extrem zeitaufwändig (die Mathematik moderner Verschlüsselungsschlüssel besagt, dass Sie einige Milliarden Jahre brauchen, um es zu entsperren, selbst wenn alle Computer der Welt dies tun Du). Da sind Sie also - bei diesem Design (Datenverschlüsselung) besteht die einzige Möglichkeit, die gespeicherten Daten zu erhalten, darin, einen Schlüssel zu verwenden, der eine Umgehung unmöglich macht.

21
kevin

Sicher, Software kann alles tun, wofür Sie sie programmieren.

Als triviales Beispiel, wenn mir ein Python -Programm zur Verfügung gestellt wurde, das nach einem Passwort suchte:

password = raw_input('Enter your password: ')
if password != 'oh-so-secret':
    sys.exit(1)

do_secure_thing()

Ich könnte es ganz einfach ändern, damit es mir egal ist, wie das Passwort lautet:

password = raw_input('Enter your password: ')

do_secure_thing()

(In diesem Fall können Sie auch einfach sehen, wie das fest codierte Klartextkennwort lautet, und es eingeben.)

Bei binären Anwendungen müssen Sie diese dekompilieren, bevor Sie die Quelle ändern können. Es gibt jedoch zahlreiche Dekompilierer für gängige Sprachen.

Aus diesem Grund existiert Codesignatur .

Wenn dies nicht Ihr eigenes System ist, sind Ihre Optionen möglicherweise etwas eingeschränkter. Auf den meisten Unix-ähnlichen Systemen werden ausführbare Dateien im Allgemeinen mit Nur-Lese- und Ausführungsberechtigungen für Nicht-Root-Benutzer gespeichert. Wenn Sie nicht root sind, können Sie die ausführbare Zieldatei nicht ändern. Es gibt andere weniger direkte Methoden, die Sie ausprobieren können. Wenn diese jedoch fehlschlagen, möchten Sie zu einem anderen Vektor wechseln.

Ein Keylogger zeichnet beispielsweise die vom Benutzer eingegebenen Kennwörter auf, sodass Sie sie später selbst wiederverwenden können.

Eine andere Angriffsmethode, bei der die Quelle eines Programms nicht geändert werden muss, besteht darin, den Ladepfad der dynamischen Bibliothek so zu ändern, dass das Programm einen von Ihnen geschriebenen Bibliotheksaufruf verwendet und nicht den erwarteten. Wenn sie eine externe, dynamisch geladene Bibliothek für die Kennwortverwaltung verwenden und diese Bibliothek eine Funktion verify_password() hat, die einen Booleschen Wert zurückgibt, können Sie Ihre eigene verify_password() schreiben, die immer true und zurückgibt Laden Sie das stattdessen in.

Der eigentliche Unterschied, der die Antwort von "Ja" in "Nein" ändert, besteht darin, dass das Passwort kein Passwort, sondern ein Verschlüsselungsschlüssel ist. Wenn die Daten verschlüsselt sind, spielt es keine Rolle, was externe Programme tun - die Daten, die noch verschlüsselt werden, bis dem Entschlüsselungsalgorithmus der richtige Schlüssel zugeführt wird.

Angenommen, Sie haben eine App, die Daten in einer Textdatei (oder einer kleinen Datenbank) speichert. Um jedoch auf die Datei über die App zuzugreifen, müssen Sie ein Kennwort eingeben oder einen speziellen Prozess verwenden. Sie können die Textdatei (oder Datenbank) einfach über das Betriebssystem aus dem Dateiverzeichnis öffnen (kein Reverse Engineering erforderlich). Dies war in älteren Programmen (insbesondere in Spielen) häufig der Fall.

Aus diesem Grund ergreifen Apps, die auf Sicherheit hoffen, Maßnahmen, um die Daten vor dem Betriebssystem selbst zu schützen. B. das Verschlüsseln der Daten oder das Verschleiern der Daten, um deren Verwendung zu erschweren.

5
schroeder

Dies hängt davon ab, wie die Software XYZ das Kennwort verwendet, um die gewünschte Aktion auszuführen, und mit welcher Art von Daten sie arbeitet.

Wenn wir uns den abstrakten Algorithmus des Programms XYZ ansehen, wäre dies:

  1. Bitten Sie den Benutzer, das Passwort einzugeben.
  2. Machen Sie etwas mit dem vom Benutzer eingegebenen Passwort.
  3. Erzeugen Sie die gewünschte Ausgabe (oder führen Sie die gewünschte Aktion aus).

Ihre Frage kann also auf Schritt # eingegrenzt werden:

Ist es möglich, eine gewünschte Ausgabe zu erzeugen (oder eine Aktion auszuführen), ohne das Programm XYZ zu verwenden?

Hier sind viele Varianten möglich, aber der Hauptpunkt ist, dass die Software XYZ bestimmte Schritte ausführt, um das Ergebnis zu erzielen.

Wenn man ein Programm ABC erstellen kann, das in angemessener Zeit das gleiche Ergebnis erzielen kann, ohne dass ein Passwort erforderlich ist, das XYZ kann umgangen werden.

Dies würde anzeigen, dass der gesamte "Schutz" im Programm XYZ selbst implementiert ist.

Wenn die Erstellung eines solchen Programms ABC nicht möglich ist, basiert der Schutz auf einem Algorithmus, für den das Kennwort erforderlich ist nabhängig davon, welches Programm versucht, es zu verwenden.

Beispiel 1: Ein nicht privilegiertes Betriebssystemkonto kann kein Kennwort für einen anderen Benutzer festlegen, da es vom Betriebssystem erzwungen wird. Das Betriebssystem ist in diesem Fall also XYZ . Man kann den Computer jedoch von einem bootfähigen Laufwerk booten und die Datei mit den Kennwörtern überschreiben, da das ursprüngliche Betriebssystem derzeit nicht funktioniert und daher der Schutz nicht erzwungen werden kann. So konnten wir ohne Verwendung des Programms XYZ ein wünschenswertes Ergebnis erzielen.

Beispiel 2: Im zweiten Beispiel wird das Systemlaufwerk des Betriebssystems ordnungsgemäß mit einem starken Krypto-Algorithmus verschlüsselt. Wenn wir den Computer mit einem bootfähigen Laufwerk starten, um das ursprüngliche Betriebssystem zu umgehen, werden wir feststellen, dass wir unser Ziel nicht erreichen können, da wir nicht auf die Datei zugreifen können, die Kennwörter enthält. Es befindet sich auf einer Partition, die zuerst entschlüsselt werden muss, aber wir kennen das Passwort nicht. Ein Versuch, den Entschlüsselungsprozess brutal zu erzwingen, würde in absehbarer Zeit nicht das gewünschte Ergebnis bringen. In diesem Fall war es daher nicht möglich, das Programm XYZ oder ein anderes zu umgehen anderes Programm mit ähnlicher Funktionalität, da das zugrunde liegende Daten erfordern das Passwort.

3
VL-80

Das Zip-Passwort ist kein Beispiel für Ihre Meinung. Viele Dinge sind jedoch , insbesondere Testversionen, deren Zeit oder Funktionsumfang begrenzt sind.

Ich erinnere mich an ein paar Artikel in einem Programmiermagazin (möglicherweise Computersprache ), in denen erklärt wurde, wie das geht und wie Versuchen Sie, dies mit Ihrem Code zu tun.

Ich kenne Fälle, in denen es buchstäblich so einfach war, die Vergleichsanweisung zu finden und die Sprungbedingung zu ändern, dh ein Byte zu ändern, um die eigentliche Prüfung zu umgehen.

Dies ist manchmal der Fall, wenn der Autor einfach die Codezeile als Teil des Programms geschrieben hat. Aber für Aktivierungsschlüssel und dergleichen ist eine ganze Branche entstanden, und der Autor kann ein Kit hinzufügen, das den eigentlichen Test verschleiert und es dem Programm erschwert, zu funktionieren, wenn versucht wird, ihn mit gängigen Techniken zu umgehen, die einem Debugging-Code eines Programmierers vertraut sind .

3
JDługosz

Es hängt alles davon ab, wie das System beim Dekodieren des Passworts funktioniert.

Sie stellen sich ein sehr einfaches Passwortsystem vom Typ "Anmelden" vor, das infiltriert werden könnte. So etwas wie Zip-Dateien und Websites verwenden jedoch verschiedene Methoden, um Menschen zu bekämpfen, die nur das System bearbeiten, um es zu zwingen, das Passwort preiszugeben.

Eine Möglichkeit ist die Verwendung von MD5 zusammen mit "Salt", um die Sicherheit zu erhöhen. Dies hängt davon ab, dass das Kennwort in einen nicht erkennbaren Code umgewandelt wird, der nicht zurückgesetzt werden kann. Ein grundlegendes Beispiel dafür ist das Folgende

Das System fragt nach einem Passwort - z. Das PASSWORD-System fügt dem Passwort 'salt' hinzu - z. 1234 (Passwort ist jetzt PASSWORD1234) Das System verwendet MD5 für das Passwort mit Salt - die meisten Leute werden wissen, dass PASSWORD alleine den MD5-Code 319f4d26e3c536b5dd871bb2c52e3178 generiert. Mit dem dem Passwort hinzugefügten Salt "1234" wird MD5 nun 579f276ad2a77fd98c ein ganz anderer Code.

Zu diesem Zeitpunkt hat das System noch nicht überprüft, ob dieses Kennwort gültig war oder nicht, und leitet diesen neuen Code dann an einen anderen Abschnitt des Programms weiter, der entscheidet, ob der MD5-Code den Erwartungen entspricht oder nicht, wenn die Datei angezeigt wird ( Das ursprüngliche Passwort wurde lange Zeit aus dem Speicher verworfen.

Damit jemand diese Art von Passwort infiltrieren kann, muss er das ursprüngliche Passwort erhalten, das zuerst eingegeben wurde, und später herausfinden, ob das Programm das Öffnen der Datei zugelassen hat oder nicht. Auf einer Software auf einem Computer ist es möglicherweise möglich, das Kennwort abzurufen und später zu überprüfen, ob die Datei geöffnet wurde, und das Kennwort auf diese Weise abzurufen. Wenn das Kennwort jedoch als MD5 + -Salz an einen anderen Server gesendet wird ( Zum Beispiel durch Javascript und PHP) wird es viel schwieriger, weil ein Computer das Passwort im Speicher hat, das er konvertiert, und der PHP-Server nur das Passwort md5 + salt hat, das nicht zurückkonvertiert werden kann.

Darüber hinaus besteht eine andere Methode darin, das Kennwort zu übernehmen und es auf irgendeine Weise in den Daten zu codieren. So funktionieren Zip-Dateien. Ich habe beispielsweise eine Datei mit dem folgenden Text.

der schnelle Braunfuchs springt über den faulen Hund

Ich gebe ihm ein Ein-Buchstaben-Passwort von! ok ich weiß es ist ein bisschen einfach, aber das ist ein einfaches Beispiel - der Computer könnte das konvertieren! in es ist ASCII äquivalent und subtrahiert den ASCII-Code jedes Buchstabens von ihm, um ihn zu codieren - der ASCII-Code für! ist 33 und der ASCII-Code für t ist 116 und 116 - 33 = 83, was ist Der ASCII-Code für einen Großbuchstaben S. Wenn die Daten verschlüsselt sind, wird die obige Zeile als gespeichert

SGD PTHBJ AQNVM DEW ITLOR NUDQ SGD K @ YX CNF

wenn jemand versucht, diese Nachricht zu entschlüsseln, wissen Sie nicht, ob er das richtige Passwort hat oder nicht - wenn er das Passwort von # anstelle von eingibt! Sie würden die folgende Nachricht erhalten

vjg swkem dtqyp hqz lworu qxgt vjg nc | {fqi

das macht keinen Sinn - daher überprüfen die meisten Systeme tatsächlich die Gültigkeit eines Kennworts, ändern das Kennwort jedoch zunächst, damit es nicht von jemandem gehackt werden kann, der nur das Ergebnis umleitet. Manchmal fällt dies nur dann aus, wenn jemand es erstellt ihre eigene gefälschte Website oder ihr eigenes Programm und veranlasst den Benutzer, sein Passwort zunächst in das gefälschte Programm oder die gefälschte Website einzugeben, und natürlich umgehen viele Websites dies jetzt sogar, indem sie Authentifizierungstoken verwenden, die spezielle Passwörter generieren, die jeweils nur etwa 5 Minuten lang gültig sind Zeit (zum Beispiel der HSBC Smart Key).

2
TheKLF99

Die Frage muss geklärt werden. Ihr Verständnis, wie eine passwortgeschützte Zip-Datei gelesen wird, ist falsch. Wie andere bereits betont haben, wird eine Zip-Datei verschlüsselt (die Daten werden verschlüsselt) und das Kennwort ist der Schlüssel zum Entschlüsseln.

Was Sie beschreiben (eine Umleitung der Codeausführung durch Reverse Engineering des Codeflusses), würde dazu beitragen, die vom Programm erzwungene "Zugriffskontrolle" zu verhindern.

Also zu Ihrer ursprünglichen Frage:

Ist es möglich, die Softwarelogik zu ändern, um den Befehl anstelle eines anderen Befehls auszuführen? Wenn ja, kann nichts vor Rissen geschützt werden?

Es ist sicherlich möglich, die Softwarelogik zu ändern, um Befehle auszuführen, und die Zugriffssteuerung zu umgehen, um etwas zu tun, was das Programm sonst durch Reverse Engineering tun könnte. Dies stützt jedoch nicht Ihre zweite Aussage, dass "nichts vor Rissen geschützt werden kann". Die verschlüsselte Zip-Datei ist ein gutes Beispiel dafür, wo Sie durch die Kontrolle über den Code nicht den Inhalt der Datei erhalten.

In diesem Fall ist der Schlüssel kein Gatekeeper, der Sie daran hindert, einen Codepfad auszuführen, sondern eine erforderliche Komponente, um an die Klartextdaten zu gelangen. Nichts mit Programmablaufsteuerung zu tun.

1
JesseM