Gdb Print Format Binære Alternativer


Jeg har GDB, men binæret Jeg vil ha omvendt ingeniør dynamisk, har ingen symboler, det vil si når jeg kjører filverktøyet, viser det meg strippet: Hvilke alternativer har jeg hvis miljøet der dette kjøres, ikke tillater en ekstern IDA Pro-forekomst å koble til gdbserver. Kort sagt: miljøet du har er begrenset til hva det gjør at du kan gjøre, men du har pålitelig gammel gdb og en binær til å reversere ingeniør. spurte Apr 27 13 kl 3:13 Konvensjoner brukt pluss foreløpige kommentarer Jeg trimmer produksjonen av GDB for korthet siden det vanligvis viser opphavsretten og annen informasjon i begynnelsen av evig økt. Når jeg reproduserer utgangen Ill starter ved den første (gdb) ledelinjen, eller i tilfelle eller automatisk utførte kommandoer fra den første ekte utgangslinjen. For å skille kommandoer inn i GDB-spørringen, vil disse ha en ledende (gdb) akkurat som i den virkelige verden. For shell-kommandoen vil dette heller ikke være noe prefiks i det hele tatt eller som det ser ut til å være konvensjonen på de fleste unixoid-systemer. Når jeg bruker en bestemt kommando, for eksempel vim som redaktør, er du fri til å bruke din egen favorittredaktør selvfølgelig. Det er emacs eller nano. Jeg vil ikke dømme deg) Komme i gang Denne delen handler om å sette opp ditt gdb-miljø og starte prosessen. Jeg inkluderer også noen få godbiter for de komplette nybegynnere. Tricks du bør vite GDB har en fin ledetekst hvor markøren stopper etter at programmet bryter eller når du går eller noen ganger. Hvis du trykker på RETURN (aka ENTER) etter at du har kjørt en GDB-kommando, kjøres den samme kommandoen igjen. Dette er nyttig når du går gjennom kode med trinn eller neste og vil bare fortsette en etter en. Kommandoer kan forkortes så lenge de er entydige. For noen ofte brukte kommandoer eksisterer en bestemt stenografi som har forrang til tross for tvetydighet: b for pause (til tross for bt og backtrace) c eller fortsett for å fortsette (til tross for fange. Samtale) n for neste (til tross for ni og neste) Du kan ringe faktiske biblioteksfunksjoner eller til og med funksjoner fra det feilsøkte programmet ved hjelp av kommandoen. Dette betyr at du kan prøve ut atferd eller tvingende atferd. Du kan starte GDB med gdbtui eller gdb - tui for å få en - tilsynelatende mer praktisk - mer visuelt tekstbrukergrensesnitt. Det viser kildekoden øverst og (gdb) spørringen nedenfor. Du kan også bytte til dette oppsettet ved å utføre kommandoen layout src ved (gdb) prompt. GDB har en kommandolinjeproduksjon som mange skjell, så bruk Tab til din fordel, og sørg også for å bruke hjelp eller hjelpe keywordcommand når du trenger hjelp. shell lar deg utføre kommandoer i skallet, slik at du kan kjøre kommandoer fra din GDB-økt. Under utviklingen vil et eksempel være shell make. skrive ut. undersøke og vise kjente forskjellige formater (FMT) som du kan bruke til å gjøre utgangen mer lesbar. Når feilsøking på kildenivå kan du bruke C-type kaster til å vise verdier. Tenk deg en C-streng bak et tomrom (hvilken GDB vet takket være symbolene i dette tilfellet). Gjør enkelt til (char) og skriv ut det: print (char) variabel. Å få prosessen til å løpe Siden vi vil dynamisk analysere binæret, må vi starte det først. Kommandolinje Vi kan gjøre det rett fra kommandolinjen ved å passere ikke bare banen til binæret, men også argumentene vi ønsker å starte med. Hele prosessen ser så ut som dette: Enkel nok. Fra (gdb) ledelsen kan du deretter utstede kommandoen Run (shorthand r) for å kjøre. exe med parametrene gitt på kommandolinjen. Jeg foretrekker denne metoden, men kjørelengde kan variere. GDB prompt Brann opp GDB og ved (gdb) spørre bruk filkommandoen for å laste binæret og bruk deretter kjørkommandoen for å starte det med argumentene du vil sende: et alternativ til det ovenfor ville være bruken av angitte args som Dette: Du kan også se hvilke argumenter som kjører ville passere til startprosessen ved å utgi en: btw: Hvis du lurte på miljøvariabler, bruk GDBs innebygde hjelpekommando som hjelpesett og hjelp med å vise. Pointers: sett miljø VARNAMEVALUE og vis miljø VARNAME og unset miljø VARNAME. Phew, men hvorfor stopper programmet med en SIGSEGV (segmentfeil) Vel, vi vet ikke ennå, men det ser ut til at dette lille bekkenet ønsker riktig behandling. Siden vi praktiserer defensiv databehandling, ønsker vi ikke å kjøre noe vi ikke vet mye om, så vi kan begynne igjen. Hvis dette skulle vært skadelig, må vi skylle maskinen og installere eller gjenopprette et øyeblikksbilde hvis det er en VM-gjest. Først vil du kjøre info-kommandoen som følger: Det er to viktige opplysninger, det mest relevante for oss å være linjen som angir: OK, så vi kan sette et pause på den ene og deretter kjøre prosessen med argumentene vi fancy..gdbinit for seieren Men vent, dette blir kjedelig allerede. Ingen enkel metode for å automatisere disse trinnene på noen måte Faktisk finnes det. En fil med navnet. gdbinit kan brukes til å utstede kommandoer til GDB ved oppstart. Du kan også sende en fil med GDB-kommandoer ved hjelp av - x-argumentet på kommandolinjen (shell). Hvis jeg har en rekke prosjekter, er de vanligvis i undermapper med en. gdbinit-fil hver. Side-notat: - nx forhindrer at. gdbinit innholdet blir utført ved oppstart. Så vi vet hvilke argumenter vi vil passere og vi vet adressen til bruddpunktet, dette oversetter til følgende. gdbinit-fil: Utgangen jeg får når jeg starter gdb uten noen andre argumenter er: Nice, men dette ser annerledes ut. Assembly og GDB Så du pleide å se neste linje du kommer til å kjøre og deretter din pålitelige gamle (gdb) ledetekst. Men ikke slikt. Vi har ingen kilde for dette binære og dessuten symboler. Doh Så vi tenker på den blinkende vognen på (gdb) spørsmålet og lurer på hva du skal gjøre. Ikke bekymre deg, GDB kan også håndtere forsamlingskoden. Bare problem, det er standard - etter min mening - ubeleilig ATampT-samling syntaks. Jeg foretrekker Intel-smaken og følgende kommando forteller GDB å gjøre nettopp det: Visninger forsamlingskoden Og hvordan skal det vise oss forsamlingskoden Vel, lik TUI-modusen (sjekk tagwiki for gdb) ved å bruke følgende kommando: og hvis du er så tilbøyelig, også: som vil også vise deg innholdet i registret i en oversikt. La oss kjøre det igjen Så vi ender opp med følgende. gdbinit for våre formål: Og når vi starter gdb uten argumenter, slutter vi med dette: Søt. Så vi kan se demontering mens vi går gjennom koden. Vi kan konkludere dette her, men selvfølgelig er det flere triks å bli lært, så hvorfor ikke gå litt lenger. MERK: registerene med whitegray-bakgrunnen viser at verdien har endret seg. Ikke så meningsfylt når vi nettopp startet programmet, men det er veldig nyttig når du går gjennom kode senere. btw, hvis du foretrekker å lagre skjermfeltet og ha det mindre visuelt, starter med GDB 7.0 kan du bruke: på GDB-versjoner før det kan du etterligne oppførselen ved innstillinger en automatisk skjerm: eller kortere dispi-pc hvor jeg er formatet, du kan huske det best ved å tenke at instruksjon og pc er instruksjonspekeren, også kjent som programteller - dermed pc. Også godt å vite Noen ganger når man går gjennom forsamlingen, blir regs og asm visninger borked. Bare utfør de respektive layoutkommandoene igjen for å gjenopprette dem til sin gamle herlighet: Feilsøking på monteringsnivå Viser seg når du er i samlingsmodus Noen av kommandoene du er vant til fra feilsøking på kildenivå, pleier ikke å fungere. Det er fornuftig, fordi en enkelt kilde linje betyr vanligvis et dusin instruksjoner eller mer. De neste og trinnkommandoene har imidlertid opplæringsnivåer: nexti (shorthand ni. Noen andre tenker på busk) stepi (shorthand si) Fra vår demontering ovenfor vet vi: og for alle praktiske formål er dette hovedfunksjonen. Selvfølgelig, hvis du skulle reversere maskinvareprogramvare, bør du være forsiktig, men i dette tilfellet er det. Så kan vi legge til et bruddpunkt i denne adressen (0x40f961) i stedet for inngangspunktet: Hvis vi undersøker (shorthand x) koden der vi er for øyeblikket, kan vi se: Ok, samtalen er det vi vil følge, så vi kan gå innsiden av det ved hjelp av si. Vi får se en annen samtale umiddelbart ved instruksjonspekeren når du går inn i funksjonen: Samtalen fører oss til en funksjon som kaller ptrace (PTRACETRACEME.). nå hvorfor skulle det gjøre det vel, det er et gammelt anti-debugger-triks som Mellowcandle har beskrevet i en annen QampA her: Men hvordan går vi rundt det Vi må overskrive samtalen til funksjonen som kaller ptrace () med nop eller noe sammen de linjene. Dette er hvor GDB blir litt uhåndterlig. Men vi kan bruke sett så gjør det magiske for oss. La oss først undersøke instruksjonsbytesene: 0xe8 er en anropsinstruksjon, og vi vet nå at det er 5 bytes lang. Så lar vi dette ut. (x10b PC betyr undersøke 10 byte ved programteller - standardformat er hex allerede). Så vi gjør det mens vi stoppet ved 0x40911f: og bekreft den patched plasseringen: Excellent. Vi kan nå utføre det. Alternativer til den oppgitte metoden alternativ for patching: sett 0x40911f 0x90909090 etterfulgt av sett 0x409123 0x90 Manipuler programtelleren (instruksjonspekeren) i stedet: sett pc5 eller det mer eksplisitte settet pcpc5 jump pc5 Bedre måter å manipulerepatch det løpende programmet Det er alternativt (og måte overlegen) metoder som denne av Tavis Ormandy. Jeg reproduserer makroen nedenfor (i tilfelle det går frakoblet fra det andre stedet): Igjen ble det ikke skrevet skriftlig av meg, men av Tavis Ormandy - se linken over. Dette avslutter dette lille QampA.8.4-utdataformatet. Som standard skriver GDB en verdi ut i henhold til datatypen. Noen ganger er dette ikke det du vil ha. For eksempel kan du skrive ut et tall i heks eller en peker i desimal. Eller du vil kanskje se data i minnet ved en bestemt adresse som en tegnstreng eller som en instruksjon. For å gjøre disse tingene, angi et utdataformat når du skriver ut en verdi. Den enkleste bruken av utdataformater er å si hvordan man skriver ut en verdi som allerede er beregnet. Dette gjøres ved å starte argumentene for utskriftskommandoen med en skråstrek og et formatbrev. Formatene som støttes, er: x Sett på biter av verdien som et heltall, og skriv ut heltallet i heksadesimale. d Skriv ut som heltall i signert desimal. u Skriv ut som heltall i usignert desimal. o Skriv ut som heltall i oktal. t Skriv ut som heltall i binær. Bokstaven t står for to. (2) en Skriv ut som en adresse, både absolutt i heksadesimale og som en forskyvning fra det nærmeste forrige symbolet. Du kan bruke dette formatet som brukes til å finne ut hvor (i hvilken funksjon) en ukjent adresse er plassert: Kommandoinformasjonssymbolet 0x54320 gir lignende resultater. Se avsnittet informasjonssymbol. c Betrakt som et heltall og skriv det som en tegnkonstant. f Vær oppmerksom på biter av verdien som et flytende punktnummer og skriv ut ved hjelp av typisk flytende punktsyntax. For eksempel, for å skrive ut programtelleren i hex (se avsnitt 8.10 Register), skriv Merk at ingen plass er nødvendig før skråstrek dette skyldes at kommandonavn i GDB ikke kan inneholde et skråstrek. For å skrive ut den siste verdien i verdierloggen med et annet format, kan du bruke utskriftskommandoen med bare et format og ikke noe uttrykk. Eksempelvis skriver px den siste verdien i hex. GNU GDB Debugger Command Cheat Sheet Kompilere med - g-alternativet (for de fleste GNU - og Intel-kompilatorer) som genererer tilleggsinformasjon i objektkoden slik at debuggeren kan matche en linje med kildekoden med trinnet med utførelse. Ikke bruk kompilatoroptimaliseringsdirektivet som - O eller - O2 som omarrangerer databehandlingsoperasjoner for å få fart fordi denne omregningen ikke stemmer overens med rekkefølgen av utførelse i kildekoden, og det kan være umulig å følge. controlc: Stopp kjøring. Det kan stoppe programmet hvor som helst, i din kilde eller et C-bibliotek eller hvor som helst. For å utføre en shell kommando: kommando eller shell kommando GDB kommando fullføring: Bruk TAB nøkkel info bry TAB vil fullføre kommandoen som resulterer i informasjon breakpoints Trykk TAB to ganger for å se alle tilgjengelige alternativer hvis mer enn ett alternativ er tilgjengelig eller skriv M-RETURN. GDB kommando abreviation: info bre RETURN vil fungere som bre er en gyldig abreviation for breakpoints De-Referencing STL Container: Viser STL container klasser ved hjelp av GDB p variabelnavn resulterer i en kryptisk visning av maldefinisjoner og pekere. Bruk følgende. gdbinit-fil (V1.03 091508). Nå jobber med GDB 4.3. (Arkiverte versjoner: V1.01 GDB 6.4 bare) Takk til Dr. Eng. Dan C. Marinescu for tillatelse til å legge inn dette skriptet. Bruk følgende kommandoer som følger med skriptet:

Comments

Popular posts from this blog

Forex Trade Indonesia

Is Binære Options Trading Gambling Anonym