Detecting stack corruption using GDB on OSX (Setting a watchpoint on the canary value)

1k views Asked by At

My program aborts at the end of a function via __stack_chk_fail on OSX Mountain Lion. Apparently __stack_chk_fail is called when it is detected that the canary value has changed. I would like to follow a similar procedure as outlined here to detect the location of the stack corruption. However the assembly code is different on OSX so I don't know where the canary value is set.

Does anyone know how to go about this on OSX?

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

The assembly code given by gdb of the function is:

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>
1

There are 1 answers

1
Employed Russian On BEST ANSWER

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

Valgrind doesn't detect stack overflows, so that's quite expected. You should use AddressSanitizer for stack instead (assuming you can rebuild this code).

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

You should learn how to read assembly, it's really not that difficult.

The only call to __stack_chk_fail is this one:

0x00000001000112d3 :    callq  0x100023898 <dyld_stub___stack_chk_fail>

and the only way to get to that instruction is from here:

0x00000001000112bd :    jne    0x1000112d3 

Therefore, you should look for nearest compare, which is this one:

0x00000001000112b4 :    cmp    %rdx,%rax

Now you look at how %rdx and %rax get their values before that cmp:

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

Which means that we load address of some global into %rax, then compare the value stored there with the value stored at -0x8(%rbp). It's now clear that the -0x8(%rbp) is the canary being overwritten.

You can also now see that the value stored at *0x10002c020 is being stored into the canary in the function prolog:

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

So, set a breakpoint on *0x0000000100010928, and then a watchpoint on -8(%rbp).

At the breakpoint, %rax will contain the canary value; the watchpoint should be hit once at instruction 0x000000010001092b (setting canary), and then again when the stack is actually getting corrupted.

Now, that wasn't difficult, was it?