我的程序在OSX Mountain Lion上的函数via__stack_chk_fail
结束时中止。当检测到金丝雀值发生变化时,显然会调用__stack_chk_fail
。我想遵循一个类似的步骤来检测堆栈损坏的位置。但是OSX上的程序集代码不同,所以我不知道canary值设置在哪里。
有人知道如何在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>
最佳答案
我试过valgrind(3.9.0),但没有发现任何错误。
Valgrind没有检测到堆栈溢出,所以这是意料之中的。您应该使用AddressSanitizer来代替堆栈(假设您可以重新生成此代码)。
但是OSX上的程序集代码不同,所以我不知道canary值设置在哪里。
你应该学会读汇编,其实没那么难。
对__stack_chk_fail
的唯一调用是:
0x00000001000112d3 : callq 0x100023898 <dyld_stub___stack_chk_fail>
唯一的方法就是从这里开始:
0x00000001000112bd : jne 0x1000112d3
因此,您应该寻找最接近的比较,即:
0x00000001000112b4 : cmp %rdx,%rax
现在您将了解如何在
%rdx
和%rax
之前获取它们的值:0x00000001000112a3 : mov 0x1ad76(%rip),%rax # 0x10002c020
...
0x00000001000112ad : mov (%rax),%rax
0x00000001000112b0 : mov -0x8(%rbp),%rdx
这意味着我们将一些全局地址加载到
cmp
中,然后将存储在其中的值与存储在%rax
中的值进行比较。现在很明显,-0x8(%rbp)
是被覆盖的金丝雀。现在,您还可以看到存储在
-0x8(%rbp)
的值正存储在函数prolog中的canary中:0x0000000100010921 : mov 0x1b6f8(%rip),%rax # 0x10002c020
0x0000000100010928 : mov (%rax),%rax
0x000000010001092b : mov %rax,-0x8(%rbp)
所以,在
*0x10002c020
上设置一个断点,然后在*0x0000000100010928
上设置一个观察点。在断点处,
-8(%rbp)
将包含canary值;应该在指令%rax
(设置canary)处命中一次观察点,然后在堆栈实际损坏时再次命中。这不难,对吧?