2016-06-25 15 views
2

Ich arbeite an einer verschleierten Binärdatei als Teil einer Crackme-Aufgabe. Es hat eine Sequenz von push, pop und nop Anweisungen (die sich tausendmal wiederholt). Funktional haben diese Chunks keine Auswirkungen auf das Programm. Aber sie machen die Erzeugung von CFGs und den Prozess der Umkehrung sehr schwer.Entfernen der Montageanleitung von ELF

Es gibt Lösungen, wie man die Anweisungen zu nop ändert, so dass ich entfernen kann sie. Aber in meinem Fall möchte ich diese Anweisungen komplett streichen, um einen besseren Überblick über die CFG zu bekommen. Wenn Anweisungen entfernt werden, verstehe ich, dass die Speicheroffsets ebenfalls geändert werden müssen. Soweit ich sehen konnte, gab es keine Werkzeuge, um dies direkt zu erreichen.

Ich verwende IDA Pro-Evaluierungsversion. Ich bin offen für Lösungen, die auch andere Reverse-Engineering-Frameworks verwenden. Es ist vorzuziehen, wenn es skriptfähig ist.

Ich ging durch eine similar question aber die vorgeschlagene Lösung ist nicht in meinem Fall anwendbar.

+3

Es gibt R2 (radare.org) Framework für Unix-Welt mit Scripting, CLI, WEB, einfache TUI und noch nicht fertig GUI. Sie können auch versuchen, bei http://reverseengineering.stackexchange.com/ – osgx

+0

zu fragen. Es ist nicht immer möglich, dies zu tun. Es ist möglich, dass Code auf relativen Offsets von Dingen beruht, die schwer automatisch zu erkennen sind. (z. B. komplexer als nur das Reparieren von Verschiebungen an Sprungadressen, die die entfernten Insns kreuzen). Aber ich denke, es lohnt sich zu versuchen, zu sehen, ob es funktioniert, ohne das Programm zu brechen. –

+0

Oder ich denke, ich sollte nur nach Wegen suchen, um die Berücksichtigung von Teilen des Codes (wie die Ritzen von 'push',' pop', 'nop' Sequenzen) zu verwerfen, während CFG erzeugt wird. Soll ich die Frage bearbeiten, oder soll ich eine neue öffnen? – gtux

Antwort

7

Ich mag würde, um vollständig diese Anweisungen abzustreifen ... Ich verstehe, dass die Speicher Offsets zu geändert werden müssen ...

In der Regel ist dies praktisch unmöglich:

  1. Wenn die Binärdatei irgendwelche dynamischen Symbole exportiert, müssten Sie die .dynsym aktualisieren (dies sind wahrscheinlich die Offsets, an die Sie denken).

  2. Sie müssten jeden statisch zugewiesenen Funktionszeiger finden und mit der neuen Adresse aktualisieren, aber es gibt keine effektive Möglichkeit, solche Zeiger zu finden.

  3. Berechnete GOTO s und switch -Anweisungen erstellen Funktionszeiger-Tabellen, auch wenn keine in der Programmquelle vorhanden sind.

  4. Wie Peter Cordes bemerkte, ist es möglich, Programme zu schreiben, die Delta zwischen zwei Assembly-Labels verwenden, und solche Deltas (kleine Direktwerte direkt in Anweisungen codiert) zu verwenden, um den Programmfluss zu steuern.

Es ist möglich, dass Ihr Zielprogramm aus allen oben genannten Komplikationen frei ist, aber auf einer Technik, viel Aufwand zu verbringen, die nur für das laufende Programm arbeitet scheint verschwenderisch.