默小白 发表于 2019-5-2 10:08

反-反汇编patch学习(三)

转自:https://xz.aliyun.com/t/4972

前两篇文章介绍了两种加花的方法

1. 用`call $+5`等技巧获得当前EIP,并跳转到指令中间
2. 子函数劫持父函数流程

本文介绍一些更复杂的`jxx`,各种迷惑反汇编引擎的花式`patch`技巧

# 失败的尝试

先吐槽一下,`jz`&`jnz`跳转到同样的地址,形如

!(https://xzfile.aliyuncs.com/media/upload/picture/20190427111117-1fd0ba62-689a-1.png)

这个技巧根本就对抗不了IDA的反汇编引擎,**线性扫描算法**和**递归下降算法**已经有所了解,但是各种资料都会提到这个做法,我这里尝试了根本就没用,不知道是不是我的打开方式不对

除非`jz`&`jnz`又跳转到之前提过的`EB`花指令上,但这也没有什么新意

# jmp到jmp+1

首先我们在一堆`nop`里`patch EB FF`,效果如下

!(https://xzfile.aliyuncs.com/media/upload/picture/20190427111132-2873ed60-689a-1.png)

jmp的指令位于地址`0x140001018`,而跳转到的指令是`0x140001019`,跳转到了**jmp指令中间**

接下来我们利用`FF`做一些手脚,比如改成序列`EB FF C0`

注意到`FF C0`表示的是`inc eax`

再在之后添加`FF C8`,也就是`dec eax`

IDA中如图

!(https://xzfile.aliyuncs.com/media/upload/picture/20190427111138-2bf419f6-689a-1.png)

> 这里我手动把`0xEB`看作了数据,但实际上这样会导致IDA的栈平衡分析失败

## 动态调试

这样的实际跳转流程是:

1. jmp => jmp+1

!(https://xzfile.aliyuncs.com/media/upload/picture/20190427111143-2f28946c-689a-1.png)

1. inc eax
2. dec eax

!(https://xzfile.aliyuncs.com/media/upload/picture/20190427111151-33c8dc66-689a-1.png)

可以看到,动态调试时会暴露花指令所有的细节,但是想让IDA F5就不像之前按一下`d`视作数据一样了

如果把地址`jmp+1`看作代码,那么一定会破坏原来的`jmp`指令,似乎陷入了尴尬的境地...

!(https://xzfile.aliyuncs.com/media/upload/picture/20190427111157-372050ba-689a-1.png)

> 不过本程序因为只是单一技巧的示例,我们人工分析后发现这三条指令其实什么也没干
>
> 把原先的`EB FF C0`直接`nop`三连即可

# 更复杂的布局

1. 先`mov ax,05EBH`,再`XOR eax,eax`,一般来说不会有什么影响,只是清零了EAX

   其中有一个`EB`,是我们布局的关键

2. 再`patch 74 FA`,相当于`jz jz-6`,跳转到刚才的`EB`上,如图

!(https://xzfile.aliyuncs.com/media/upload/picture/20190427111212-400a101c-689a-1.png)

把`0x140001005+2`看作代码

!(https://xzfile.aliyuncs.com/media/upload/picture/20190427111217-4389601c-689a-1.png)

和刚才一样,这里简单的按`d`识别数据会破坏`jmp`指令

1. 把`0x14000100D`的指令再改成迷惑反汇编器的`EB`

## 动态调试

`patch`好之后,用IDA重新打开,画风很诡异

!(https://xzfile.aliyuncs.com/media/upload/picture/20190427111231-4bd7f5d0-689a-1.png)

在这里下断点后

!(https://xzfile.aliyuncs.com/media/upload/picture/20190427111237-4f4d0f52-689a-1.png)

跳转到`0x7FF6466B1007`

!(https://xzfile.aliyuncs.com/media/upload/picture/20190427111243-53187e1e-689a-1.png)

再按一下`c`,识别成代码,跳转到原执行流`EB 05`也就是跳转到`下一条指令地址 + 5`的地址

!(https://xzfile.aliyuncs.com/media/upload/picture/20190427111251-5760942a-689a-1.png)

## 去花

因为没有加反调试,动调不难发现花指令的执行逻辑,直接`nop`N连即可

用`IDAPython`的`patch`代码如下

```
def NopBytes(start, length):   
    for i in range(0, length):   
      PatchByte(start + i, 0x90)   
    MakeCode(start)
NopBytes(addr, n)
```

# 补充

> 一般花指令都是有规律可以找的,找到以后`nop`即可

写到这里,在想有没有简单`nop`不能轻松处理的,比如本文提到的会破坏原先的`jmp`

如果程序中本来就有合适的`jmp`系列指令,比如`EB xxx`,跳转到原程序流程上,再根据这段偏移构造我们自己的代码块,可能会稍微复杂一些,因为不能直接把必要的原程序直接`nop`,不过应该也差别不大

c66d88 发表于 2019-5-3 14:11

楼主,你的教程都到3了,你能不能把前1和2的教程链接也贴在3的下面,这样就方面我们直接打开查看了,不然的话,都找不到你前两教程

hahahunqiu 发表于 2019-5-2 17:32

感谢分享,加分了啊!

zziapyk123 发表于 2019-5-2 19:41

厉害,厉害了

zhongjiezhe 发表于 2019-5-3 16:38

有心得啊,真好

l1679668663 发表于 2019-5-3 18:51

学习学习   感谢分享

17355849767 发表于 2019-5-4 10:50

这个比较适合新手学习下,很有价值

王宇 发表于 2019-5-4 18:59

感谢分享,支持一下

rickw 发表于 2019-5-4 20:02

谢谢分享。

gujun666 发表于 2019-5-4 20:32

感谢分享!!!
页: [1] 2
查看完整版本: 反-反汇编patch学习(三)