【原创】IDA+OD双剑合璧=逆向无敌

Home / Article MrLee 2016-4-10 5782

我这一周学<软件逆向>是薛老师讲课, 大多挺深,我就列出一个典型的吧。
准备工具: ollydbg  ida   vs2012
--------------------------------- 我们先把目标程序winasm_0.exe拖入peid 主界面

img (22)

那我们去输入表看看

img (1)

img (2)

也好像没什么特别值得关注的。
、那好 简单测试下程序   看有什么状况发生

img (3)

看 弹出对话框 那我们该想到什么?API断点!messagebox相关!
不急我们把它拖入OD  直接ctrl+A分析

【原创】IDA+OD双剑合璧=逆向无敌 - 看雪安全论坛

入口点:

img (4)

习惯性的我把它上下一翻、发现:

img (5)

这不是我们要找的字符串吗?( PS: 如果我没翻到 步骤应该会是:
  1. 搜索字符串
  2. 下API断点
  3. 其它...
) 我们截取关键代码分析:
代码:
CPU Disasm 地址        十六进制数据            指令                                       Profile  Comments     获取输入内容 00401066  |.  E8 BF000000   CALL        ;           /USER32.GetDlgItemTextA 0040106B      A3 13114000   MOV DWORD PTR DS:[401113],EAX            ;           MOV DWORD PTR DS:[401113],EAX 比较eax 00401070  |.  83F8 05       CMP EAX,5                                ; 00401073  |.  75 13         JNE SHORT 00401088                       ; 比较 fubar? 00401075  |.  BE 2A334000   MOV ESI,OFFSET 0040332A                  ; 0040107A  |.  BF 41304000   MOV EDI,OFFSET 00403041                  ;           ASCII "fubar" 0040107F  |.  B9 06000000   MOV ECX,6                                ; 00401084  |.  F3:A6         REPE CMPS BYTE PTR DS:[ESI],BYTE PTR ES: ;            看ZF标志以决定转移与否 00401086  |.  74 19         JE SHORT 004010A1                        ; 00401088  |>  6A 00         PUSH 0                                   ;           /Type = MB_OK|MB_DEFBUTTON1|MB_APPLMODAL 0040108A  |.  68 1F334000   PUSH OFFSET 0040331F                     ;           |Caption = " try again" 0040108F  |.  68 0F334000   PUSH OFFSET 0040330F                     ;           |Text = "no, not really." 00401094  |.  6A 00         PUSH 0                                   ;           |hOwner = NULL 00401096  |.  E8 95000000   CALL            ;           /USER32.MessageBoxA 0040109B  |.  33C0          XOR EAX,EAX                              ; 0040109D  |.  C9            LEAVE                                    ; 0040109E  |.  C2 1000       RETN 10                                  ; [/cpp] 
那好 我们暂且就这样分析 在地址00401066 处F2断点   F9运行! 那此时肯定会弹出对话框  我们随便输入点什么 以”15PB“为例  再点击check! 会在刚刚所设断点处停下来:

img (6)

F8单步走走试试?

img (7)

首先肯定是获取我们输入的字符”15PB“而后 继续F8单步 会发现 下不去了 !! 左下角有提示 :”访问冲突 正在写入到[00401113]....去跳过异常程序“ 首先 根据提示 我们就可以判断”内存访问异常“(这个没有标准 按逆向经验及知识面有各自的判断

【原创】IDA+OD双剑合璧=逆向无敌 - 看雪安全论坛

) 好办 !暴力破解,这个个人最喜欢了 不费脑子!

【原创】IDA+OD双剑合璧=逆向无敌 - 看雪安全论坛

左键选中
代码:
CPU Disasm 地址        十六进制数据            指令                                       Profile  Comments 0040106B      A3 13114000   MOV DWORD PTR DS:[401113],EAX            ;           MOV DWORD PTR DS:[401113],EAX [/cpp] 
  1. 左键单击选中-右键-编辑-填充为NOP(有些OD可以直接DEL)
  2. 左键单击选中-右键-复制所有修改到可执行文件-”忽视所有警告“
  3. 在所弹出窗口-右键-保存文件-确定-重名为”1“(保存在桌面)
我们再点击”1.exe“,再次输入”15pb“  点击check! 依然出错!

img (8)

为什么? 我们再重复 拖入OD: 附件 101838

img (9)

我们看红色选中框.这时估计就会有人提问了 上面不就有吗 为什么留在这儿说 故意充版面? 不不不! 一步一步来  我这篇逆向文章面向大部分人(普通人)  大牛们当然可以一眼定乾坤! 普通人可不一样 所以 我得一点一点来 叙述要通俗易懂 尽量营造出菜鸟思维 如果我直接这样~这样~这样~这样!再这样~那还写什么啊

【原创】IDA+OD双剑合璧=逆向无敌 - 看雪安全论坛


废话不多说 我们分析代码:
代码:
CPU Disasm 地址        十六进制数据            指令                                       Profile  Comments eax与5相比较  00401070    83F8 05         CMP EAX,5                                ; 判断ZF标志位   若zf=0  跳转至地址“00401088”  显然是错的 00401073    75 13           JNE SHORT 00401088                       ; 00401075    BE 2A334000     MOV ESI,OFFSET 0040332A                  ; 0040107A    BF 41304000     MOV EDI,OFFSET 00403041                  ;           ASCII "fubar" ecx 一般做循环比较次数 6? 等等 与上面那个5有什么关系? 字符串自带反斜杠0 如果去掉呢?就是长度5 ! 我们再往下分析 0040107F    B9 06000000     MOV ECX,6                                ; esi与字符串“fubar”相比较    00401084    F3:A6           REPE CMPS BYTE PTR DS:[ESI],BYTE PTR ES: ; JE ? 结果很显然了 00401086    74 19           JE SHORT 004010A1                        ; 00401088    6A 00           PUSH 0                                   ; 0040108A    68 1F334000     PUSH OFFSET 0040331F                     ;           ASCII " try again" 0040108F    68 0F334000     PUSH OFFSET 0040330F                     ;           ASCII "no, not really." 00401094    6A 00           PUSH 0                                   ; 00401096    E8 95000000     CALL            ;           跳转至 USER32.MessageBoxA [/cpp] 
关掉OD 我们用字符串”fubar“去试试  为什么? 你再想想看

【原创】IDA+OD双剑合璧=逆向无敌 - 看雪安全论坛

附件 101839

img (10)

OK ~ 成功!
看到这里估计就会有人说了  就这么点 也想混优秀精华?没什么好看的 哼~! 回帖嘲讽下楼主 再右上角 深藏功与名。
---------------------- 楼主为了保住节操 亦为了不被嘲讽 遂再花点时间

【原创】IDA+OD双剑合璧=逆向无敌 - 看雪安全论坛


那么我们再进入节奏  我们从上面分析得到了那些关键信息?
  1. 内存访问异常!在不可写处写数据“
  2. ”PEID导入表可疑函数:SetUnhandledExceptionFilter:设置异常处理函数“
那么我们把它拖入IDA分析此函数如何?

img (11)

选中函数”SetUnhandledExceptionFilter“回车-主窗口”空格“键

img (12)

我们再左键点击红色框选中处
来到

img (13)

依然 左键点击上图红色框选中处
来到真正的异常处理回调函数

img (14)


我们左键单击此行
代码:
.data:0040334A TopLevelExceptionFilter db ',0        ; DATA XREF: DialogFunc+E1o [/cpp] 
做如下操作: 按”c“键  将数据转换为代码 按”d“键 转换dword类型 可得到:

img (15)

此时 我们看见完整的反汇编代码  可以开始真正的分析了 。

【原创】IDA+OD双剑合璧=逆向无敌 - 看雪安全论坛

我们知道SetUnhandledExceptionFilter是设置异常处理函数 那么 我们自己制作一个demo如何? 那我们又要获得那些信息呢?
  1. 获取异常中断值
  2. 获取esi 即 第一条指令
代码:
.data:0040334E                 push    esi [/cpp] 
说干就干 (ctrl+F5运行)
代码:
long   __stdcall   callback(_EXCEPTION_POINTERS*   pexcp)    {          //异常   printf("%p/n",pexcp->ExceptionRecord->ExceptionCode);     printf("%p/n",pexcp->ContextRecord->Esi);   //ESI辅助分析   getchar();   return   EXCEPTION_EXECUTE_HANDLER;    }
int _tmain(int argc, _TCHAR* argv[]) {   SetUnhandledExceptionFilter(callback);    unsigned ueax,uebx,uecx,uedx,uebp;   __asm  //使用__asm进行内联汇编   {     //使用mov指令将eax寄存器的内容保存到ueax变量     mov ueax, eax         mov uebx, ebx       mov uecx, ecx       mov uedx, edx       mov uebp,ebp   }   printf("eax=%x/tebx=%x/tecx=%x/tedx=%x/nuebp=%x/n", ueax, uebx, uecx, uedx,uebp);   //设置异常   int *f =0;   *f = 9;   system("pause");   return 0; } [/cpp]
来我们回到IDA反汇编代码:
代码:
ta:0040334A                 enter   0, 0 .data:0040334E                 push    esi        ;将结构体压入堆栈 .data:0040334F                 mov     esi, [ebp+arg_0] ; 取结构体EXCEPTION_POINTERS pexcp .data:00403352                 lodsd                   ; 取pexcp->ExceptionRecord  此时esi+4 .data:00403353                 mov     eax, [eax]      ; 将pexcp->ExceptionRecord->ExceptionCode内容给eax .data:00403353                                         ; 即EAX= C0000005 从demo得到 .data:00403355                 and     eax, 0DEADFFh   ; EAX=5 .data:0040335A                 shl     eax, 5          ; EAX=A0 .data:0040335D                 mov     ebx, eax        ; EBX=A0 .data:0040335F                 lea     eax, [eax+402FAEh] ; 40304E  即 magic .data:00403365                 mov     esi, [esi]      ; 取 pexcp->ContextRecord .data:00403367                 mov     [esi+9Ch], eax  ; 取pexcp->ContextRecord+9c 即pexcp->ContextRecord->edi .data:0040336D                 add     eax, 2DCh       ; eax=2ac .data:00403372                 mov     [ebx+esi], eax  ; pexcp->ContextRecord->esi=2ac .data:00403375                 mov     eax, 400FDFh    ; eax=400fdf .data:0040337A                 add     eax, ebx        ; eax=40107f .data:0040337C                 mov     [esi+0B8h], eax ;  pexcp->ContextRecord->esi+b8 .data:0040337C                                         ; 即  pexcp->ContextRecord->eip=40107f 即做完异常处理函数后跳转到地址40107f  .data:00403382                 xor     eax, eax .data:00403384                 dec     eax .data:00403385                 pop     esi [/cpp] 
分析完毕 那么此时根据所分析得到数据回到OD  ctrl+G 地址”40107f“ :

img (16)

得到

img (17)

耶~! 我们分析得到极其有用的三条数据(惯例 红色高亮!)
代码:
CPU Disasm 地址        十六进制数据            指令                                       Profile  Comments 00401073   /75 13           JNE SHORT 00401088                       ; 00401075   |BE 2A334000     MOV ESI,OFFSET 0040332A                  ; 0040107A   |BF 41304000     MOV EDI,OFFSET 00403041                  ;           ASCII "fubar" 0040107F   |B9 06000000     MOV ECX,6                                ; 00401084   |F3:A6           REPE CMPS BYTE PTR DS:[ESI],BYTE PTR ES: ; 00401086   |74 19           JE SHORT 004010A1                        ; 00401088   /6A 00           PUSH 0                                   ; 0040108A    68 1F334000     PUSH OFFSET 0040331F                     ;           ASCII " try again" 0040108F    68 0F334000     PUSH OFFSET 0040330F                     ;           ASCII "no, not really." 00401094    6A 00           PUSH 0                                   ; 00401096    E8 95000000     CALL            ;           跳转至 USER32.MessageBoxA 0040109B    33C0            XOR EAX,EAX                              ; 0040109D    C9              LEAVE                                    ; 0040109E    C2 1000         RETN 10                                  ; 004010A1    68 B90B0000     PUSH 0BB9                                ; 004010A6    FF75 08         PUSH DWORD PTR SS:[EBP+8]                ; 004010A9    E8 76000000     CALL             ;           跳转至 USER32.GetDlgItem [/cpp] 
为什么? 不说~!算是我留的作业吧 不太难

【原创】IDA+OD双剑合璧=逆向无敌 - 看雪安全论坛

 好好思考下

【原创】IDA+OD双剑合璧=逆向无敌 - 看雪安全论坛


我们将它提取出来更好地去分析
代码:
CPU Disasm 地址        十六进制数据            指令                                       Profile  Comments 循环比较5次 (忽视反斜杠0) 0040107F    B9 06000000     MOV ECX,6                                ; 与字符串magic相比较  我们刚刚不是分析出来了么? 00401084    F3:A6           REPE CMPS BYTE PTR DS:[ESI],BYTE PTR ES: ; 跳转至地址“004010A1” 00401086    74 19           JE SHORT 004010A1                        ; [/cpp] 
来 我们把字符串”magic“输入试试

img (18)

成功!
看到这里又会有熟悉IDA的人说了 这傻×(友善地

【原创】IDA+OD双剑合璧=逆向无敌 - 看雪安全论坛

) 不知道可以F5 以及结构体分析么? 我当然知道 

【原创】IDA+OD双剑合璧=逆向无敌 - 看雪安全论坛

  你不觉得经过上面的曲曲折折的分析 自己又不知不觉的提高了么(此话面对菜鸟 也包括我自己 哈哈

【原创】IDA+OD双剑合璧=逆向无敌 - 看雪安全论坛

) ------------------------------ 物尽其用 我们做如下操作: shift+F9 或菜单栏:

img (19)

再 按”INS“ -"ADD STANDARD STRUCTURE"-添加结构体 以”EXCEPTION_POINTERS“ 为例(其实也有用到)

img (20)

再来到异常处理函数 选中指令”无脑“ 按”T“:

img (21)


或直接 F5 得到代码

本文链接:https://www.it72.com/9062.htm

推荐阅读
最新回复 (0)
返回