Tuesday 7 November 2017

Gdb print format binära alternativ


Jag har GDB men binären Jag vill ha omvänd ingenjör dynamiskt har inga symboler, det vill säga när jag kör filverktyget som visar mig strippat: Vilka alternativ har jag om miljön där detta körs tillåter inte att en extern IDA Pro-instans kan ansluta till gdbserver. Kort sagt: miljön du har är begränsad i vad det gör att du kan göra, men du har pålitlig gammal gdb och en binär till omvänd ingenjör. frågade apr 27 13 kl 3:13 Konventioner som används plus preliminära anmärkningar Jag trimmar GDB: s produktion för korthet eftersom det vanligtvis visar upphovsrätten och annan information i början av någonsin session. När jag reproducerar utgången Ill startar vid den första (gdb) snabblinjen, eller i fall eller automatiskt exekverade kommandon från den första äkta utgångslinjen. För att skilja kommandon som är inmatade vid GDB-prompten, kommer dessa att ha en ledande (gdb) precis som i den verkliga världen. För Shell-kommandot kommer detta inte att vara något prefix alls eller som det verkar vara konventionen på de flesta unixoid-system. När jag använder ett visst kommando, som vim som min redaktör, är du fri att själv använda din egen favoritredaktör. Var det emacs eller nano. Jag kommer inte att döma dig) Komma igång Det här avsnittet handlar om att konfigurera din gdb-miljö och starta processen. Jag inkluderar också några präster för de fullständiga nykomlingarna. Tricks du borde veta GDB har en bra prompten där din markör stoppar efter att programmet bryts eller när du går eller något sådant. Om du trycker på RETURN (aka ENTER) när du körde ett GDB-kommando körs samma kommando igen. Det här är användbart när du går igenom kod med steg eller nästa och vill helt enkelt fortsätta en efter en. Kommandon kan förkortas så länge de är entydiga. För vissa ofta använda kommandon existerar en viss stenografi som förekommer trots tvetydigheten: b för paus (trots bt och backtrace) c eller forts för fortsättning (trots fångst, samtal osv) n för nästa (trots ni och nästa) Du kan ringa faktiska biblioteksfunktioner eller till och med funktioner från det avfelade programmet med kommandot samtalet. Det betyder att du kan prova beteende eller tvingande beteende. Du kan starta GDB med gdbtui eller gdb - tui för att få ett - förmodligen mer bekvämt - mer visuellt textgränssnitt. Den visar källkoden längst upp och (gdb) prompt nedan. Du kan också växla till den här layouten genom att utföra kommandonlayout src vid (gdb) - prompten. GDB har en kommandoradsfärdigningsfunktion som många sköldar, så använd Tab till din fördel och se till att du använder hjälp eller hjälper keywordcommand när du behöver hjälp. skalet tillåter dig att utföra kommandon i skalet, så att du kan köra kommandon från din GDB-session. Under utveckling skulle ett exempel vara skalslag. skriva ut. undersöka och visa känna olika format (FMT) som du kan använda för att göra utmatningen mer läsbar. När du debuggar på källnivå kan du använda C-typen för att visa värden. Föreställ dig en C-sträng bakom en tomgång (vilken GDB vet tack vare symbolerna i sådant fall). Kasta enkelt till (char) och skriv ut det: print (char) variabel. Att få processen att köra Eftersom vi vill dynamiskt analysera binäret måste vi starta det först. Kommandorad Vi kan göra det direkt från kommandoraden genom att inte bara leda till binären utan även de argument vi vill starta med. Hela processen ser så här ut: Enkelt nog. Från (gdb) - prompten kan du sedan utfärda körkommandot (stenografi r) för att köra. exe med parametrarna som anges på kommandoraden. Jag föredrar denna metod, men din körsträcka kan variera. GDB prompt Avbryt upp GDB och vid (gdb) - prompten använd filkommandot för att ladda binäret och använd sedan körkommandot för att starta det med de argument som du vill skicka: ett alternativ till ovanstående skulle vara användningen av set args som det här: Du kan också se vilket argument som körs skulle överföras till startprocessen genom att utfärda en: btw: Om du undrade om miljövariabler, använd GDBs inbyggda hjälpkommando som hjälp och visa. Pekare: Ange miljö VARNAMEVALUE och visa miljö VARNAME och avstängt miljö VARNAME. Phew, men varför slutar programmet med en SIGSEGV (segmentfel) Jo, vi vet inte än, men det ser ut som att den här lilla beaste vill ha rätt behandling. Eftersom vi övar defensiv databehandling vill vi inte köra allt vi inte vet mycket om, rätt så vi kan börja om. Om det skulle ha varit skadligt program måste vi spola maskinen och installera om eller återställa en stillbild om den är en VM-gäst. Först vill du springa info kommandot på följande sätt: Det finns två viktiga uppgifter, det mest relevanta för oss att vara linjen som anger: okej, så vi kan sätta en brytpunkt på den där och sedan köra processen med argumenten vi fint..gdbinit för vinst Men vänta, det här börjar bli tråkigt redan. Ingen enkel metod för att automatisera dessa steg på något sätt Som faktum finns det. En fil med namnet. gdbinit kan användas för att utfärda kommandon till GDB vid start. Du kan också skicka en fil med GDB-kommandon med - x-argumentet på kommandoraden (shell). Om jag har ett antal projekt, brukar de i undermappar med en. gdbinit-fil vardera. Sidnotering: - nx förhindrar att. gdbinit-innehållet körs vid start. Så vi vet vilka argument vi vill passera och vi känner till adressen till brytpunkten, det här översätter till följande. gdbinit-fil: Den utmatning jag får när jag börjar gdb utan några andra argument är: Nice Men det här ser annorlunda ut. Assembly och GDB Så du brukade se nästa rad du ska utföra och sedan din pålitliga gamla (gdb) prompt. Men ingen sådan sak. Vi har ingen källa för detta binära och dessutom symboler. Doh Så vi överväger den blinkande caret vid (gdb) prompt och undrar vad du ska göra. Var inte rädd, GDB kan också hantera monteringsnummer. Endast problem, det är enligt min uppfattning en obekvämt ATampT-sammansättningssyntax. Jag föredrar Intel-smaken och följande kommando berättar GDB att göra just det: Showings assembly code Och hur kommer det att visa oss monteringsnumret Tja, liknande TUI-läget (kontrollera tagg wiki för gdb) med hjälp av följande kommando: och om du är så benägen, också: som också visar dig innehållet i registren i en översikt. Låt oss springa igen Så vi slutar med följande. gdbinit för våra syften: Och när vi börjar gdb utan argument slutar vi med det här: Sweet. Så vi kan se demonteringen medan vi går igenom koden. Vi kan avsluta detta här, men det är naturligtvis fler knep att lära sig, varför varför inte gå lite längre. OBS: registren med whitegray-bakgrunden visar att ett värde har ändrats. Inte för meningsfull när vi just startade programmet, men mycket användbart när vi steg igenom koden senare. btw, om du föredrar att spara skärmfältet och få det mindre visuellt, börjar med GDB 7.0 du kan använda: på GDB-versioner innan du kan emulera beteendet genom inställningar en automatisk visning: eller kortare dispi-pc där jag är formatet, du kan komma ihåg det bäst genom att tänka på instruktion och pc som instruktionspekare, även känd som programräknare - alltså pc. Också bra att veta Ibland när man går igenom montering kommer regs och asm visningar att bli borked. Utför bara de respektive layoutkommandon igen för att återställa dem till sin gamla ära: Felsökning på monteringsnivå Visas när du är i monteringsläge kommer några av de kommandon du brukar använda från källkodsfelsökning helt enkelt inte att fungera. Det är vettigt, för en enda källlinje betyder vanligtvis ett dussin instruktioner eller mer. Nästa och stegkommandon har emellertid instruktionsnivå motsvarigheter: nexti (shorthand ni. Någon annan som tänker på busk) stepi (shorthand si) Från vår demontering ovan vet vi: och för alla praktiska ändamål är detta huvudfunktionen. Självklart skulle du vara försiktig om du skulle vända mot malware, men i det här fallet är det. Så kan vi lägga till en brytpunkt till den här adressen (0x40f961) istället för ingångspunkten: Om vi ​​undersöker (stenografi x) koden där vi är för tillfället kan vi se: Okej, samtalet är vad vi vill följa, så vi kan inuti den med hjälp av si. Vi får se ett annat samtal direkt vid instruktionspekaren när vi går in i funktionen: Samtalet leder oss till en funktion som kallar ptrace (PTRACETRACEME.). nu varför skulle det göra det Tja, det är ett gammalt anti-debugger-trick som Mellowcandle har beskrivit i en annan QampA här: Men hur går vi runt det Vi måste skriva över funktionen som kallar ptrace () med nop eller något med dessa linjer. Det är här GDB blir lite otrevlig. Men vi kan använda set så gör magiken för oss. Låt oss först inspektera instruktionsbyten: 0xe8 är en samtalsinstruktion och vi vet nu att det är 5 byte långa. Så låter vi det här. (x10b pc betyder att undersöka 10 byte vid programräknaren - standardformat är hex redan). Så vi gör det medan vi slutade vid 0x40911f: och verifiera den patched platsen: Excellent. Vi kan nu utföra det. Alternativ till den angivna metoden alternativ för patching: set 0x40911f 0x90909090 följt av set 0x409123 0x90 Manipulera programräknaren (instruktionspekaren) istället: sätt pc5 eller den mer explicit uppsättningen pcpc5 hoppa pc5 Bättre sätt att manipulerapatch det pågående programmet Det finns alternativ (och sätt överlägsen) metoder som den här av Tavis Ormandy. Jag reproducerar makten nedanför (om det går offline från andra stället): Återigen var det ovanstående manuskriptet inte skrivet av mig, men av Tavis Ormandy - se länken ovan. Detta avslutar detta lilla QampA.8.4-utgångsformat Som standard skrivar GDB ett värde enligt datatypen. Ibland är det inte vad du vill ha. Du kan till exempel skriva ut ett tal i hex eller en pekare i decimal. Eller du kanske vill visa data i minnet vid en viss adress som en teckensträng eller som en instruktion. För att göra dessa saker anger du ett utdataformat när du skriver ut ett värde. Den enklaste användningen av utdataformat är att säga hur man skriver ut ett redan beräknat värde. Detta görs genom att starta argumenten för utskriftskommandot med ett snedstreck och ett formatbrev. Stödformatbokstäverna är: x Betrakta bitarna i värdet som ett heltal och skriv heltalet i hexadecimalt. d Skriv ut som heltal i undertecknat decimal. u Skriv ut som heltal i unsigned decimal. o Skriv ut som heltal i oktal. t Skriv ut som heltal i binärt. Bokstaven t står för två. (2) a Skriv ut som en adress, både absolut i hexadecimal och som en förskjutning från närmaste föregående symbol. Du kan använda det här formatet för att upptäcka var (i vilken funktion) en okänd adress finns: Kommandosinfosymbolen 0x54320 ger liknande resultat. Se avsnittets informationssymbol. c Betrakta som ett heltal och skriv ut det som en teckenkonstant. f Betrakta bitarna av värdet som ett flytpunktsnummer och skriv ut med hjälp av typisk flytpunkts syntax. Till exempel, för att skriva ut programräknaren i hex (se avsnitt 8.10 Register), skriv Obs att inget mellanslag krävs innan snedstrecket detta beror på att kommandonamn i GDB inte kan innehålla ett snedstreck. För att skriva ut det sista värdet i värdeshistoriken med ett annat format kan du använda kommandot Skriv ut med bara ett format och inget uttryck. Exempelvis återger px det sista värdet i hex. GNU GDB Debugger Command Cheat Sheet Kompilera med - g-alternativet (för de flesta GNU - och Intel-kompilatorer) som genererar extra information i objektkoden så att debugger kan matcha en rad källkod med steget med körning. Använd inte kompilatoroptimeringsdirektivet som - O eller - O2 som omarrangerar datoperationerna för att få fart eftersom den här ombokningen inte matchar utförandeplanen i källkoden och det kan vara omöjligt att följa. controlc: Sluta körningen. Det kan stoppa programmet var som helst, i din källa eller ett C-bibliotek eller någonstans. För att utföra ett kommandokontroll: Kommandot eller kommandot kommandot GDB-kommando slutfört: Använd TAB-tangentinfo-brytningen TAB ska slutföra kommandot som resulterar i informationsbrytningspunkter Tryck på TAB två gånger för att se alla tillgängliga alternativ om mer än ett alternativ är tillgängligt eller skriv M-RETURN. GDB-kommandoförkortning: info bre RETURN fungerar som bre är en giltig avbrytning för brytpunkter De-referens STL-behållare: Visar STL-behållarklasser med hjälp av GDB p-variabelnamnet resulterar i en kryptisk visning av malldefinitioner och pekare. Använd följande. gdbinit-fil (V1.03 091508). Nu arbetar med GDB 4.3. (Arkiverade versioner: Endast V1.01 GDB 6.4) Tack vare Dr. Eng. Dan C. Marinescu för tillstånd att skicka detta skript. Använd följande kommandon som tillhandahålls av skriptet:

No comments:

Post a Comment