Exploit Stack Based Buffer overflow (x64) durante il controllo del registro rbx

1

Posso controllare questi registri:

(gdb) i r
rax            0x1  1
rbx            0x4141414141414141   4702111234474983745
rcx            0x7ffff760cf90   140737343704976
rdx            0x49526df7d355ee04   5283406224028986884
rsi            0x1  1
rdi            0x7fffffffce00   140737488342528
rbp            0x49526df7d355ee04   0x49526df7d355ee04
rsp            0x49526df7d355ee04   0x49526df7d355ee04
r8             0x49526df7d355ee04   5283406224028986884
r9             0x49526df7d355ee04   5283406224028986884
r10            0x8  8
r11            0x246    582
r12            0x4141414141414141   4702111234474983745
r13            0x4141414141414141   4702111234474983745
r14            0x4141414141414141   4702111234474983745
r15            0x4141414141414141   4702111234474983745
rip            0x7ffff760cbbe   0x7ffff760cbbe <__longjmp+78>
eflags         0x10202  [ IF RF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
fs             0x0  0

Posso controllare in qualche modo il rip pensato? In particolare quando controllo rbx?

Tutti gli esempi che ho trovato sono stati dove rbp è stato controllato e come farlo è chiaro per me. Descritto ad esempio qui

Aggiornamento 1:

Forse questo aiuta, ho disassemblato la funzione che viene chiamata dopo aver modificato i registri:

(gdb) disass png_error
Dump of assembler code for function png_error:
=> 0x00007ffff7bcf280 <+0>: push   %r12
   0x00007ffff7bcf282 <+2>: push   %rbp
   0x00007ffff7bcf283 <+3>: mov    %rsi,%rbp
   0x00007ffff7bcf286 <+6>: push   %rbx
   0x00007ffff7bcf287 <+7>: mov    %rdi,%rbx
   0x00007ffff7bcf28a <+10>:    sub    $0x30,%rsp
   0x00007ffff7bcf28e <+14>:    mov    %fs:0x28,%rax
   0x00007ffff7bcf297 <+23>:    mov    %rax,0x28(%rsp)
   0x00007ffff7bcf29c <+28>:    xor    %eax,%eax
   0x00007ffff7bcf29e <+30>:    test   %rdi,%rdi
   0x00007ffff7bcf2a1 <+33>:    je     0x7ffff7bcf2c6 <png_error+70>
   0x00007ffff7bcf2a3 <+35>:    mov    0x120(%rdi),%rcx
   0x00007ffff7bcf2aa <+42>:    test   $0xc0000,%ecx
   0x00007ffff7bcf2b0 <+48>:    jne    0x7ffff7bcf318 <png_error+152>
   0x00007ffff7bcf2b2 <+50>:    mov    0xc8(%rbx),%rax
   0x00007ffff7bcf2b9 <+57>:    test   %rax,%rax
   0x00007ffff7bcf2bc <+60>:    je     0x7ffff7bcf2c6 <png_error+70>
   0x00007ffff7bcf2be <+62>:    mov    %rbp,%rsi
   0x00007ffff7bcf2c1 <+65>:    mov    %rbx,%rdi
   0x00007ffff7bcf2c4 <+68>:    callq  *%rax

Qualche idea su come controllare rip?

    
posta android_dev 01.03.2016 - 19:56
fonte

1 risposta

2

Quello che puoi fare quando controlli un registro dipende da cosa il codice attaccato fa con quel registro. Quindi è difficile fare una risposta generica.

Nel ABI x86-64 , il registro %rbx è uno dei registri che il il callee deve conservare, quindi se una funzione usa %rbx , deve prima salvarlo e ripristinarlo all'uscita. Una conseguenza è che la maggior parte delle funzioni non utilizzerà %rbx se possono evitarlo. Nell'ABI a 32 bit, il registro %ebx viene in genere utilizzato per salvare l'indirizzo del GOT (la tabella di base utilizzata per eseguire il collegamento dinamico), pertanto la modifica di %ebx potrebbe consentire di manipolare le chiamate di funzione successive; ma nell'ABI a 64 bit, il codice PIC utilizza in genere Indirizzamento relativo RIP , che non utilizza %rbx .

Per vedere cosa puoi fare con %rbx in una situazione specifica, devi davvero smontare il codice attaccato e vedere come usa quel registro (o meno) nelle istruzioni dopo la tua modifica.

    
risposta data 01.03.2016 - 20:25
fonte

Leggi altre domande sui tag