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>
Valgrind doesn't detect stack overflows, so that's quite expected. You should use AddressSanitizer for stack instead (assuming you can rebuild this code).
You should learn how to read assembly, it's really not that difficult.
The only call to
__stack_chk_fail
is this one:and the only way to get to that instruction is from here:
Therefore, you should look for nearest compare, which is this one:
Now you look at how
%rdx
and%rax
get their values before thatcmp
: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: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 instruction0x000000010001092b
(setting canary), and then again when the stack is actually getting corrupted.Now, that wasn't difficult, was it?