Tijdens Hack in the Box Amsterdam heeft de Nederlandse beveiligingsonderzoeker Jurriaan Bremer een nieuwe manier gepresenteerd voor binaire obfuscatie. In zijn tool genaamd SSEXY maakt hij gebruik van de SSE-instructieset om reverse engineering te bemoeilijken. De SSE-instructieset is bedoeld voor floating point berekeningen en wordt daarmee vooral gebruikt door grafische toepassingen. Veel andere applicaties maken hierdoor geen gebruik van de SSE-instructies.
De bijbehorende XMM-registers blijven hierdoor ook ongebruikt. De XMM-registers zijn 128-bits groot, wat betekent dat twee XMM-registers genoeg zijn om alle normale registers te kunnen bevatten. De SSEXY-tool van Bremer decompileert een gegeven binair bestand en vervangt veel voorkomende opcodes voor een SSE-equivalent. Het resultaat wordt weer verwerkt tot een werkend binair bestand. Momenteel worden alleen Windows-bestanden ondersteund, hoewel ondersteuning van Linux eenvoudig is toe te voegen, aldus Jurriaan.
Reverse engineering
Door de SSE-obfuscatie groeit het aantal instructies met ongeveer een factor tien. De huidige reverse engineerings tools zoals IDA Pro lijken hier nog niet goed mee overweg te kunnen. In zijn presentatie liet Bremer zien hoe hij normale x86 instructies emuleert en wat hier bij komt kijken. Zo heeft x86 de mogelijkheid om een adres in het geheugen op te bouwen uit meerdere registers en eventueel een extra offset, wat ook moet worden geemuleerd.
Daarnaast heeft de SSE-instructieset geen mogelijkheden voor 'branching', het aanroepen van andere functies. Dit type instructie kan dan ook niet worden omgezet naar een SSE-equivalent. Tenslotte kunnen er problemen ontstaan wanneer grafische functies gebruikt worden, omdat deze wel gebruik maken van SSE-instructies. Wanneer zo'n functie gebruikt wordt, moet tijdelijk data uit de XMM-registers ergens anders opgeslagen worden.
Obfuscatie
Verder presenteerde Bremer eventuele verbeteringen bovenop de huidige obfuscatie. Zo kunnen de XMM-registers nog door elkaar worden gehaald en zou de inhoud van deze registers kunnen worden versleuteld. Voor beide technieken is het nodig de informatie te ontsleutelen en weer versleutelen elke keer dat een register gelezen, dan wel geschreven, wordt.
Buiten dat laat Bremer weten dat het mogelijk is dit soort versleuteling op een per-functie basis te doen, wat inhoudt dat elke functie een eigen
versleuteling heeft, om het nog lastiger te maken. Momenteel doet SSEXY een 1 op 1 vertaling van x86 instructies naar hun SSE-equivalent, maar door het combineren van bestaande obfuscatietechnieken met SSEXY is dit nog verder uit te werken.
Onderzoek
Vooralsnog is het voornamelijk een onderzoeksproject om de mogelijkheden van SSE-obfuscatie te verkennen en is de tool nog erg gelimiteerd. De SSEXY binaries draaien ongeveer vijf keer trager dan normaal, wat onder normale omstandigheden acceptabel is. De tool is opensource en gratis beschikbaar.
Deze posting is gelocked. Reageren is niet meer mogelijk.