Kunskapsbank

Reverse engineering – från strängar och imports till en teknisk hypotes

Reverse engineering blir effektivare när man bygger en serie små hypoteser från filformat, strings, imports och kontrollflöde i stället för att försöka förstå hela binären på en gång.

Ämnesspecifik teknisk illustration för artikeln Reverse engineering – från strängar och imports till en teknisk hypotes

Reverse engineering är ett område där små designval ofta avgör om kontrollen blir robust eller bara ser bra ut på papper. Reverse engineering blir effektivare när man bygger en serie små hypoteser från filformat, strings, imports och kontrollflöde i stället för att försöka förstå hela binären på en gång.

Reverse engineering i praktiken

Första byggstenen: Imports visar vilka externa funktioner programmet kan använda. Det behöver kopplas till ett tydligt syfte och kunna observeras i den miljö där kontrollen faktiskt ska användas.

En annan viktig del: Cross-references hjälper att hitta var en intressant string eller API faktiskt används. Det behöver kopplas till ett tydligt syfte och kunna observeras i den miljö där kontrollen faktiskt ska användas.

Det tekniska ankaret: Function boundaries och calling conventions behövs för korrekt tolkning. Det behöver kopplas till ett tydligt syfte och kunna observeras i den miljö där kontrollen faktiskt ska användas.

Det som ofta avgör kvaliteten: Packer eller obfuskering kan göra statisk bild missvisande. Det behöver kopplas till ett tydligt syfte och kunna observeras i den miljö där kontrollen faktiskt ska användas.

Praktisk införandeordning

  1. Identifiera arkitektur och filformat.
  2. Leta efter högsignalstrings och imports.
  3. Följ cross-references till relevant funktion.
  4. Namnge variabler och funktioner utifrån evidens.
  5. Bekräfta hypotesen med debugger eller kontrollerad runtime-observation.

För Reverse engineering håller jag därför införandet i små steg. Då går det att skilja ett säkerhetsproblem från ett rent driftfel och att rulla tillbaka just den ändring som gav ett oväntat resultat.

Så kan det se ut

Om en string ser ut som en URL följer jag referensen till funktionen som använder den. Först då kan jag avgöra om den är aktiv konfiguration, debugtext eller helt oanvänd data.

Tre risker i implementationen

  • Att döpa en funktion efter första gissningen och sedan behandla namnet som fakta.
  • Att fokusera på varje instruktion i stället för dataflödet.
  • Att köra okänd binär utanför isolerad miljö för att bekräfta en teori.

När jag anser ändringen färdig

För Reverse engineering vill jag avsluta med mätbara efterkontroller i stället för att nöja mig med att en statusruta visar ”enabled”. De viktigaste kontrollerna här är:

  • Viktiga slutsatser har adress eller cross-reference.
  • Runtime-observation stödjer eller falsifierar statisk hypotes.
  • Anteckningar gör analysen reproducerbar för nästa person.

Ett negativt test hör också till Reverse engineering: den väg, identitet eller operation som inte ska vara tillåten ska misslyckas på ett förutsägbart sätt. Då kan nästa tekniker upprepa kontrollen och förstå både avsikten och gränsen.

Slutsats

Reverse engineering – från strängar och imports till en teknisk hypotes handlar därför inte om att samla fler säkerhetsinställningar. Det handlar om att minska en konkret risk med en kontroll som har tydligt scope, tydlig ägare och ett verifierbart resultat. När före-läge, förändring och eftertest dokumenteras blir säkerhetsarbetet både säkrare och lättare att förvalta.