GCC编译程序改JNE为NOP正常,Clang编译后修改触发段错误求助
问题:Clang编译程序修改汇编指令后触发段错误
我尝试通过修改汇编代码破解一个简单的C程序密码,核心思路是把is_valid函数里的jne指令替换为nop指令。该C程序通过strcmp判断输入密码是否为空,为空则返回1(验证通过)。
- GCC编译场景:使用GCC编译程序后,执行命令
printf "\x90\x90" | dd of=pass bs=1 seek=4525 count=2 conv=notrunc将jne改为nop,运行时输入任意字符均显示"Correct! Go inside",功能正常。 - Clang编译场景:使用命令
clang Pass.c -o pass编译后,执行命令printf "\x90\x90" | dd of=pass bs=1 seek=4511 count=2 conv=notrunc修改jne为nop,运行输入密码时触发zsh: segmentation fault错误。
Clang编译生成的is_valid函数汇编代码
0000000000001180 <is_valid>: is_valid(): 1180: 55 push %rbp 1181: 48 89 e5 mov %rsp,%rbp 1184: 48 83 ec 10 sub $0x10,%rsp 1188: 48 89 7d f0 mov %rdi,-0x10(%rbp) 118c: 48 8b 7d f0 mov -0x10(%rbp),%rdi 1190: 48 8d 35 6d 0e 00 00 lea 0xe6d(%rip),%rsi # 2004 <_IO_stdin_used+0x4> 1197: e8 b4 fe ff ff call 1050 <strcmp@plt> 119c: 83 f8 00 cmp $0x0,%eax 119f: 0f 85 0c 00 00 00 jne 11b1 <is_valid+0x31> 11a5: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%rbp) 11ac: e9 07 00 00 00 jmp 11b8 <is_valid+0x38> 11b1: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp) 11b8: 8b 45 fc mov -0x4(%rbp),%eax 11bb: 48 83 c4 10 add $0x10,%rsp 11bf: 5d pop %rbp 11c0: c3 ret 11c1: 66 2e 0f 1f 84 00 00 00 00 00 cs nopw 0x0(%rax,%rax,1) 11cb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
GCC编译生成的is_valid函数汇编代码
0000000000001189 <is_valid>: is_valid(): 1189: 55 push %rbp 118a: 48 89 e5 mov %rsp,%rbp 118d: 48 83 ec 10 sub $0x10,%rsp 1191: 48 89 7d f8 mov %rdi,-0x8(%rbp) 1195: 48 8b 45 f8 mov -0x8(%rbp),%rax 1199: 48 8d 15 64 0e 00 00 lea 0xe64(%rip),%rdx # 2004 <_IO_stdin_used+0x4> 11a0: 48 89 d6 mov %rdx,%rsi 11a3: 48 89 c7 mov %rax,%rdi 11a6: e8 b5 fe ff ff call 1060 <strcmp@plt> 11ab: 85 c0 test %eax,%eax 11ad: 75 07 jne 11b6 <is_valid+0x2d> 11af: b8 01 00 00 00 mov $0x1,%eax 11b4: eb 05 jmp 11bb <is_valid+0x32> 11b6: b8 00 00 00 00 mov $0x0,%eax 11bb: c9 leave 11bc: c3 ret
请协助排查该段错误的原因及解决方法。
内容的提问来源于stack exchange,提问作者Hoax
相关产品推荐
相关产品推荐

