c - 在 OSX 上使用 GDB 检测堆栈损坏(在金丝雀值上设置观察点)

标签 c macos gdb memory-corruption stack-corruption

我的程序在 OSX Mountain Lion 上通过 __stack_chk_fail 在函数结束时中止。显然 __stack_chk_fail 在检测到 canary 值已更改时被调用。我想按照 here 中概述的类似程序进行操作检测堆栈损坏的位置。但是 OSX 上的汇编代码不同,所以我不知道在哪里设置了金丝雀值。

有人知道如何在 OSX 上解决这个问题吗?

我确实尝试了 valgrind (3.9.0),但它没有检测到任何错误。

该函数gdb给出的汇编代码为:

0x0000000100010900 :    push   %rbp
0x0000000100010901 :    mov    %rsp,%rbp
0x0000000100010904 :    sub    $0x100,%rsp
0x000000010001090b :    mov    $0x0,%esi
0x0000000100010910 :    lea    0x167c9(%rip),%rcx        # 0x1000270e0
0x0000000100010917 :    mov    $0xffffffffffffffff,%rdx
0x0000000100010921 :    mov    0x1b6f8(%rip),%rax        # 0x10002c020
0x0000000100010928 :    mov    (%rax),%rax
0x000000010001092b :    mov    %rax,-0x8(%rbp)
0x000000010001092f :    mov    %rdi,-0x20(%rbp)
0x0000000100010933 :    mov    (%rdi),%rdi
0x0000000100010936 :    mov    %rdx,-0x70(%rbp)
0x000000010001093a :    mov    %esi,-0x74(%rbp)
0x000000010001093d :    mov    %rcx,-0x80(%rbp)
0x0000000100010941 :    callq  0x100023a6c <dyld_stub_strlen>
0x0000000100010946 :    mov    -0x20(%rbp),%rcx
0x000000010001094a :    mov    0x8(%rcx),%rdi
0x000000010001094e :    mov    %rax,-0x88(%rbp)
0x0000000100010955 :    callq  0x100023a6c <dyld_stub_strlen>
0x000000010001095a :    mov    %rsp,%rcx
0x000000010001095d :    mov    %rcx,-0x28(%rbp)
0x0000000100010961 :    mov    -0x88(%rbp),%rcx
0x0000000100010968 :    lea    0x1b(%rcx,%rax,1),%rax
0x000000010001096d :    and    $0xfffffffffffffff0,%rax
0x0000000100010971 :    mov    %rsp,%rdx
0x0000000100010974 :    sub    %rax,%rdx
0x0000000100010977 :    mov    %rdx,%rsp
0x000000010001097a :    mov    -0x20(%rbp),%rax
0x000000010001097e :    mov    (%rax),%r8
0x0000000100010981 :    mov    -0x20(%rbp),%rax
0x0000000100010985 :    mov    0x8(%rax),%r9
0x0000000100010989 :    mov    %rdx,%rdi
0x000000010001098c :    mov    -0x74(%rbp),%esi
0x000000010001098f :    mov    -0x70(%rbp),%rax
0x0000000100010993 :    mov    %rdx,-0x90(%rbp)
0x000000010001099a :    mov    %rax,%rdx
0x000000010001099d :    mov    -0x80(%rbp),%rcx
0x00000001000109a1 :    mov    $0x0,%al
0x00000001000109a3 :    callq  0x100023892 <dyld_stub___sprintf_chk>
0x00000001000109a8 :    mov    $0x0,%esi
0x00000001000109ad :    mov    -0x90(%rbp),%rdi
0x00000001000109b4 :    mov    %eax,-0x94(%rbp)
0x00000001000109ba :    callq  0x1000238bc <dyld_stub_access>
0x00000001000109bf :    cmp    $0x0,%eax
0x00000001000109c4 :    je     0x1000109da 
0x00000001000109ca :    movb   $0x1,-0x14(%rbp)
0x00000001000109ce :    movl   $0x1,-0x2c(%rbp)
0x00000001000109d5 :    jmpq   0x10001129c 
0x00000001000109da :    lea    -0x38(%rbp),%rdi
0x00000001000109de :    mov    $0x0,%edx
0x00000001000109e3 :    mov    -0x90(%rbp),%rsi
0x00000001000109ea :    callq  0x100023664 <dyld_stub_CBFileOpen>
0x00000001000109ef :    test   $0x1,%al
0x00000001000109f1 :    jne    0x100010a15 
0x00000001000109f7 :    lea    0x16f24(%rip),%rdi        # 0x100027922
0x00000001000109fe :    mov    $0x0,%al
0x0000000100010a00 :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x0000000100010a05 :    movb   $0x0,-0x14(%rbp)
0x0000000100010a09 :    movl   $0x1,-0x2c(%rbp)
0x0000000100010a10 :    jmpq   0x10001129c 
0x0000000100010a15 :    mov    $0x1,%edx
0x0000000100010a1a :    lea    -0x13(%rbp),%rsi
0x0000000100010a1e :    mov    -0x38(%rbp),%rdi
0x0000000100010a22 :    callq  0x100023670 <dyld_stub_CBFileRead>
0x0000000100010a27 :    test   $0x1,%al
0x0000000100010a29 :    jne    0x100010a56 
0x0000000100010a2f :    lea    0x16f1a(%rip),%rdi        # 0x100027950
0x0000000100010a36 :    mov    $0x0,%al
0x0000000100010a38 :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x0000000100010a3d :    mov    -0x38(%rbp),%rdi
0x0000000100010a41 :    callq  0x100023658 <dyld_stub_CBFileClose>
0x0000000100010a46 :    movb   $0x0,-0x14(%rbp)
0x0000000100010a4a :    movl   $0x1,-0x2c(%rbp)
0x0000000100010a51 :    jmpq   0x10001129c 
0x0000000100010a56 :    cmpb   $0x0,-0x13(%rbp)
0x0000000100010a5a :    jne    0x100010a79 
0x0000000100010a60 :    mov    -0x38(%rbp),%rdi
0x0000000100010a64 :    callq  0x100023658 <dyld_stub_CBFileClose>
0x0000000100010a69 :    movb   $0x1,-0x14(%rbp)
0x0000000100010a6d :    movl   $0x1,-0x2c(%rbp)
0x0000000100010a74 :    jmpq   0x10001129c 
0x0000000100010a79 :    mov    $0xb,%edx
0x0000000100010a7e :    lea    -0x13(%rbp),%rsi
0x0000000100010a82 :    mov    -0x38(%rbp),%rdi
0x0000000100010a86 :    callq  0x100023670 <dyld_stub_CBFileRead>
0x0000000100010a8b :    test   $0x1,%al
0x0000000100010a8d :    jne    0x100010aba 
0x0000000100010a93 :    lea    0x16ed2(%rip),%rdi        # 0x10002796c
0x0000000100010a9a :    mov    $0x0,%al
0x0000000100010a9c :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x0000000100010aa1 :    mov    -0x38(%rbp),%rdi
0x0000000100010aa5 :    callq  0x100023658 <dyld_stub_CBFileClose>
0x0000000100010aaa :    movb   $0x0,-0x14(%rbp)
0x0000000100010aae :    movl   $0x1,-0x2c(%rbp)
0x0000000100010ab5 :    jmpq   0x10001129c 
0x0000000100010aba :    mov    -0x20(%rbp),%rax
0x0000000100010abe :    mov    (%rax),%rdi
0x0000000100010ac1 :    callq  0x100023a6c <dyld_stub_strlen>
0x0000000100010ac6 :    mov    -0x90(%rbp),%rdi
0x0000000100010acd :    add    %rax,%rdi
0x0000000100010ad0 :    mov    -0x20(%rbp),%rax
0x0000000100010ad4 :    mov    0x8(%rax),%rax
0x0000000100010ad8 :    mov    %rdi,-0xa0(%rbp)
0x0000000100010adf :    mov    %rax,%rdi
0x0000000100010ae2 :    callq  0x100023a6c <dyld_stub_strlen>
0x0000000100010ae7 :    mov    $0xffffffffffffffff,%rdi
0x0000000100010af1 :    mov    -0xa0(%rbp),%rcx
0x0000000100010af8 :    add    %rax,%rcx
0x0000000100010afb :    add    $0x2,%rcx
0x0000000100010b02 :    mov    %rcx,-0x40(%rbp)
0x0000000100010b06 :    cmp    $0xffffffffffffffff,%rdi
0x0000000100010b0d :    je     0x100010b39 
0x0000000100010b13 :    lea    0x15bfc(%rip),%rsi        # 0x100026716
0x0000000100010b1a :    mov    $0xffffffffffffffff,%rdx
0x0000000100010b24 :    mov    -0x40(%rbp),%rdi
0x0000000100010b28 :    callq  0x1000238a4 <dyld_stub___strcpy_chk>
0x0000000100010b2d :    mov    %rax,-0xa8(%rbp)
0x0000000100010b34 :    jmpq   0x100010b50 
0x0000000100010b39 :    lea    0x15bd6(%rip),%rsi        # 0x100026716
0x0000000100010b40 :    mov    -0x40(%rbp),%rdi
0x0000000100010b44 :    callq  0x1000108d0 <__inline_strcpy_chk>
0x0000000100010b49 :    mov    %rax,-0xb0(%rbp)
0x0000000100010b50 :    mov    -0x12(%rbp),%al
0x0000000100010b53 :    movzbl %al,%ecx
0x0000000100010b56 :    mov    %cx,%dx
0x0000000100010b59 :    movzbl -0x13(%rbp),%ecx
0x0000000100010b5d :    movzwl %dx,%esi
0x0000000100010b60 :    shl    $0x8,%esi
0x0000000100010b63 :    or     %esi,%ecx
0x0000000100010b65 :    movzbl -0x11(%rbp),%esi
0x0000000100010b69 :    shl    $0x10,%esi
0x0000000100010b6c :    or     %esi,%ecx
0x0000000100010b6e :    movzbl -0x10(%rbp),%esi
0x0000000100010b72 :    shl    $0x18,%esi
0x0000000100010b75 :    or     %esi,%ecx
0x0000000100010b77 :    mov    -0x90(%rbp),%rdi
0x0000000100010b7e :    mov    %ecx,%esi
0x0000000100010b80 :    callq  0x100023688 <dyld_stub_CBFileTruncate>
0x0000000100010b85 :    test   $0x1,%al
0x0000000100010b87 :    jne    0x100010bb4 
0x0000000100010b8d :    lea    0x16e2e(%rip),%rdi        # 0x1000279c2
0x0000000100010b94 :    mov    $0x0,%al
0x0000000100010b96 :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x0000000100010b9b :    mov    -0x38(%rbp),%rdi
0x0000000100010b9f :    callq  0x100023658 <dyld_stub_CBFileClose>
0x0000000100010ba4 :    movb   $0x0,-0x14(%rbp)
0x0000000100010ba8 :    movl   $0x1,-0x2c(%rbp)
0x0000000100010baf :    jmpq   0x10001129c 
0x0000000100010bb4 :    movzbl -0xe(%rbp),%eax
0x0000000100010bb8 :    shl    $0x8,%eax
0x0000000100010bbb :    movzbl -0xf(%rbp),%ecx
0x0000000100010bbf :    or     %eax,%ecx
0x0000000100010bc1 :    mov    %cx,%dx
0x0000000100010bc4 :    mov    %dx,-0x42(%rbp)
0x0000000100010bc8 :    mov    -0x40(%rbp),%rdi
0x0000000100010bcc :    mov    $0xffffffffffffffff,%rdx
0x0000000100010bd3 :    movzwl -0x42(%rbp),%r8d
0x0000000100010bd8 :    xor    %esi,%esi
0x0000000100010bda :    xor    %al,%al
0x0000000100010bdc :    lea    0x16e25(%rip),%rcx        # 0x100027a08
0x0000000100010be3 :    callq  0x100023892 <dyld_stub___sprintf_chk>
0x0000000100010be8 :    mov    -0xc(%rbp),%r9b
0x0000000100010bec :    movzbl %r9b,%esi
0x0000000100010bf0 :    mov    %si,%r10w
0x0000000100010bf4 :    movzbl -0xd(%rbp),%esi
0x0000000100010bf8 :    movzwl %r10w,%r8d
0x0000000100010bfc :    shl    $0x8,%r8d
0x0000000100010c00 :    or     %r8d,%esi
0x0000000100010c03 :    movzbl -0xb(%rbp),%r8d
0x0000000100010c08 :    shl    $0x10,%r8d
0x0000000100010c0c :    or     %r8d,%esi
0x0000000100010c0f :    movzbl -0xa(%rbp),%r8d
0x0000000100010c14 :    shl    $0x18,%r8d
0x0000000100010c18 :    or     %r8d,%esi
0x0000000100010c1b :    mov    -0x90(%rbp),%rdi
0x0000000100010c22 :    mov    %eax,-0xb4(%rbp)
0x0000000100010c28 :    callq  0x100023688 <dyld_stub_CBFileTruncate>
0x0000000100010c2d :    test   $0x1,%al
0x0000000100010c2f :    jne    0x100010c5c 
0x0000000100010c35 :    lea    0x16dd8(%rip),%rdi        # 0x100027a14
0x0000000100010c3c :    mov    $0x0,%al
0x0000000100010c3e :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x0000000100010c43 :    mov    -0x38(%rbp),%rdi
0x0000000100010c47 :    callq  0x100023658 <dyld_stub_CBFileClose>
0x0000000100010c4c :    movb   $0x0,-0x14(%rbp)
0x0000000100010c50 :    movl   $0x1,-0x2c(%rbp)
0x0000000100010c57 :    jmpq   0x10001129c 
0x0000000100010c5c :    mov    $0x0,%esi
0x0000000100010c61 :    lea    0x16ded(%rip),%rcx        # 0x100027a55
0x0000000100010c68 :    mov    $0xffffffffffffffff,%rdx
0x0000000100010c72 :    mov    -0x40(%rbp),%rdi
0x0000000100010c76 :    movzwl -0x42(%rbp),%eax
0x0000000100010c7a :    add    $0x1,%eax
0x0000000100010c7f :    mov    %eax,%r8d
0x0000000100010c82 :    mov    $0x0,%al
0x0000000100010c84 :    callq  0x100023892 <dyld_stub___sprintf_chk>
0x0000000100010c89 :    mov    $0x0,%esi
0x0000000100010c8e :    mov    -0x90(%rbp),%rdi
0x0000000100010c95 :    mov    %eax,-0xb8(%rbp)
0x0000000100010c9b :    callq  0x1000238bc <dyld_stub_access>
0x0000000100010ca0 :    cmp    $0x0,%eax
0x0000000100010ca5 :    jne    0x100010cbd 
0x0000000100010cab :    mov    -0x90(%rbp),%rdi
0x0000000100010cb2 :    callq  0x100023a3c <dyld_stub_remove>
0x0000000100010cb7 :    mov    %eax,-0xbc(%rbp)
0x0000000100010cbd :    movb   $0x0,-0x43(%rbp)
0x0000000100010cc1 :    movzbl -0x43(%rbp),%eax
0x0000000100010cc5 :    movzbl -0x9(%rbp),%ecx
0x0000000100010cc9 :    cmp    %ecx,%eax
0x0000000100010ccb :    jge    0x100010e37 
0x0000000100010cd1 :    mov    $0x7,%edx
0x0000000100010cd6 :    lea    -0x13(%rbp),%rsi
0x0000000100010cda :    mov    -0x38(%rbp),%rdi
0x0000000100010cde :    callq  0x100023670 <dyld_stub_CBFileRead>
0x0000000100010ce3 :    test   $0x1,%al
0x0000000100010ce5 :    jne    0x100010d12 
0x0000000100010ceb :    lea    0x16d6e(%rip),%rdi        # 0x100027a60
0x0000000100010cf2 :    mov    $0x0,%al
0x0000000100010cf4 :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x0000000100010cf9 :    mov    -0x38(%rbp),%rdi
0x0000000100010cfd :    callq  0x100023658 <dyld_stub_CBFileClose>
0x0000000100010d02 :    movb   $0x0,-0x14(%rbp)
0x0000000100010d06 :    movl   $0x1,-0x2c(%rbp)
0x0000000100010d0d :    jmpq   0x10001129c 
0x0000000100010d12 :    movzbl -0x11(%rbp),%eax
0x0000000100010d16 :    shl    $0x8,%eax
0x0000000100010d19 :    movzbl -0x12(%rbp),%ecx
0x0000000100010d1d :    or     %eax,%ecx
0x0000000100010d1f :    mov    %cx,%dx
0x0000000100010d22 :    mov    %dx,-0x42(%rbp)
0x0000000100010d26 :    mov    -0x40(%rbp),%rdi
0x0000000100010d2a :    mov    $0xffffffffffffffff,%rdx
0x0000000100010d31 :    movzwl -0x42(%rbp),%r9d
0x0000000100010d36 :    movzbl -0x13(%rbp),%r8d
0x0000000100010d3b :    xor    %esi,%esi
0x0000000100010d3d :    xor    %al,%al
0x0000000100010d3f :    lea    0x16d5f(%rip),%rcx        # 0x100027aa5
0x0000000100010d46 :    callq  0x100023892 <dyld_stub___sprintf_chk>
0x0000000100010d4b :    mov    -0xf(%rbp),%r10b
0x0000000100010d4f :    movzbl %r10b,%esi
0x0000000100010d53 :    mov    %si,%r11w
0x0000000100010d57 :    movzbl -0x10(%rbp),%esi
0x0000000100010d5b :    movzwl %r11w,%r8d
0x0000000100010d5f :    shl    $0x8,%r8d
0x0000000100010d63 :    or     %r8d,%esi
0x0000000100010d66 :    movzbl -0xe(%rbp),%r8d
0x0000000100010d6b :    shl    $0x10,%r8d
0x0000000100010d6f :    or     %r8d,%esi
0x0000000100010d72 :    movzbl -0xd(%rbp),%r8d
0x0000000100010d77 :    shl    $0x18,%r8d
0x0000000100010d7b :    or     %r8d,%esi
0x0000000100010d7e :    mov    -0x90(%rbp),%rdi
0x0000000100010d85 :    mov    %eax,-0xc0(%rbp)
0x0000000100010d8b :    callq  0x100023688 <dyld_stub_CBFileTruncate>
0x0000000100010d90 :    test   $0x1,%al
0x0000000100010d92 :    jne    0x100010dbf 
0x0000000100010d98 :    lea    0x16d17(%rip),%rdi        # 0x100027ab6
0x0000000100010d9f :    mov    $0x0,%al
0x0000000100010da1 :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x0000000100010da6 :    mov    -0x38(%rbp),%rdi
0x0000000100010daa :    callq  0x100023658 <dyld_stub_CBFileClose>
0x0000000100010daf :    movb   $0x0,-0x14(%rbp)
0x0000000100010db3 :    movl   $0x1,-0x2c(%rbp)
0x0000000100010dba :    jmpq   0x10001129c 
0x0000000100010dbf :    mov    $0x0,%esi
0x0000000100010dc4 :    lea    0x16d34(%rip),%rcx        # 0x100027aff
0x0000000100010dcb :    mov    $0xffffffffffffffff,%rdx
0x0000000100010dd5 :    mov    -0x40(%rbp),%rdi
0x0000000100010dd9 :    movzbl -0x13(%rbp),%r8d
0x0000000100010dde :    movzwl -0x42(%rbp),%eax
0x0000000100010de2 :    add    $0x1,%eax
0x0000000100010de7 :    mov    %eax,%r9d
0x0000000100010dea :    mov    $0x0,%al
0x0000000100010dec :    callq  0x100023892 <dyld_stub___sprintf_chk>
0x0000000100010df1 :    mov    $0x0,%esi
0x0000000100010df6 :    mov    -0x90(%rbp),%rdi
0x0000000100010dfd :    mov    %eax,-0xc4(%rbp)
0x0000000100010e03 :    callq  0x1000238bc <dyld_stub_access>
0x0000000100010e08 :    cmp    $0x0,%eax
0x0000000100010e0d :    jne    0x100010e25 
0x0000000100010e13 :    mov    -0x90(%rbp),%rdi
0x0000000100010e1a :    callq  0x100023a3c <dyld_stub_remove>
0x0000000100010e1f :    mov    %eax,-0xc8(%rbp)
0x0000000100010e25 :    jmpq   0x100010e2a 
0x0000000100010e2a :    mov    -0x43(%rbp),%al
0x0000000100010e2d :    add    $0x1,%al
0x0000000100010e2f :    mov    %al,-0x43(%rbp)
0x0000000100010e32 :    jmpq   0x100010cc1 
0x0000000100010e37 :    lea    -0x48(%rbp),%rsi
0x0000000100010e3b :    mov    -0x38(%rbp),%rdi
0x0000000100010e3f :    callq  0x10002365e <dyld_stub_CBFileGetLength>
0x0000000100010e44 :    test   $0x1,%al
0x0000000100010e46 :    jne    0x100010e73 
0x0000000100010e4c :    lea    0x16cbc(%rip),%rdi        # 0x100027b0f
0x0000000100010e53 :    mov    $0x0,%al
0x0000000100010e55 :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x0000000100010e5a :    mov    -0x38(%rbp),%rdi
0x0000000100010e5e :    callq  0x100023658 <dyld_stub_CBFileClose>
0x0000000100010e63 :    movb   $0x0,-0x14(%rbp)
0x0000000100010e67 :    movl   $0x1,-0x2c(%rbp)
0x0000000100010e6e :    jmpq   0x10001129c 
0x0000000100010e73 :    movq   $0x0,-0x50(%rbp)
0x0000000100010e7b :    movl   $0x0,-0x54(%rbp)
0x0000000100010e82 :    movzbl -0x9(%rbp),%eax
0x0000000100010e86 :    imul   $0x7,%eax,%eax
0x0000000100010e8c :    add    $0xc,%eax
0x0000000100010e91 :    mov    %eax,-0x58(%rbp)
0x0000000100010e94 :    mov    -0x58(%rbp),%eax
0x0000000100010e97 :    cmp    -0x48(%rbp),%eax
0x0000000100010e9a :    jae    0x100011212 
0x0000000100010ea0 :    mov    $0xc,%edx
0x0000000100010ea5 :    lea    -0x13(%rbp),%rsi
0x0000000100010ea9 :    mov    -0x38(%rbp),%rdi
0x0000000100010ead :    callq  0x100023670 <dyld_stub_CBFileRead>
0x0000000100010eb2 :    test   $0x1,%al
0x0000000100010eb4 :    jne    0x100010ee1 
0x0000000100010eba :    lea    0x16c78(%rip),%rdi        # 0x100027b39
0x0000000100010ec1 :    mov    $0x0,%al
0x0000000100010ec3 :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x0000000100010ec8 :    mov    -0x38(%rbp),%rdi
0x0000000100010ecc :    callq  0x100023658 <dyld_stub_CBFileClose>
0x0000000100010ed1 :    movb   $0x0,-0x14(%rbp)
0x0000000100010ed5 :    movl   $0x1,-0x2c(%rbp)
0x0000000100010edc :    jmpq   0x10001129c 
0x0000000100010ee1 :    mov    -0xa(%rbp),%al
0x0000000100010ee4 :    movzbl %al,%ecx
0x0000000100010ee7 :    mov    %cx,%dx
0x0000000100010eea :    movzbl -0xb(%rbp),%ecx
0x0000000100010eee :    movzwl %dx,%esi
0x0000000100010ef1 :    shl    $0x8,%esi
0x0000000100010ef4 :    or     %esi,%ecx
0x0000000100010ef6 :    movzbl -0x9(%rbp),%esi
0x0000000100010efa :    shl    $0x10,%esi
0x0000000100010efd :    or     %esi,%ecx
0x0000000100010eff :    movzbl -0x8(%rbp),%esi
0x0000000100010f03 :    shl    $0x18,%esi
0x0000000100010f06 :    or     %esi,%ecx
0x0000000100010f08 :    mov    %ecx,-0x5c(%rbp)
0x0000000100010f0b :    mov    -0x54(%rbp),%ecx
0x0000000100010f0e :    cmp    -0x5c(%rbp),%ecx
0x0000000100010f11 :    jae    0x100010f2d 
0x0000000100010f17 :    mov    -0x50(%rbp),%rdi
0x0000000100010f1b :    mov    -0x5c(%rbp),%esi
0x0000000100010f1e :    callq  0x100023a36 <dyld_stub_realloc>
0x0000000100010f23 :    mov    %rax,-0x50(%rbp)
0x0000000100010f27 :    mov    -0x5c(%rbp),%ecx
0x0000000100010f2a :    mov    %ecx,-0x54(%rbp)
0x0000000100010f2d :    mov    -0x50(%rbp),%rsi
0x0000000100010f31 :    mov    -0x5c(%rbp),%edx
0x0000000100010f34 :    mov    -0x38(%rbp),%rdi
0x0000000100010f38 :    callq  0x100023670 <dyld_stub_CBFileRead>
0x0000000100010f3d :    test   $0x1,%al
0x0000000100010f3f :    jne    0x100010f6c 
0x0000000100010f45 :    lea    0x16c0f(%rip),%rdi        # 0x100027b5b
0x0000000100010f4c :    mov    $0x0,%al
0x0000000100010f4e :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x0000000100010f53 :    mov    -0x38(%rbp),%rdi
0x0000000100010f57 :    callq  0x100023658 <dyld_stub_CBFileClose>
0x0000000100010f5c :    movb   $0x0,-0x14(%rbp)
0x0000000100010f60 :    movl   $0x1,-0x2c(%rbp)
0x0000000100010f67 :    jmpq   0x10001129c 
0x0000000100010f6c :    movzbl -0x13(%rbp),%eax
0x0000000100010f70 :    test   %eax,%eax
0x0000000100010f72 :    mov    %eax,-0xcc(%rbp)
0x0000000100010f78 :    je     0x10001105e 
0x0000000100010f7e :    jmpq   0x100010f83 
0x0000000100010f83 :    mov    -0xcc(%rbp),%eax
0x0000000100010f89 :    sub    $0x1,%eax
0x0000000100010f8c :    mov    %eax,-0xd0(%rbp)
0x0000000100010f92 :    je     0x100010ffb 
0x0000000100010f98 :    jmpq   0x100010f9d 
0x0000000100010f9d :    mov    -0xcc(%rbp),%eax
0x0000000100010fa3 :    sub    $0x2,%eax
0x0000000100010fa6 :    mov    %eax,-0xd4(%rbp)
0x0000000100010fac :    jne    0x1000110b8 
0x0000000100010fb2 :    jmpq   0x100010fb7 
0x0000000100010fb7 :    mov    $0x0,%esi
0x0000000100010fbc :    lea    0x16a92(%rip),%rcx        # 0x100027a55
0x0000000100010fc3 :    mov    -0x40(%rbp),%rdi
0x0000000100010fc7 :    mov    $0xffffffffffffffff,%rdx
0x0000000100010fce :    mov    -0x10(%rbp),%al
0x0000000100010fd1 :    movzbl %al,%r8d
0x0000000100010fd5 :    mov    %r8w,%r9w
0x0000000100010fd9 :    movzbl -0x11(%rbp),%r8d
0x0000000100010fde :    movzwl %r9w,%r10d
0x0000000100010fe2 :    shl    $0x8,%r10d
0x0000000100010fe6 :    or     %r10d,%r8d
0x0000000100010fe9 :    mov    $0x0,%al
0x0000000100010feb :    callq  0x100023892 <dyld_stub___sprintf_chk>
0x0000000100010ff0 :    mov    %eax,-0xd8(%rbp)
0x0000000100010ff6 :    jmpq   0x1000110bd 
0x0000000100010ffb :    mov    $0xffffffffffffffff,%rax
0x0000000100011005 :    mov    -0x40(%rbp),%rcx
0x0000000100011009 :    cmp    $0xffffffffffffffff,%rax
0x000000010001100f :    mov    %rcx,-0xe0(%rbp)
0x0000000100011016 :    je     0x100011042 
0x000000010001101c :    lea    0x156f3(%rip),%rsi        # 0x100026716
0x0000000100011023 :    mov    $0xffffffffffffffff,%rdx
0x000000010001102d :    mov    -0x40(%rbp),%rdi
0x0000000100011031 :    callq  0x1000238a4 <dyld_stub___strcpy_chk>
0x0000000100011036 :    mov    %rax,-0xe8(%rbp)
0x000000010001103d :    jmpq   0x100011059 
0x0000000100011042 :    lea    0x156cd(%rip),%rsi        # 0x100026716
0x0000000100011049 :    mov    -0x40(%rbp),%rdi
0x000000010001104d :    callq  0x1000108d0 <__inline_strcpy_chk>
0x0000000100011052 :    mov    %rax,-0xf0(%rbp)
0x0000000100011059 :    jmpq   0x1000110bd 
0x000000010001105e :    mov    $0x0,%esi
0x0000000100011063 :    lea    0x16b21(%rip),%rcx        # 0x100027b8b
0x000000010001106a :    mov    -0x40(%rbp),%rdi
0x000000010001106e :    mov    $0xffffffffffffffff,%rdx
0x0000000100011075 :    mov    -0x10(%rbp),%al
0x0000000100011078 :    movzbl %al,%r8d
0x000000010001107c :    mov    %r8w,%r9w
0x0000000100011080 :    movzbl -0x11(%rbp),%r8d
0x0000000100011085 :    movzbl -0x12(%rbp),%r10d
0x000000010001108a :    movzwl %r9w,%r11d
0x000000010001108e :    shl    $0x8,%r11d
0x0000000100011092 :    or     %r11d,%r8d
0x0000000100011095 :    mov    %r8d,-0xf4(%rbp)
0x000000010001109c :    mov    %r10d,%r8d
0x000000010001109f :    mov    -0xf4(%rbp),%r9d
0x00000001000110a6 :    mov    $0x0,%al
0x00000001000110a8 :    callq  0x100023892 <dyld_stub___sprintf_chk>
0x00000001000110ad :    mov    %eax,-0xf8(%rbp)
0x00000001000110b3 :    jmpq   0x1000110bd 
0x00000001000110b8 :    jmpq   0x1000110bd 
0x00000001000110bd :    lea    -0x68(%rbp),%rdi
0x00000001000110c1 :    mov    $0x0,%edx
0x00000001000110c6 :    mov    -0x90(%rbp),%rsi
0x00000001000110cd :    callq  0x100023664 <dyld_stub_CBFileOpen>
0x00000001000110d2 :    test   $0x1,%al
0x00000001000110d4 :    jne    0x100011101 
0x00000001000110da :    lea    0x16ab8(%rip),%rdi        # 0x100027b99
0x00000001000110e1 :    mov    $0x0,%al
0x00000001000110e3 :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x00000001000110e8 :    mov    -0x38(%rbp),%rdi
0x00000001000110ec :    callq  0x100023658 <dyld_stub_CBFileClose>
0x00000001000110f1 :    movb   $0x0,-0x14(%rbp)
0x00000001000110f5 :    movl   $0x1,-0x2c(%rbp)
0x00000001000110fc :    jmpq   0x10001129c 
0x0000000100011101 :    mov    -0xe(%rbp),%al
0x0000000100011104 :    movzbl %al,%ecx
0x0000000100011107 :    mov    %cx,%dx
0x000000010001110a :    movzbl -0xf(%rbp),%ecx
0x000000010001110e :    movzwl %dx,%esi
0x0000000100011111 :    shl    $0x8,%esi
0x0000000100011114 :    or     %esi,%ecx
0x0000000100011116 :    movzbl -0xd(%rbp),%esi
0x000000010001111a :    shl    $0x10,%esi
0x000000010001111d :    or     %esi,%ecx
0x000000010001111f :    movzbl -0xc(%rbp),%esi
0x0000000100011123 :    shl    $0x18,%esi
0x0000000100011126 :    or     %esi,%ecx
0x0000000100011128 :    mov    -0x68(%rbp),%rdi
0x000000010001112c :    mov    %ecx,%esi
0x000000010001112e :    callq  0x100023676 <dyld_stub_CBFileSeek>
0x0000000100011133 :    test   $0x1,%al
0x0000000100011135 :    jne    0x10001116b 
0x000000010001113b :    lea    0x16a8f(%rip),%rdi        # 0x100027bd1
0x0000000100011142 :    mov    $0x0,%al
0x0000000100011144 :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x0000000100011149 :    mov    -0x38(%rbp),%rdi
0x000000010001114d :    callq  0x100023658 <dyld_stub_CBFileClose>
0x0000000100011152 :    mov    -0x68(%rbp),%rdi
0x0000000100011156 :    callq  0x100023658 <dyld_stub_CBFileClose>
0x000000010001115b :    movb   $0x0,-0x14(%rbp)
0x000000010001115f :    movl   $0x1,-0x2c(%rbp)
0x0000000100011166 :    jmpq   0x10001129c 
0x000000010001116b :    mov    -0x50(%rbp),%rsi
0x000000010001116f :    mov    -0x5c(%rbp),%edx
0x0000000100011172 :    mov    -0x68(%rbp),%rdi
0x0000000100011176 :    callq  0x10002366a <dyld_stub_CBFileOverwrite>
0x000000010001117b :    test   $0x1,%al
0x000000010001117d :    jne    0x1000111b3 
0x0000000100011183 :    lea    0x16a7f(%rip),%rdi        # 0x100027c09
0x000000010001118a :    mov    $0x0,%al
0x000000010001118c :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x0000000100011191 :    mov    -0x38(%rbp),%rdi
0x0000000100011195 :    callq  0x100023658 <dyld_stub_CBFileClose>
0x000000010001119a :    mov    -0x68(%rbp),%rdi
0x000000010001119e :    callq  0x100023658 <dyld_stub_CBFileClose>
0x00000001000111a3 :    movb   $0x0,-0x14(%rbp)
0x00000001000111a7 :    movl   $0x1,-0x2c(%rbp)
0x00000001000111ae :    jmpq   0x10001129c 
0x00000001000111b3 :    mov    -0x68(%rbp),%rdi
0x00000001000111b7 :    callq  0x10002367c <dyld_stub_CBFileSync>
0x00000001000111bc :    test   $0x1,%al
0x00000001000111be :    jne    0x1000111f4 
0x00000001000111c4 :    lea    0x16a70(%rip),%rdi        # 0x100027c3b
0x00000001000111cb :    mov    $0x0,%al
0x00000001000111cd :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x00000001000111d2 :    mov    -0x38(%rbp),%rdi
0x00000001000111d6 :    callq  0x100023658 <dyld_stub_CBFileClose>
0x00000001000111db :    mov    -0x68(%rbp),%rdi
0x00000001000111df :    callq  0x100023658 <dyld_stub_CBFileClose>
0x00000001000111e4 :    movb   $0x0,-0x14(%rbp)
0x00000001000111e8 :    movl   $0x1,-0x2c(%rbp)
0x00000001000111ef :    jmpq   0x10001129c 
0x00000001000111f4 :    mov    -0x68(%rbp),%rdi
0x00000001000111f8 :    callq  0x100023658 <dyld_stub_CBFileClose>
0x00000001000111fd :    mov    -0x5c(%rbp),%eax
0x0000000100011200 :    add    $0xc,%eax
0x0000000100011205 :    mov    -0x58(%rbp),%ecx
0x0000000100011208 :    add    %eax,%ecx
0x000000010001120a :    mov    %ecx,-0x58(%rbp)
0x000000010001120d :    jmpq   0x100010e94 
0x0000000100011212 :    mov    -0x50(%rbp),%rdi
0x0000000100011216 :    callq  0x100023916 <dyld_stub_free>
0x000000010001121b :    mov    -0x20(%rbp),%rdi
0x000000010001121f :    mov    (%rdi),%rdi
0x0000000100011222 :    callq  0x100023682 <dyld_stub_CBFileSyncDir>
0x0000000100011227 :    test   $0x1,%al
0x0000000100011229 :    jne    0x100011256 
0x000000010001122f :    lea    0x16a34(%rip),%rdi        # 0x100027c6a
0x0000000100011236 :    mov    $0x0,%al
0x0000000100011238 :    callq  0x1000235f2 <dyld_stub_CBLogError>
0x000000010001123d :    mov    -0x38(%rbp),%rdi
0x0000000100011241 :    callq  0x100023658 <dyld_stub_CBFileClose>
0x0000000100011246 :    movb   $0x0,-0x14(%rbp)
0x000000010001124a :    movl   $0x1,-0x2c(%rbp)
0x0000000100011251 :    jmpq   0x10001129c 
0x0000000100011256 :    mov    $0x1,%edx
0x000000010001125b :    lea    -0x13(%rbp),%rsi
0x000000010001125f :    movb   $0x0,-0x13(%rbp)
0x0000000100011263 :    mov    -0x38(%rbp),%rdi
0x0000000100011267 :    callq  0x10002366a <dyld_stub_CBFileOverwrite>
0x000000010001126c :    test   $0x1,%al
0x000000010001126e :    jne    0x100011279 
0x0000000100011274 :    jmpq   0x100011288 
0x0000000100011279 :    mov    -0x38(%rbp),%rdi
0x000000010001127d :    callq  0x10002367c <dyld_stub_CBFileSync>
0x0000000100011282 :    mov    %al,-0xf9(%rbp)
0x0000000100011288 :    mov    -0x38(%rbp),%rdi
0x000000010001128c :    callq  0x100023658 <dyld_stub_CBFileClose>
0x0000000100011291 :    movb   $0x1,-0x14(%rbp)
0x0000000100011295 :    movl   $0x1,-0x2c(%rbp)
0x000000010001129c :    mov    -0x28(%rbp),%rax
0x00000001000112a0 :    mov    %rax,%rsp
0x00000001000112a3 :    mov    0x1ad76(%rip),%rax        # 0x10002c020
0x00000001000112aa :    mov    -0x14(%rbp),%cl
0x00000001000112ad :    mov    (%rax),%rax
0x00000001000112b0 :    mov    -0x8(%rbp),%rdx
0x00000001000112b4 :    cmp    %rdx,%rax
0x00000001000112b7 :    mov    %cl,-0xfa(%rbp)
0x00000001000112bd :    jne    0x1000112d3 
0x00000001000112c3 :    mov    -0xfa(%rbp),%al
0x00000001000112c9 :    and    $0x1,%al
0x00000001000112cb :    movzbl %al,%eax
0x00000001000112ce :    mov    %rbp,%rsp
0x00000001000112d1 :    pop    %rbp
0x00000001000112d2 :    retq
0x00000001000112d3 :    callq  0x100023898 <dyld_stub___stack_chk_fail>

最佳答案

I did try valgrind (3.9.0) but it does not detect any errors.

Valgrind 不会检测堆栈溢出,所以这是意料之中的事情。你应该使用 AddressSanitizer代替堆栈(假设您可以重建此代码)。

However the assembly code is different on OSX so I don't know where the canary value is set.

你应该学习如何阅读汇编,它真的没有那么难。

__stack_chk_fail 的唯一调用是这个:

0x00000001000112d3 :    callq  0x100023898 <dyld_stub___stack_chk_fail>

获得该指令的唯一方法是从这里:

0x00000001000112bd :    jne    0x1000112d3 

因此,你应该寻找最近的比较,就是这个:

0x00000001000112b4 :    cmp    %rdx,%rax

现在您看看 %rdx%rax 如何在 cmp 之前获取它们的值:

0x00000001000112a3 :    mov    0x1ad76(%rip),%rax        # 0x10002c020
...
0x00000001000112ad :    mov    (%rax),%rax
0x00000001000112b0 :    mov    -0x8(%rbp),%rdx

这意味着我们将一些全局地址加载到 %rax 中,然后将存储在那里的值与存储在 -0x8(%rbp) 中的值进行比较。现在很明显 -0x8(%rbp) 是被覆盖的金丝雀。

您现在还可以看到存储在 *0x10002c020 的值正在函数序言中存储到金丝雀中:

0x0000000100010921 :    mov    0x1b6f8(%rip),%rax        # 0x10002c020
0x0000000100010928 :    mov    (%rax),%rax
0x000000010001092b :    mov    %rax,-0x8(%rbp)

因此,在 *0x0000000100010928 上设置一个断点,然后在 -8(%rbp) 上设置一个观察点。

在断点处,%rax 将包含 canary 值;观察点应该在指令 0x000000010001092b(设置金丝雀)处触发一次,然后在堆栈实际损坏时再次触发。

现在,这并不困难,不是吗?

关于c - 在 OSX 上使用 GDB 检测堆栈损坏(在金丝雀值上设置观察点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20890661/

相关文章:

c++ - 在 C 中允许重复的 const 限定符但在 C++ 中不允许?

c - 我正在尝试比较字符串文字,并且我想删除重复的文字,我想在不使用指针的情况下执行此操作。,

macos - NSButton 标记 ID 返回超过 7 的不准确值

macos - curl 下载在 OS X Yosemite 上失败

java - Mac 是否支持零复制原理

c - HackerRank 说 ~ 标准输出没有响应 ~ C

c - Linux 内核 flush_write_buffers() 如何在 x86 上工作?

c++ - GCC 调试器堆栈跟踪显示错误的文件名和行号

c++ - 在 VSCODE 中调试 : Watching vectors with length > 1000

java gdb 运行时