Почему rax изменяется во время остановки при входе для `syscall`? - PullRequest
0 голосов
/ 20 февраля 2020

Запустите gdb -q /bin/ls, а затем $ catch syscall (не один шаг), первый системный вызов будет brk, который имеет sysno 12. Однако, когда я посмотрел на значение rax, это 0xffffffffffffffda. Почему это так?

См. Три "снимка" ниже для деталей. Первый из них используется для остановки при входе для системного вызова (см. Ptrace (2)), второй - для остановки при выходе.

Вот снимок во время остановки при входе.

[----------------------------------registers-----------------------------------]
RAX: 0xffffffffffffffda
RBX: 0x1
RCX: 0x7ffff7df0ec9 (<__brk+9>: cmp    rax,0xfffffffffffff000)
RDX: 0x4d ('M')
RSI: 0x43 ('C')
RDI: 0x0
RBP: 0x555555554040 --> 0x500000006
RSP: 0x7fffffffddd8 --> 0x7ffff7defc71 (<_dl_sysdep_start+913>: xor    eax,eax)
RIP: 0x7ffff7df0ec9 (<__brk+9>: cmp    rax,0xfffffffffffff000)
R8 : 0x16
R9 : 0x7ffff7df6665 ("MALLOC_CHECK_")
R10: 0x0
R11: 0x246
R12: 0x9 ('\t')
R13: 0x7ffff7dd7660 (<dl_main>: push   rbp)
R14: 0x1
R15: 0x1000
EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x7ffff7df0ec0 <__brk>:      mov    ecx,0xc
   0x7ffff7df0ec5 <__brk+5>:    mov    eax,ecx
   0x7ffff7df0ec7 <__brk+7>:    syscall 
=> 0x7ffff7df0ec9 <__brk+9>:    cmp    rax,0xfffffffffffff000
   0x7ffff7df0ecf <__brk+15>:   mov    rdx,rax
   0x7ffff7df0ed2 <__brk+18>:   ja     0x7ffff7df0ee8 <__brk+40>
   0x7ffff7df0ed4 <__brk+20>:   mov    QWORD PTR [rip+0x20d215],rax        # 0x7ffff7ffe0f0 <__curbrk>
   0x7ffff7df0edb <__brk+27>:   xor    eax,eax
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffddd8 --> 0x7ffff7defc71 (<_dl_sysdep_start+913>:        xor    eax,eax)
0008| 0x7fffffffdde0 --> 0x100037f00000000
0016| 0x7fffffffdde8 --> 0x0
0024| 0x7fffffffddf0 --> 0xf8bfbff
0032| 0x7fffffffddf8 --> 0x7ffff7ffb000 (jg     0x7ffff7ffb047)
0040| 0x7fffffffde00 --> 0x7fffffffe249 --> 0x2ddd6da558be58c2
0048| 0x7fffffffde08 --> 0x101010100000064
0056| 0x7fffffffde10 --> 0x0
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value

Catchpoint 1 (call to syscall brk), 0x00007ffff7df0ec9 in __brk (addr=addr@entry=0x0) at ../sysdeps/unix/sysv/linux/x86_64/brk.c:31
31      ../sysdeps/unix/sysv/linux/x86_64/brk.c: No such file or directory.
gdb-peda$ 

Вот один из них во время остановки при выходе.

[----------------------------------registers-----------------------------------]
RAX: 0x555555776000 ('')
RBX: 0x1 
RCX: 0x7ffff7df0ec9 (<__brk+9>: cmp    rax,0xfffffffffffff000)
RDX: 0x4d ('M')
RSI: 0x43 ('C')
RDI: 0x0 
RBP: 0x555555554040 --> 0x500000006 
RSP: 0x7fffffffddd8 --> 0x7ffff7defc71 (<_dl_sysdep_start+913>: xor    eax,eax)
RIP: 0x7ffff7df0ec9 (<__brk+9>: cmp    rax,0xfffffffffffff000)
R8 : 0x16 
R9 : 0x7ffff7df6665 ("MALLOC_CHECK_")
R10: 0x0 
R11: 0x246 
R12: 0x9 ('\t')
R13: 0x7ffff7dd7660 (<dl_main>: push   rbp)
R14: 0x1 
R15: 0x1000
EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x7ffff7df0ec0 <__brk>:      mov    ecx,0xc
   0x7ffff7df0ec5 <__brk+5>:    mov    eax,ecx
   0x7ffff7df0ec7 <__brk+7>:    syscall 
=> 0x7ffff7df0ec9 <__brk+9>:    cmp    rax,0xfffffffffffff000
   0x7ffff7df0ecf <__brk+15>:   mov    rdx,rax
   0x7ffff7df0ed2 <__brk+18>:   ja     0x7ffff7df0ee8 <__brk+40>
   0x7ffff7df0ed4 <__brk+20>:   mov    QWORD PTR [rip+0x20d215],rax        # 0x7ffff7ffe0f0 <__curbrk>
   0x7ffff7df0edb <__brk+27>:   xor    eax,eax
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffddd8 --> 0x7ffff7defc71 (<_dl_sysdep_start+913>:        xor    eax,eax)
0008| 0x7fffffffdde0 --> 0x100037f00000000 
0016| 0x7fffffffdde8 --> 0x0 
0024| 0x7fffffffddf0 --> 0xf8bfbff 
0032| 0x7fffffffddf8 --> 0x7ffff7ffb000 (jg     0x7ffff7ffb047)
0040| 0x7fffffffde00 --> 0x7fffffffe249 --> 0xbb35628be0b22313 
0048| 0x7fffffffde08 --> 0x101010100000064 
0056| 0x7fffffffde10 --> 0x0 
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value

Catchpoint 1 (returned from syscall brk), 0x00007ffff7df0ec9 in __brk (addr=addr@entry=0x0) at ../sysdeps/unix/sysv/linux/x86_64/brk.c:31
31      in ../sysdeps/unix/sysv/linux/x86_64/brk.c
gdb-peda$ 

Итак, brk возвращает 0x555555776000, что является текущим прерыванием программы (поскольку RDI было 0x0, что заставит brk вернуть текущий разрыв программы). И если я перестаю использовать точку останова в инструкции syscall вместо точки перехвата, я получаю следующий снимок, который показывает, что для системного вызова RAX было 12.

[----------------------------------registers-----------------------------------]
RAX: 0xc ('\x0c')
RBX: 0x1 
RCX: 0xc ('\x0c')
RDX: 0x4d ('M')
RSI: 0x43 ('C')
RDI: 0x0 
RBP: 0x555555554040 --> 0x500000006 
RSP: 0x7fffffffddd8 --> 0x7ffff7defc71 (<_dl_sysdep_start+913>: xor    eax,eax)
RIP: 0x7ffff7df0ec7 (<__brk+7>: syscall)
R8 : 0x16 
R9 : 0x7ffff7df6665 ("MALLOC_CHECK_")
R10: 0x0 
R11: 0x0 
R12: 0x9 ('\t')
R13: 0x7ffff7dd7660 (<dl_main>: push   rbp)
R14: 0x1 
R15: 0x1000
EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x7ffff7df0eba:      nop    WORD PTR [rax+rax*1+0x0]
   0x7ffff7df0ec0 <__brk>:      mov    ecx,0xc
   0x7ffff7df0ec5 <__brk+5>:    mov    eax,ecx
=> 0x7ffff7df0ec7 <__brk+7>:    syscall 
   0x7ffff7df0ec9 <__brk+9>:    cmp    rax,0xfffffffffffff000
   0x7ffff7df0ecf <__brk+15>:   mov    rdx,rax
   0x7ffff7df0ed2 <__brk+18>:   ja     0x7ffff7df0ee8 <__brk+40>
   0x7ffff7df0ed4 <__brk+20>:   mov    QWORD PTR [rip+0x20d215],rax        # 0x7ffff7ffe0f0 <__curbrk>
No argument
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffddd8 --> 0x7ffff7defc71 (<_dl_sysdep_start+913>:        xor    eax,eax)
0008| 0x7fffffffdde0 --> 0x100037f00000000 
0016| 0x7fffffffdde8 --> 0x0 
0024| 0x7fffffffddf0 --> 0xf8bfbff 
0032| 0x7fffffffddf8 --> 0x7ffff7ffb000 (jg     0x7ffff7ffb047)
0040| 0x7fffffffde00 --> 0x7fffffffe249 --> 0xb0d23aa8f5c20e1 
0048| 0x7fffffffde08 --> 0x101010100000064 
0056| 0x7fffffffde10 --> 0x0 
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value

Breakpoint 1, 0x00007ffff7df0ec7 in __brk (addr=addr@entry=0x0) at ../sysdeps/unix/sysv/linux/x86_64/brk.c:31
31      ../sysdeps/unix/sysv/linux/x86_64/brk.c: No such file or directory.
gdb-peda$ 

В одном предложении RAX пошел 0xc -> 0xffffffffffffffda -> 0x555555776000.

...