Запустите 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
.