Category Archives: reverse engnieering

Flareon4 third challenge

本文已发表在看雪论坛, 详情可见: https://bbs.pediy.com/thread-223473.htm 题目作者: Matt Williams (@0xmwilliams) 翻译前言: 文章对代码自修改的分析很细致, 使用Unicorn框架来模拟执行代码和Capstone进行反汇编. 文中分析的程序你可以点击此处下载: greek_to_me.zip, 解压密码: www.pediy.com greek_to_me.exe是一个Windows x86可执行文件, 如下图所示, 程序中的字符串表露了00401101处要达成的情况, 如下所示. 004010F5 push 0 ; flags 004010F7 push 2Bh ; len 004010F9 push offset aCongratulation ; “Congratulations! But wait, where’s…” 004010FE push … Continue reading

Posted in reverse engnieering | Leave a comment

基于Objdump的反汇编器存在的限制

objdump总是会期望处理一个被gcc很好地编译生成的可执行文件,然而通常情况下的程序文件,有些可能就是直接由代码汇编,有些却使用了一些技巧来对抗反汇编。接下来就大致介绍一下objdump存在的一些缺陷 objdump过于依赖节区头(section headers) 一个ELF可执行文件”通常”包含正确的节区头。而对系统的程序加载器而言,有没有节区头根本无关紧要,关键是获取程序的程序头(program headers)。 故而,最常见的反汇编技巧就是丢弃/处理掉ELF文件的节区头,或是覆写掉,伪造大小等等。 一旦处理过后,objdump就会拒绝进行反汇编。 objdump不会跟踪执行流 不跟踪代码执行流,objdump可以很轻易地被玩弄,仅仅反汇编了少许行就停下。这意味着objdump无法识别函数,也无法识别误认作”数据”中的代码 另一种常见的技巧是插入垃圾指令并跳过这些指令以对齐执行流中的汇编代码。 例如:当一个指令跳转到下一条指令的中间,而objdump不会从跳转的目的地址进行汇编,而是从下一条指令继续反汇编,也就使得垃圾指令被”组合”成一条新的指令。 start: jmp label+1 label: DB 0x90 mov eax, 0xf001 对应的objdump反汇编代码如下 08048080 <start>: 8048080: e9 01 00 00 00 jmp 8048086 <label+0x1> 08048085 <label>: 8048085: 90 nop 8048086: b8 01 … Continue reading

Posted in reverse engnieering | Leave a comment