OD的使用
Ox01 动态分析
1. Reverse000.exe
-
找main函数
-
- 进入OEP,发现2个CALL
- 第一个一般为Check函数
- 第二个则为系统main函数
- 进入后找 Debug版本的push,push,push,call
-
进入main,运行程序
-
- 发现失败时会返回
- 则手动将函数退出
- 强跳至函数入口处
- 手动实现循环函数
-
找关键跳,向上观察关键判断
-
- 分析关键判断处为EAX
- 表示为上一个函数返回值
- 断点至函数入口
- 进入关键函数,发现有判断
- 断点至判断,得出结果
- " i love this game"
- PS:结果为0x20开头,表示空格
- END
2. Reverse001.exe
-
找到main函数,分析代码
-
找到关键跳,向上找判断
-
- 发现失败则弹窗
- 弹窗后直接调用pause退出
- 那我们在pause加jmp强跳
- 实现手动循环代码
-
实现循环后设置断点在关键跳位置
-
- 查看寄存器内存状态
- 发现EDX=我们输入的字符
- 则判断EDX==0x32,查表得2
- 则表示密码的值为2
-
尝试输入2A,断到关键跳
-
- ECX为我们第2个输入的字符
- 比对0x73=s
- 则表示第二个字符为s
- 连起来则表示 "2s"
-
多次判断关键跳
-
- 得到字符串"2s83gr3ky3kw3hdq"
- 输入则弹窗成功。
- END
3. Reverse002.exe
-
找main函数
-
- 发现大体流程与上文相似
- 如上文思路手动添加循环
- PS:call实际上会压入1个返回值,需要手动释放一下
- 虽然上文01.exe中没释放好像也没崩溃,这次我们将它释放
-
找关键跳,下断
-
- 发现第一处关键处为不等于0x33则跳
- 猜测代码是将第一个字符做判断,如果是0x33则失败
-
第二次关键跳
-
- 按F8则发现执行到928C4B处的二次关键跳
- 此时代码为 EDX==0x31则跳
- 那么分析可得处第一个字符为0x31=1
- 为什么是第一个字符呢?
- 首先我们断点到928C4B处,发现EDX还是我们
- 输入的第一个字符,表示没有变
- 其次,观察上文代码,EDX赋值时,ECX为0所以并没有后移
-
第三次关键跳
-
- 步骤如第一次跳一致,发现是不等于0x31则跳
-
第四次关键跳
-
- 步骤如第二次跳一支,标识第二个字符为0x73(s)
-
后续关键跳如上
-
- 得出结果为"1sh6gr6ky6kw6hdq"
-
END
4. Reverse003.exe
-
找main函数
-
- 发现弹窗逻辑如上,手动添加循环强跳
-
找关键跳
-
- 00528C11处有jge跳,大于或等于7时跳
- 将16进制表设置成 ebp-8C
- 会发现,此处数值正好为字符串长
- 则可以猜测上两行代码为调用求长函数
- 分析可得 密码长度≥7
-
第二处关键跳
-
- 断点至00528C56,发现条件为ecx≠68则跳
- 将16进制区设置为ebp+eax-81,发现字符串为7
- 猜测此处判断为字符串结尾是否为 h
- 再次尝试字符串 "123456h"
-
第三处跳
-
- 断点至此,发现为ecx≠edx则跳
- 查看右侧寄存器表,猜测此处判断为
- 第一个字符和末尾字符不相等则失败
- 则可继续尝试字符串"h23456h"
-
第四处跳
-
- 断点至此,发现ecx为第二个字符,且≠1则跳
- 继续尝试字符串"h13456h"
-
关键跳5
-
- 断点至此,发现逻辑如上,判断ecx、eax
- 发现数据为第2位和倒数第2位字符串比较
- 继续尝试"h13451h"
-
关键跳6
-
- 如上逻辑可得第三位字符串为2
- 继续尝试"h123421h"
-
关键跳7、8、9、10
-
- 逻辑同上,可得出字符串为回环文
- 尝试字符串"h123j321h"
- 得出结果
-
END
5. Reverse004.exe
-
找main函数
-
- 逻辑如上,如果弹窗失败则退出
- 手动设置循环强跳,防止退出
- PS:上文使用add esp,0x04修复栈
- 此处使用pop修复栈
-
找关键跳
-
- 尝试输入用户名和密码,逐步分析
- 先尝试断点至MessageBoxW返回处,查找是哪个分支调用了退出
- 得到分支,下断最近的关键跳
- 再次输入用户名密码,可得ecx=用户名第一位字符串=h
- 再次尝试"hABC","1234"
-
关键跳2、3、4、5、6、7
-
- 在上部基础上断点至 关键跳1,按F8逐步执行
- 执行至je时,发现此处为关键跳2,条件为ecx==8
- 快速浏览下文内容,可连续得出用户名为跳前判断的值
- 尝试用户名"h8g2ywh","123456"
-
关键跳8
-
- 断点至此,比较条件edx≠eax则跳
- 浏览右上角寄存器值,发现比较为a≠1
- 1是我们的密码第一位,那a呢?
- 向上查找发现:有代码将用户名第一位赋值为a
- 尝试"h8g2ywh","a23456"
-
关键跳9、10、
-
- 断点至此,发现比较了ecx≠8
- 按关键跳8分析可知此处的8来自用户名的第二位
- 则无需着力分析,查看下文发现有关键跳10
- 表示第二位密码为3,查看下文,相同逻辑得出
- 尝试"h8g2ywh","a3ory"
- END
6. Reverse005.exe
-
找main函数
-
- 手动修改循环,防止退出
- 本次修改system("pause");函数入口点
-
找关键跳
-
- 如上所示,断点在MessageBoxW返回处,得到分支
- 断点至关键跳1,得到用户名第一位=a
-
关键跳2、3、4、5、6、7
-
- 同一逻辑得出用户名“a16slea”
- x64dbg,按G可显示图标
-
关键跳8
-
- 得到用户名后,则进入密码判断
- 在关键跳7处按F8得到关键跳8
- 分析可得密码第一位=b
-
关键跳9、10、11
-
- 相同逻辑可得密码"b3or"
-
END
7. Reverse006.exe
-
找main函数
-
- 同上设置手动循环,防止退出
- 通过system("pause");返回地址得出分支,下断
-
关键函数1
-
- 压入了我们输入的字符串
- 断点至关键跳时,查看eax返回值为我们密码的长
- jae为高于等于则短跳,分析可得密码长≥6。
-
关键跳2
-
- 由关键跳1可得关键跳2为je
- 分析可得密码第一位=a
-
关键跳3-10
-
- 同逻辑可得密码"a16slejwf"
- PS:注意多次循环,才跳出
- END
8. Reverse007.exe
-
找main函数
-
- 同上设置手动循环,防止退出
- 设置system("pause");断点,得到分支
-
关键跳1-6
-
- 通过上文逻辑可得用户名"12gel4"
-
通过下文可直接分析处密码为"15pb"
- END
9. Reverse008.exe
-
找main函数
-
找关键字,发现
-
- 用户名为"15pb"
- 密码为"ddd"
- END
Ox02 MFC分析
- MFCPj000.exe
- MFCPj001.exe
- MFCPj002.exe
- MFCPj003.exe
- 开动脑筋.exe