简单逆向分析1

程序效果

输入一串字符串 然后输出key right或者error

1

内部肯定是进行了判断 因为这里打印了 字符 我们可以直接通过这些关键词 来搜寻到 函数的入口

在od里面

2

3

然后回车进去

4

看到error了 也看到right了 那应该是找对了 然后往上翻 找到函数的入口 F2打上断点 执行到这

5

初步分析 这里定义了5个局部变量

然后add esp在call后面 这应该就是外平栈 cdecl push传参

6

然后看下面这个call push了2次 然后在call的后面 外平栈 0x8 那应该是 只传了这两个参数

7

然后继续F8运行 但运行到call 走不动了 然后程序提示输入 那这个函数应该就是获取输入的值

8

但是通过这里可以发现 是将第一个局部变量的地址传了进去 但前面又是赋值的0 是int型 输入的又是字符串型 对不上啊 前面的5个局部变量又是地址挨着的 那可以猜测 不是5个局部int变量 而是一个char类型的数组 然后将首地址传了进去 这样就对得上了

然后在程序框输入123456 然后执行

9

可以发现 函数执行后 又将数组的第一个地址给了edx 然后push到了 下一个call 因为在call后面是add esp,0x4 那应该就只传了一个参数 就是push的edx

后面的这一个函数我们先不跟进 就先直接执行 然后看看寄存器值的变化

10

发现eax变成了0 因为一般eax是函数的返回值 但也不一定 然后看后面 又用到了eax 那大概率就是返回值了

然后看后面cmp 又和0比较 然后je跳转 直接跳到了error 那如果要返回正确 就要eax返回的值不是0 是其他的或者1

11

je 主要是根据ZF标志寄存器来判断的只要ZF不为1就行 或者直接将je 用 nop填充 也直接执行right

12

13

但是这样没有拿到 正确的key 为了拿到正确的key 我们跟进那个判断的函数

14

发现这个函数push了两个值 一个hello51hook 还有一个从地址取出存到eax里面

ebp+8 就是我们输入的值 也就是函数传参的第一个参数

15

16

通过add esp 0x8 也可以判断出 这个call 接收了2个参数

然后执行完call 发现eax变成的FFFFFFFF 也就是-1

17

然后看后边 test eax eax 与运算 除了0与0 为0 其他的与本身肯定是不为0的 然后jnz跳转 FFFFFF 肯定运算出来不为0 所以是要跳转的

看下面 直接跳转到xor 清空eax 然后就返回0出去了

所以这个函数就相当于判断传入的字符串与hello51hook是否相等 相等肯定返回出去的就是1了

如果相等的话 ZF就会是1 会给eax 1 然后直接执行jmp跳转到下面就返回出去了

18

然后现在正确的key也拿到了 就不用分析了后面


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!