Spørsmål:
Gjenoppbygg symbolbord
allbabel
2014-06-05 19:22:49 UTC
view on stackexchange narkive permalink

Jeg vil laste inn en funksjon jeg har dekompilert i IDA Pro. Alt jeg har er IDA Pro-funksjonsnavnet sub_xxxx () og åpenbart adressen. Jeg hadde tenkt på å bruke dlopen for å laste binær binæren, men åpenbart har jeg ikke et symbol å laste inn da binæren er fjernet. Kan jeg på en eller annen måte ringe funksjonen uten symboltabell? Eller må jeg bygge om symboltabellen til binæren for deretter å bruke dlsym for å finne og laste inn symbolet?

To svar:
Peter Andersson
2014-06-05 20:21:23 UTC
view on stackexchange narkive permalink

Du kan ringe en funksjon til hvilken som helst adresse. Så last inn det dynamiske biblioteket i prosessadresseområdet, finn ut basen til det nylig lastede biblioteket og ta forskyvningen fra bunnen av biblioteket til funksjonen du ikke vil ringe og legg det sammen.

Så hvis IDA sier at basen til binærfilen er 0x4000 og funksjonen din er på adressen 0x4100 , så har du en forskyvning på 0x100 . Så hvis du laster inn biblioteket ditt, blir det lastet inn ved adresse 0x8000 , lager du en funksjonspeker (med riktig signatur selvfølgelig) som peker på adresse 0x8000 + 0x100 og ringer den. Avhengig av plattformen din, kan basen du får for det dynamiske biblioteket ditt fra plattformlasteren bli ytterligere forskjøvet fra den faktiske basen som IDA viser.

Et annet alternativ er selvfølgelig å legge til en ny eksportdefinisjon for sub_xxx () -funksjon til det dynamiske biblioteket og å ha lasteren til å håndtere eventuelle flyttinger. Det vil være langt mer pålitelig, og la deg gi funksjonen noe sunt, slik at du kan håndtere fremtidige oppdateringer til biblioteket der funksjonsadressen endres, ganske enkelt ved å legge den nye eksporten til den nye versjonen på nytt. Bruk noe sånt som BinDiff for å finne den nye plasseringen av funksjonen.

Det tredje populære alternativet er å bruke noe som ligner IDAs FLIRT signaturer for å skann det lastede dynamiske biblioteket for funksjonen direkte i minnet. Det kalles vanligvis signaturskanning og her er en grundigere forklaring av konseptet på Windows-plattformen. Veldig forenklet, det er en teknikk for å finne en funksjon basert på mønster hentet fra funksjonsprologen.

I ditt tilfelle styrer du applikasjonen fra det jeg kan se og vil ringe til et dynamisk bibliotek du ikke har kilden til. I så fall vil jeg sannsynligvis gå med det andre alternativet eller det første hvis du vet at biblioteket aldri vil endres.

Jeg liker det første alternativet, jeg tenker å bruke dlopen til å åpne biblioteket, men hvordan får jeg adressen til det lastede biblioteket i kode? Jeg kunne se på / proc / maps etc, men det ville være fint å hente den i kode.
@allbabel Jeg har ikke gjort dette selv, men kan du kanskje bruke `library = dlopen (" path ", RTLD_NOW)`, deretter `address = dlsym (library," some_known_exported_function ")`. Ta deretter forskyvningen av funksjonen din fra den kjente eksporterte funksjonen og legg den til verdien som returneres av `dlsym`?
user5843
2014-06-13 20:13:31 UTC
view on stackexchange narkive permalink

Jeg vet ikke nøyaktig ditt tilfelle. Men hvis binærlinjen bare blir strippet (eller sstrip brukes) og funksjonen din bare er et kall til et eksternt symbol på et dynamisk bibliotek, vil du kanskje ta en titt på dette lille IDA-pythonskriptet til meg: http: //h4des.org/blog/index.php?/archives/343-Restoring-external-symbol-calls-in-IDA-when-ELF-sections-are-deleted.html

Dette skriptet bruker et ELF-parserbibliotek jeg skrev (kalt ZwoELF) som prøver å bare bruke informasjon som ELF-lasteren bruker for å omgå problemer som nesten alle analyseverktøy / rammer jeg testet har fordi de stoler på valgfrie data som ELF-seksjoner. / p>



Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 3.0-lisensen den distribueres under.
Loading...