objective-c runtime安全措施之六:反汇编(-funroll-loops编译选项)
《O'Reilly.Hacking.and.Securing.iOS.Applications>>读书笔记
反汇编:通过优化编译器选项、去除符号表来复杂化编译后生成的汇编代码(使用反汇编工具结合动态调试工具弄清并篡改程序逻辑)
方法4:使用编译器的 -funroll-loops 选项 完全展开循环结构
原理: -funroll-loops编译选项使得程序中的循环步骤完全展开。这样会增加汇编代码的长度,并且攻击者需要隔离出每个循环,进行单独的修改,从而增大了攻击难度。
问题:在linux环境下编译可以完全展开整个循环逻辑,但是在苹果编译器中目前是不能完全展开,不知道新版xcode中的gcc是否可以。
int main( ) {
int i = 0;
for(i=0; i<1000; ++i) {
puts("This is my loop of secure session checks");
}
}
例子1:在mac os x上使用 –funroll-loops编译选项
$ gcc -o main main.c -funroll-loops -funroll-all-loops
$ otool -tV main
_main:
0000000100000ef0 pushq %rbp
0000000100000ef1 movq %rsp,%rbp
0000000100000ef4 subq $0x10,%rsp
0000000100000ef8 movl $0x00000000,0xf8(%rbp)
0000000100000eff xorb %al,%al
0000000100000f01 leaq 0x00000054(%rip),%rcx
0000000100000f08 movq %rcx,%rdi
0000000100000f0b callq 0x100000f30 ; symbol stub for: _puts
0000000100000f10 movl 0xf8(%rbp),%eax
0000000100000f13 addl $0x01,%eax
0000000100000f16 movl %eax,0xf8(%rbp)
0000000100000f19 movl 0xf8(%rbp),%eax
0000000100000f1c cmpl $0x09,%eax
0000000100000f1f jle 0x100000eff
0000000100000f21 movl 0xfc(%rbp),%eax
0000000100000f24 addq $0x10,%rsp
0000000100000f28 popq %rbp
0000000100000f29 ret
即使使用了–funroll-loops选项,循环也未
例子2:在linux 上使用 –funroll-loops编译选项
080483f0 <main>:
80483f0: 55 push %ebp
80483f1: 89 e5 mov %esp,%ebp
80483f3: 83 e4 f0 and $0xfffffff0,%esp
80483f6: 53 push %ebx
80483f7: 31 db xor %ebx,%ebx
80483f9: 83 ec 1c sub $0x1c,%esp
80483fc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
8048400: 83 c3 08 add $0x8,%ebx
8048403: c7 04 24 40 85 04 08 movl $0x8048540,(%esp)
804840a: e8 09 ff ff ff call 8048318 <puts@plt>
804840f: c7 04 24 40 85 04 08 movl $0x8048540,(%esp)
8048416: e8 fd fe ff ff call 8048318 <puts@plt>
804841b: c7 04 24 40 85 04 08 movl $0x8048540,(%esp)
8048422: e8 f1 fe ff ff call 8048318 <puts@plt>
8048427: c7 04 24 40 85 04 08 movl $0x8048540,(%esp)
804842e: e8 e5 fe ff ff call 8048318 <puts@plt>
8048433: c7 04 24 40 85 04 08 movl $0x8048540,(%esp)
804843a: e8 d9 fe ff ff call 8048318 <puts@plt>
804843f: c7 04 24 40 85 04 08 movl $0x8048540,(%esp)
8048446: e8 cd fe ff ff call 8048318 <puts@plt>
804844b: c7 04 24 40 85 04 08 movl $0x8048540,(%esp)
8048452: e8 c1 fe ff ff call 8048318 <puts@plt>
8048457: c7 04 24 40 85 04 08 movl $0x8048540,(%esp)
804845e: e8 b5 fe ff ff call 8048318 <puts@plt>
8048463: 81 fb e8 03 00 00 cmp $0x3e8,%ebx
8048469: 75 95 jne 8048400 <main+0x10>
804846b: 83 c4 1c add $0x1c,%esp
804846e: 5b pop %ebx
804846f: 89 ec mov %ebp,%esp
8048471: 5d pop %ebp
8048472: c3 ret
作者 danqingd
补充:综合编程 , 安全编程 ,