Почему si_addr не соответствует информации основного стека?Linux

Ответить
Anonymous
 Почему si_addr не соответствует информации основного стека?

Сообщение Anonymous »


│0x55976d2c3fba(*,int*)+186> mov %eax,%r15d │ │0x55976d2c3fbd(*,int*)+189>jmp 0x55976d2c403b │ │0x55976d2c3fbf(*,int*)+191>ноп │ >│0x55976d2c3fc0(*,int*)+192> mov 0x18(%rbx),%rsi │ │0x55976d2c3fc4(*,int*)+196> movslq %edx,%rcx │ │0x55976d2c3fc7(*,int*)+199>testb$0x1,(%rsi,%rcx,1) │ │0x55976d2c3fcb(*,int*)+203>jne 0x55976d2c40d8 │ │0x55976d2c3fd1(*,int*)+209> mov -0x40(%r12),%rdi │ │0x55976d2c3fd6(*,int*)+214> mov -0x48(%r12),%rax │ │0x55976d2c3fdb(*,int*)+219> добавить %rbp,%rdi │ │0x55976d2c3fde(*,int*)+222> проверка $0x1,%al │ │0x55976d2c3fe0(*,int*)+224> то же 0x55976d2c3fea │ │0x55976d2c3fe2(*,int*)+226>mov(%rdi),%rcx │ │0x55976d2c3fe5(*,int*)+229> mov -0x1(%rcx,%rax,1),%rax │ │0x55976d2c3fea(*,int*)+234> mov %rbx,%rsi │ │0x55976d2c3fed(*, int*)+237> callq *%rax │ │0x55976d2c3fef(*,int*)+239> mov -0x30(%r12),%rdi │ │0x55976d2c3ff4(*,int*)+244> mov -0x38(%r12),%r8 │ │0x55976d2c3ff9(*,int*)+249> добавить %rbp,%rdi │ │0x55976d2c3ffc(*,int*)+252> проверка $0x1,%r8b │ │0x55976d2c4000 (*, int*)+256> то же 0x55976d2c400a │ │0x55976d2c4002 (*, int*)+258> mov(%rd),%rdx │ │0x55976d2c4005 (*, int*)+261> mov -0x1(%rdx,%r8,1),%r8 │ │0x55976d2c400a(*,int*)+266> mov -0x8(%r13),%rdx │ │0x55976d2c400e(*,int*)+270> mov 0x10(%rsp),%rsi │ │0x55976d2c4013 (*, int*)+275> movswl 0x4c(%rdx),%ecx │ │0x55976d2c4017 (*, int*)+279> mov %rax, %rdx │ │0x55976d2c401a (*, int*)+282> callq *%r8 │ │0x55976d2c401d(*,int*)+285> mov 0x28(%rsp),%r8 │ │0x55976d2c4022 (*, int*)+290> mov 0x20(%rsp),%rcx │ │0x55976d2c4027 (*, int*)+295> mov %r12,%rdi │ │0x55976d2c402a(*,int*)+298>mov %rax,%rdx │ │0x55976d2c402d(*,int*)+301> mov 0x18(%rsp),%rsi │ │0x55976d2c4032(*,int*)+306> вызовq *-0x10(%r12) │ │0x55976d2c4037 (*, int*)+311> добавить $0x1,%r14d │ │0x55976d2c403b (*, int*)+315> mov 0x8(%rsp),%eax │ │0x55976d2c403f (*, int*)+319> lea (%rax,%r14,1),%edx │ │0x55976d2c4043 (*, int*)+323> lea (%r15,%r14,1),%eax │ │0x55976d2c4047 (*, int*)+327> cmp 0xc(%rsp),%r14d │ │0x55976d2c404c (*, int*)+332> jl 0x55976d2c3fc0 1.распечатать содержимое реестра

(gdb) p скалярный вектор->m_flag $11 = (uint8 *) 0x7fd85d288de8 "" (gdb) п $rbx 12 долларов = 140567393037752 (gdb) п/х $rbx $13 = 0x7fd865876db8 (gdb) п/х $rbx+0x18 $14 = 0x7fd865876dd0 (гдб) x/1xg $14 0x7fd865876dd0: 0x00007fd85d288de8 (gdb) п $edx 15 долларов США = 333 (gdb) x/1db 0x00007fd85d288de8+333 0x7fd85d288f35: 0 все в порядке

2.затем распечатайте содержимое регистра перед $pc Анализируя ассемблерный код, он может прыгать только с 332 строк.

(gdb) p $r14d 16 долларов = 333 (gdb) p $rsp+0xc $17 = (недействительно *) 0x7f96c608c76c (гдб) x/1dw $17 0x7f96c608c76c: 1000 все в порядке

3.распечатать подпись

(gdb) p $_siginfo $18 = {si_signo = 11, si_errno = 0, si_code = 1, _sifields = {_pad = {-1141209149, 21911, 0, 0, -2051670568, -28108, -1140223671, -1, 0 }, _kill = {si_pid = -1141209149, si_uid = 21911}, _timer = { si_tid = -1141209149, si_overrun = 21911, si_sigval = {sival_int = 0, sival_ptr = 0x0}}, _rt = {si_pid = -1141209149, si_uid = 21911, si_sigval = {sival_int = 0, sival_ptr = 0x0}}, _sigchld = { si_pid = -1141209149, si_uid = 21911, si_status = 0, si_utime = -8811857991725744128, si_stime = -4897223372775124428}, _sigfault = {si_addr = 0x5597bbfa87c3}, _sig poll = {si_band = 94110182180803, si_fd = 0}}} si_addr — 0x5597bbfa87c3, но этот адрес не найден в текущем стеке

4.проверьте распределение памяти

0x00000000->0x000000d8 по адресу 0x0039bda4: .reg/44700 HAS_CONTENTS 0x00000000->0x00000200 по адресу 0x0039be98: .reg2/44700 HAS_CONTENTS 0x00000000->0x00000a88 по адресу 0x0039c0ac: .reg-xstate/44700 HAS_CONTENTS 0x55976c9e8000->0x55976d13b000 по адресу 0x0039d000: load1 ALLOC LOAD READONLY HAS_CONTENTS 0x55976d13b000->0x55976f729000 по адресу 0x00af0000: load2 ALLOC ЗАГРУЗИТЬ ТОЛЬКО ДЛЯ ЧТЕНИЯ КОД HAS_CONTENTS 0x55976f729000->0x559771fd0000 по адресу 0x030de000: load3 ALLOC LOAD READONLY HAS_CONTENTS 0x559771fd0000->0x559772150000 по адресу 0x05985000: load4 ALLOC LOAD READONLY HAS_CONTENTS 0x559772150000->0x559772355000 по адресу 0x05b05000: load5 ALLOC LOAD HAS_CONTENTS 0x559772355000->0x559772537000 по адресу 0x05d0a000: load6 ALLOC LOAD HAS_CONTENTS 0x7e82de96e000->0x7e83be96e000 по адресу 0x05eec000: load7 ALLOC LOAD HAS_CONTENTS 0x7e83c3973000->0x7e8483973000 по адресу 0xe5eec000: load8 ALLOC LOAD HAS_CONTENTS 0x7e8ebb57a000->0x7e9dfb57a000 по адресу 0x1a5eec000: load9 ALLOC LOAD HAS_CONTENTS 0x7e9dfb57a000->0x7e9dfb57b000 по адресу 0x10e5eec000: load10 ALLOC LOAD READONLY HAS_CONTENTS 0x7e9dfc4d7000->0x7e9dfc57b000 по адресу 0x10e5eed000: load11a ALLOC LOAD HAS_CONTENTS 0x7e9dfc57b000->0x7e9dfc57b000 по адресу 0x10e5f91000: load11b ALLOC 0x7e9e29698000->0x7eac39698000 по адресу 0x10e5f91000: load12 ALLOC LOAD HAS_CONTENTS 0x7eac3e5db000->0x7eac3e5dc000 по адресу 0x1ef5f91000: load13 ALLOC LOAD READONLY HAS_CONTENTS 0x7eac3f538000->0x7eac3f5dc000 по адресу 0x1ef5f92000: load14a ALLOC LOAD HAS_CONTENTS 0x7eac3f5dc000->0x7eac3f5dc000 по адресу 0x1ef6036000: load14b ALLOC 0x7eac3f5dc000->0x7eac3f5dd000 по адресу 0x1ef6036000: load15 ALLOC LOAD READONLY HAS_CONTENTS si_addr не найден в сопоставленном адресе

5.syslog

xxx[58651]: ошибка segfault по адресу 5597bbfa87c3 ip 000055976d2c3fc0 sp 00007f96c608c760, ошибка 14 в xxx[55976d13b000+25ee000] Информация системного журнала совпадает с информацией ядра

(gdb) поток [Текущая тема — 1 (Тема 0x7f96c612f700 (LWP 58651))] почему si_addr не соответствует информации основного стека и есть ли способ дополнительно проанализировать этот основной файл?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»