Fråga:
Ställ in en brytpunkt på GDB-ingångspunkt för strippade PIE-binärer utan att inaktivera ASLR
Zach Riggle
2015-04-19 01:04:56 UTC
view on stackexchange narkive permalink

Med tanke på en positionsoberoende, statiskt kopplad, strippad binär, verkar det inte finnas något sätt i GDB att ställa in en brytpunkt vid ingångspunkten utan att inaktivera ASLR.

  • break start och liknande funktioner fungerar inte, eftersom det inte finns någon symbolisk information
  • set stop-on-solib-events 1 fungerar inte som binär är inte dynamiskt länkad
  • break * 0xdeadbeef för ingångspunkten fungerar inte, eftersom ingångspunkten inte är löst tills binären startar
  • fångstbelastning fungerar inte, eftersom det inte laddar några bibliotek
  • start fungerar inte, eftersom main inte är definierat och inga bibliotek är laddad

Utan att lappa den binära, vilken mekanism kan jag använda för att bryta vid den första instruktionen som utförs?

Möjlig?

Sedan nu- borttaget svar på frågan sa att en PIE-statiskt länkad binär är omöjlig, ett trivialt exempel är länken själv.

Det är statiskt länkad.

  $ ldd /lib/x86_64-linux-gnu/ld-2.19.so statiskt länkad  

Den är körbar.

  $ strace /lib/x86_64-linux-gnu/ld-2.19.soexecve("/lib/x86_64-linux-gnu/ld-2.19.so ", [" / lib / x86_64-linux-gnu /ld-2.19.so "], [/ * 96 vars * /]) = 0brk (0) = 0x7ff787b3d000writev (2, [{" Användning: ld.so [OPTION] ... EXECUTA "..., 1373} ], 1Användning: ld.so [OPTION] ... EXECUTABLE-FIL [ARGS-FOR-PROGRAM ...]  

Det är positionsoberoende.

  $ readelf -h /lib/x86_64-linux-gnu/ld-2.19.so | grep DYN-typ: DYN (delad objektfil)  

Lösningar

Det ser ut som att detta kan göras med Python genom att använda några av de händelser som görs tillgängliga: http://asciinema.org/a/19078

Jag vill dock ha en native-GDB-lösning.

En framgångsrik lösning bryts vid _start i ld.so när den körs direkt utan att ASLR inaktiveras. Det borde se ut så här:

  sh $ strip -s /lib/x86_64-linux-gnu/ld-2.19.so -o ld.sosh $ gdb ./ld.so(gdb) $ set inaktivera-randomisering av (gdb) $ <your magiska kommandon> (gdb) $ x / i $ pc = > 0x7f9ba515d2d0: mov rdi, rsp (gdb) $ info proc mapprocess 10432Mappade adressutrymmen: Starta Addera Slut Addr Storlek Offset objfile 0x7f9ba5xc0x050000023 /ld-2.19.so 0x7f9ba537e000 0x7f9ba5380000 0x2000 0x22000 / lib / x86_64- linux-gnu / ld-2.19.so 0x7f9ba5380000 0x7f9ba5381000 0x1000 0x0 0x7fffc34c7000 0x7fffc38ca000 0x403000 0x0 [stapel] 0x7fffc398b000 0x7fffc398d000 0x2000 0x0 [vdso] 0xffffffffff600000 0xffffffffff601000 0x1000 0x0 [vsyscall]  
Försökte du ställa in en brytpunkt i avsnittet GOT? Till exempel på `_libc_start_main ()`.
"positionsoberoende, statiskt kopplad" - Det finns ingen GOT.
Min dåliga ... Jag läste för snabbt. Förlåt.
relaterat: https://stackoverflow.com/questions/10483544/stopping-at-the-first-machine-code-instruction-in-gdb
Tre svar:
Zach Riggle
2015-04-23 03:44:02 UTC
view on stackexchange narkive permalink

UPPDATERING: GDB 8.1 har ett starti -kommando, som nämnts nedan av / u / ruslan

Att ställa in en brytpunkt på en adress som inte har kartlagts innan du startar målprocessen gör detta, effektivt . Det är inte korrekt funktionalitet, utan snarare en bieffekt av misslyckandet med att ställa in brytpunkten.

  (gdb) break * 0Breakpoint 1 at 0x0 (gdb) rStartprogram: / home / user / ld .so Fel vid återställning av brytpunkt 1: Varning: Kan inte infoga brytpunkt 1. Kan inte komma åt minne vid adress 0x0 Varning: Kan inte infoga brytpunkt 1. Kan inte komma åt minne vid adress 0x0 (gdb) x / i $ pc = > 0x7faae3a25cd0: mov rdi, rsp  
Ruslan
2018-01-08 15:58:41 UTC
view on stackexchange narkive permalink

Från och med GDB 8.1 finns det ett speciellt kommando för detta: starti . Exempel på GDB-session:

  $ gdb / bin / trueReading symboler från /bin/true...( inga felsökningssymboler hittades) ... gjort. (Gdb) startiStartprogram: / bin / true program stopped.0xf7fdd800 i _start () från /lib/ld-linux.so.2(gdb) x / 5i $ pc = > 0xf7fdd800 <_start>: mov EAX, esp 0xf7fdd802 <_start + 2>: call 0xf7fe2160 <_dl_start> 0xf7fdd807 <_dl_start_user>: mov edi, eax 0xf7fdd809 <_dl_start_user + 2>: ring 0xf7fdd7f0 0xf7fdd80e <_dl_start_user + 7>: lägg till ebx, 0x1f7e6  
p0tr3c
2020-02-08 14:20:55 UTC
view on stackexchange narkive permalink

Du kan definiera gdb-funktionen som ska brytas vid första argumentet för libc_star_main. Den första si / ni är att ladda libc själv. Lägg det i din .gdbinit-fil.

  definiera bmain si ni b __libc_start_main c b * ($ rdi) cend  


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...