注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

碳基体

http://weibo.com/tanjiti

 
 
 
 
 

日志

 
 

objective-c runtime安全措施之三:反汇编(-03 编译选项)  

2012-04-01 11:22:20|  分类: iOS app security |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

《O'Reilly.Hacking.and.Securing.iOS.Applications>>读书笔记

反汇编:通过优化编译器选项、去除符号表来复杂化编译后生成的汇编代码(使用反汇编工具结合动态调试工具弄清并篡改程序逻辑)

方法2:使用编译器的 -03 选项

原理:-03编译选项可以将具体的计算逻辑隐藏起来,直接输出计算结果

int main(int argc, char **argv)

{

int i;

int a = 0;

for(i=0;i<10;++i) {

a += i;

}

printf("%d\n", a);

return 0;

}

例子1:普通编译方式编译的汇编代码

_main:

0000000100000ec0 pushq %rbp

0000000100000ec1 movq %rsp,%rbp

0000000100000ec4 subq $0x20,%rsp

0000000100000ec8 movl %edi,0xfc(%rbp)

0000000100000ecb movq %rsi,0xf0(%rbp)

0000000100000ecf movl $0x00000000,0xe0(%rbp)

0000000100000ed6 movl $0x00000000,0xe4(%rbp)

0000000100000edd jmp 0x100000ef3

0000000100000edf movl 0xe0(%rbp),%eax

0000000100000ee2 movl 0xe4(%rbp),%ecx

0000000100000ee5 addl %ecx,%eax

0000000100000ee7 movl %eax,0xe0(%rbp)

0000000100000eea movl 0xe4(%rbp),%eax

0000000100000eed addl $0x01,%eax        ;1

0000000100000ef0 movl %eax,0xe4(%rbp)

0000000100000ef3 movl 0xe4(%rbp),%eax

0000000100000ef6 cmpl $0x09,%eax         ;9

0000000100000ef9 jle 0x100000edf

0000000100000efb movl 0xe0(%rbp),%eax

0000000100000efe xorb %cl,%cl

0000000100000f00 leaq 0x00000055(%rip),%rdx

0000000100000f07 movq %rdx,%rdi

0000000100000f0a movl %eax,%esi

0000000100000f0c movb %cl,%al

0000000100000f0e callq 0x100000f30 ; symbol stub for: _printf

0000000100000f13 movl $0x00000000,0xe8(%rbp)

0000000100000f1a movl 0xe8(%rbp),%eax

0000000100000f1d movl %eax,0xec(%rbp)

0000000100000f20 movl 0xec(%rbp),%eax

0000000100000f23 addq $0x20,%rsp

0000000100000f27 popq %rbp

0000000100000f28 ret

例子2:采用 -03 编译选项编译的汇编代码

_main:

0000000100000f10 pushq %rbp

0000000100000f11 movq %rsp,%rbp

0000000100000f14 movl $0x0000002d,%esi  ;最终结果45

0000000100000f19 xorb %al,%al

0000000100000f1b leaq 0x0000003a(%rip),%rdi

0000000100000f22 callq 0x100000f32 ; symbol stub for: _printf

0000000100000f27 xorl %eax,%eax

0000000100000f29 popq %rbp

0000000100000f2a ret

优化后的输出直接计算出结果0x2D(451+2+3+4+5+6+7+8+9的和),将其发送给printf函数,没有显示任何循环过程。这样依赖,攻击者也完全看不出计算逻辑了。下面的调试过程,显示了优化后,直接在寄存器中创建和存储了一个常量。

$ gdb -q ./testprog

Reading symbols for shared libraries .. done

(gdb) break printf

Function "printf" not defined.

Make breakpoint pending on future shared library load? (y or [n]) y

Breakpoint 1 (printf) pending.

(gdb) r

Starting program: /Users/jonz/Downloads/a

Reading symbols for shared libraries +........................ done

Breakpoint 1 at 0x7fff8b69922e

Pending breakpoint 1 - "printf" resolved

(gdb) info reg

rax 0x0 0

rbx 0x0 0

rcx 0x0 0

rdx 0x100000f5c 4294971228

rsi 0x2d 45

rdi 0x100000f5c 4294971228

...

  评论这张
 
阅读(736)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017