【逆向工具】IDA使用4-控制台逆向分析 Reverse004.exe 获取密码

本文介绍了如何使用逆向工具IDA和OllyDbg(OD)动态分析程序Reverse004.exe以获取密码。通过字符串查找定位到main函数,设置断点,并详细解析了反汇编代码,揭示了密码验证的逻辑。在IDA中通过伪C代码理解逆向过程,展示了如何利用工具分析内存数据和数组比较,最终找出正确的密码【h8y2yw】和ID【a3for】。
摘要由CSDN通过智能技术生成

工具

吾爱破解版本OD、IDA6.8

OD使用-动态分析

OD快捷方式

F2 下断点,也就是指定断点的地址F3加载一个可执行程序,进行调试分析F4程序执行到光标处
F5 缩小、还原当前窗口
F7 单步步入
F8 单步步过
F9 直接运行程序,遇到断点处,程序暂停
Ctrl+F2 重新运行程序到起始处,一般用于重新调试程序
Ctrl+F9 执行到函数返回处,用于跳出函数实现
Alt+F9 执行到用户代码处,用于快速跳出系统函数
Ctrl+G 输入十六进制地址,快速定位到该地址处
+/- 前一个后一个函数

一:找用户入口main函数-字符串查找

根据程序运行时的界面,找字符串关键字

在OD的字符串搜索插件中选择智能搜索

得到字符串进入到用户入口main函数

在printf字符串处F2下一个断点

二、分析反汇编

F9将程序运行起来,程序会在printf输入处停下来

012F8BD8   .  68 883C3601    push Reverse0.01363C88                   ;  please input Name:
012F8BDD   .  E8 B0E7FFFF    call Reverse0.012F7392                   ;  printf函数
012F8BE2   .  83C4 04        add esp,0x4
012F8BE5   .  6A 78          push 0x78
012F8BE7   .  8D45 80        lea eax,dword ptr ss:[ebp-0x80]          ;  name[]数组
012F8BEA   .  50             push eax
012F8BEB   .  68 A03C3601    push Reverse0.01363CA0                   ;  %s
012F8BF0   .  E8 98DDFFFF    call Reverse0.012F698D                   ;  scanf函数
012F8BF5   .  83C4 0C        add esp,0xC
012F8BF8   .  68 1C3F3601    push Reverse0.01363F1C                   ;  please input Id:
012F8BFD   .  E8 90E7FFFF    call Reverse0.012F7392                   ;  printf函数
012F8C02   .  83C4 04        add esp,0x4
012F8C05   .  6A 78          push 0x78
012F8C07   .  8D85 00FFFFFF  lea eax,dword ptr ss:[ebp-0x100]         ;  id[]数组
012F8C0D   .  50             push eax
012F8C0E   .  68 A03C3601    push Reverse0.01363CA0                   ;  %s
012F8C13   .  E8 75DDFFFF    call Reverse0.012F698D                   ;  scanf函数

这里想要查看内存中数据时,可以在OD中选择要查看数据的反汇编指令处-【数据窗口中跟随】-【内存地址】,查看到我们输入的数值。

012F8C28地址处的cmp指令含义是将数组下标索引[0]的元素与0x68对比。
如果相等就执行je指令的跳转,跳到下一条指令处继续比对。

继续往下执行就到达012F8C2D地址处,会弹出一个提示错误信息的MessageBoxW对话框。这里可以将ZF标志位改成1执行跳转或者在跳转的下一个位置设为新的EIP。

第一次CMP对比,反汇编代码注释如下:

012F8C1B   .  B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8C20   .  6BC8 00        imul ecx,eax,0x0                         ;  imul,第三个操作数是乘数,第二个操作数是被乘数,运算结果存放在第一个操作数
012F8C23   .  0FBE540D 80    movsx edx,byte ptr ss:[ebp+ecx-0x80]     ;  取出数组name[0]
012F8C28   .  83FA 68        cmp edx,0x68                             ;  比对H
012F8C2B   .  74 32          je short Reverse0.012F8C5F               ;  ;  如果不相等,密码错误,跳转到012F8C5F处,为了防止它跳转,可以修改zf=1,让它跳转
012F8C2D   .  8BF4           mov esi,esp
012F8C2F   .  6A 00          push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL
012F8C31   .  68 AC3C3601    push Reverse0.01363CAC                   ; |提示
012F8C36   .  68 B43C3601    push Reverse0.01363CB4                   ; |错误
012F8C3B   .  6A 00          push 0x0                                 ; |hOwner = NULL
012F8C3D   .  FF15 DCE13701  call dword ptr ds:[<&USER32.MessageBoxW>>; \MessageBoxW

从第一次cmp edx,0x68对比后je跳转到012F8C5F这个地址。mov操作后,eax等于1,执行shl指令相当于左移1位的计算,反汇编中每左移一位相当于乘以2,左移4位相当于乘以16每右移一位相当于除以2,而数组存储在堆栈的方向是由高地址向低地址进行延伸,012F8C5F至012F8C67的三条指令结合起来的意思就是取值出数组[1]索引的值。

012F8C5F   > \B8 01000000    mov eax,0x1                              ;  eax=00000001
012F8C64   .  c1e0 00        shl eax,0x0                              ;  相当于左移动1位
012F8C67   .  0FBE4C05 80    movsx ecx,byte ptr ss:[ebp+eax-0x80]     ;  取数组name[1]的位置
012F8C6C   .  83F9 38        cmp ecx,0x38
012F8C6F   .  74 32          je short Reverse0.012F8CA3
012F8C71   .  8BF4           mov esi,esp
012F8C73   .  6A 00       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值