Jeg har vært interessert i automatisk sårbarhetsvurdering og dekompilering av kode en stund nå. Og som et resultat har jeg bygget parsere i Python som leser en søppel, demonterer instruksjonen ved instruksjon mens jeg sporer kjøringen (slik IDA gjør det).
Jeg har sporet forurensede registre (forurenset som i brukerinngang) for å sjekke når slike registre tillater oss å sette opp en samtale eller et hopp.
Denne undersøkelsen har vokst til det punktet hvor jeg vil transformere den til en dekompilator. Jeg har sett på boomerang og andre dekompilere med åpen kildekode. Jeg har også tatt en rask titt inn i dragen-boken (jeg eier den ikke). Jeg vil gjerne høre hva dere synes om denne ideen. Nedenfor er oversikten min:
- Åpne den binære filen for å dekompilere.
- Oppdag en filtype (PE eller ELF) for å velge EP og minneoppsett.
- Gå til EP og følg kjøringsveien til koden mens du demonterer. Jeg bruker udis86 til det. Denne utførelsen er på en slags måte.
- Analyser den resulterende forsamlingen som et mellomspråk. For å få instruksjoner for enklere (f.eks. Fjern alltid ting som
SHL EAX, 0x02
og endre disse tingene tilMUL
instruksjoner). - Analyser det i et abstrakt syntaks-tre.
- Optimaliser AST (selv om jeg ikke aner hvordan).
- Transformer AST til noe som ser ut som C.
Jeg har problemer med de to siste trinnene. Hvordan analyserer noen AST til et ekte språk eller noe som ser ut som det? Hvordan optimaliserer du AST-er? Finnes det C- eller Python-biblioteker for å oppnå det?