首页
社区
课程
招聘
[求助]关于逆向过程中使用fuzzer进行准确性验证的求助
发表于: 2008-11-7 16:48 4094

[求助]关于逆向过程中使用fuzzer进行准确性验证的求助

2008-11-7 16:48
4094
各位大牛,我在逆向一个较大型软件的时候遇到一个问题,以下是问题来源描述:
1、程序比较大,函数比较多,单人不可能完成
2、多人协同完成,对包含很多函数的单个可执行程序进行分块,每人分配一个或者多个函数
3、逆向人员水平有差异,对逆向结果的准确性不好验证和把握
     (1)、如果采用人工审核,工作量太大
     (2)、依靠逆向人员自行把握函数逆向准确性,人为因素太多,不好控制
4、可执行程序的宿主系统非常见系统,没有调试器(调试器只适用于debug版本,对发行版本的可执行文件不可调试)
所以我想利用fuzzer来解决逆向过程中的准确性问题,设想的解决方法如下:

    [*]1  编译逆向人员完成的单个函数,人工设置函数的传入参数。
    [*]2  在调用其他用户函数的地方,对用户函数的返回值进行人工设置。
    [*]3   fuzzer函数的传入参数和其他函数的返回值。
    **********************************************
    以下是fuzzer待逆向程序的部分,难点在这里
    **********************************************
    [*]4  我想实现一个程序,当执行待逆向程序的时候,能够获取到这个待逆向程序中的我们需要fuzzer的函数,只让他执行,并且可以控制函数的传入参数和调用用户函数的返回值,对系统函数不做控制。
    [*]5 对两个程序fuzzer过程中的返回值和关键结点进行监视,对比大量数据,验证逆向的准确性
    [*]6  以下是一个图形示例:

[COLOR="Red"]待逆向可执行程序[/COLOR]
-----------------
|                    |
|                    |
|                    |
|                    |
| _________ |<------函数开头
|                    |
| fuzzer的函数 |
|                    |
|                    |
|                    |
|                    |
|———————|<-----函数结尾
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
____________

[COLOR="Red"]我们要实现的fuzzer程序盒子:[/COLOR]
1、fuzzer盒子要加载上面所示的函数,这个可以通过指定函数开头和结尾地址来确定
2、[COLOR="Red"]难点[/COLOR]
[LIST=1]
[*]1 如何实现fuzzer程序,让他加载指定地址的函数?
[*]2  如何让这个函数执行?
[*]3  这个想法是否可行?
[*]4  有无更加简便的方法来验证逆向结果的准确性?
(因为程序比较大,不可能在全部逆向完成之后再进行验证,这样返工起来会花费大量人力和时间)
[/LIST]





















[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
再次求助。。。
2008-11-8 13:07
0
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
在dubugman上看到Berry老大的一些建议:
1、培训逆向人员,及时交流
***************************
这一点在管理上已经设法解决了,在开发的协同平台上建立知识库,对逆向人员进行培训。
***************************
2.嵌入式的东西,写个对应平台的模拟器模拟,然后写个相应的调试器。
3.如果能有那种hook 机制的话,hook 系统调用,linux 的有这种机制,就是hook syscall,对每个函数输入,输出打印出来
或者替换每个函数的入口,转入你的函数,你打印出参数后在返回回去。
反正都要反汇编原来的程序,在里面插东西,或者写个调试器调它,不能动态调,应该很困难

调试器部分也在设法解决,目前有一个demo,在逆向过程中可以使用,不过不是很友好,这应该不是大问题。

关键还有一点,即便是有调试器,对于逆向成果的审核和准确性验证,还是依赖逆向人员,没有一个准确审核的方法。
如果能“HOOK”目标函数,对目标函数的输入参数做控制,并且打印输出,进一步想,还可以在在函数中加入探针,监视函数的重要节点的状态。
无论程序执行过程中是否覆盖到了这个函数,都能加载他,并按照一定的要求让他执行。
这样的话,就可以对这个函数运行大量数据,和逆向的结果做对比。
因为软件的关键部分在算法上,逆向人员对算法不是很了解,专业人员有不懂逆向。

希望看雪的朋友帮小弟想想办法,谢谢谢谢
2008-11-10 13:12
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
膜拜大牛

说点自己的想法
参出目标环境是非常紧要的,但大范围逆向时动态调试却不是非常紧要了,用接近完整且容易查询的文档资料就可以极好的代替。

最重要的该是相关的结构,那些结构必须有了解,不然完全是乌黑乱摸。
比如目标环境的主要系统结构、常见库的特征、目标程序的大概架构等环境。

逆向的结果正确否的验证方法可以简单的用hook原程序,用逆出的code代替执行试试。嗨嗨,自己喜欢直接了当的方法,可能效率不佳,
2008-11-10 16:43
0
游客
登录 | 注册 方可回帖
返回
//