当前位置:编程学习 > 网站相关 >>

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

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,