首页
社区
课程
招聘
[原创]二进制漏洞挖掘之插桩、静态分析、调试、模糊测试辨析之二插桩DynamoRIO
发表于: 2019-1-16 20:27 5802

[原创]二进制漏洞挖掘之插桩、静态分析、调试、模糊测试辨析之二插桩DynamoRIO

2019-1-16 20:27
5802

DynamoRIO插桩分析工具


1、几个概念


Ø框架:了解客户端的地位、作用;目标程序、客户端与dynamoRIO三者间的交互;看说明文档

Ø元指令:可能是不影响程序执行的指令,如仅用于观察目标程序的信息的指令。

ØClient transparency:

ØClean call:一种插入指令到目标程序中执行的方式,或者是一种程序代码调用方式

ØTrace:dr_register_trace_event();跟踪基本块;例10;看pin更清楚;

ØNudge:推进;将数据传到进程;dr_register_nudge_event();dr_nudge_process()

Ø插桩的4个阶段:2是应用分析阶段;3是插桩插入阶段

Ø基本块:从pin的说明文档中看

ØAnnotation:目标程序与客户端或dynamorio通信

ØCommunication:Dynamorio与进程通信

Ø两个时间点(transformation timeexecution time):看说明文档


2、基本功能


2.1查看dynamorio能提供的API


ØMemory allocation

ØThread_local storage

ØThread_local stack separate from the application stack

ØSimple mutexes

ØFile creation, reading, and writing

ØAddress space querying

ØApplication module iterator

ØProcessor feature identification

ØExtra thread creation

ØSymbol lookup

ØAuxiliary library loading


2.2从文档附带的sample看


Ø基本块数量统计、基本块大小统计、

Ø创建和使用DR的缓冲区?(例1)

Ø基本块的指令分析:识别基本块首指令;取得基本块的下一条指令;遍历基本块的指令

Ø互斥对象的使用

Ø条件分支分析

Ø插入指令

Ø区别线程的处理

Ø不同指令类型的分析判定(间接调用和直接调用)

Ø计算除法指令的个数

Ø指令修改inc2add,创建指令;创建操作码,操作数。

ØTrace的分析判定

Ø执行指令条数的统计

Ø收集动态指令的trace且dump出去

Ø符号信息处理

Ødump memory例15;16

Ø内存操作分析指令instr_reads_memory()、instr_num_srcs()、opnd_is_memory_reference()

Ø区别库文件和执行程序文件。例17、例18

Ø模块地址范围的分析例18

Ø创建指令

Ø监控系统调用函数。例23


3、事件分析


3.1从说明文档看


ØBasic block and trace creation or deletion( dr_register_bb_event(), dr_register_trace_event(), dr_register_delete_event())

ØProcess initialization and exit(dr_client_main(), dr_register_exit_event())

ØThread initialization and exit(dr_register_thread_init_event(), dr_register_thread_exit_event())

ØFork child initialization(Linux_only); meant to be used for re-initialization of data structures and creation of new log files(dr_register_fork_init_event())

ØApplication library load and unload(dr_register_module_load_event(), dr_register_module_unload_event())

ØApplication fault or exception( signal on linux ) (dr_register_exception_event(), dr_register_signal_event())

ØSystem call interception: pre-system call, post-system call, and system call filtering by number( dr_register_pre_syscall_event(), dr_register_post_syscall_event(), dr_register_filter_syscall_event())

ØSignalinterception(linux-only)(dr_register_signal_event())

ØNudge received – (dr_register_nudge_event())


3.2从示例看


Ø线程初始化

Ø线程退出

Ø进程退出dr_register_exit_event()

Ødrmgr_register_bb_instrumentation_event()基本块事件:针对单个基本块分析(第2阶段);针对基本块的每个指令(第3阶段)。

Ødrmgr_register_bb_app2app_event()好像是插桩的第一阶段(inc2add)

Ødr_register_bb_event()

Ødr_register_delete_event()

Ødr_register_end_trace_event()

Ødr_register_trace_event()

Ødr_register_module_load_event()

Ødr_register_module_unload_event()

Ødr_register_restore_state_event()

Ødr_register_restore_state_ex_event()


4、内存管理应用


4.1直接的缓冲区分配处理(例一p1bbbuf.c)


drx_buf_create_circular_buffer()

drx_buf_insert_load_buf_ptr()

drx_buf_insert _buf_store ()

drx_buf_insert_update_buf_ptr()

上述缓冲区使用前要调用drreg_reserve_register()


4.2全局静态区变量


4.3线程TLS用法


drmgr_get_tls_field()

drmgr_set_tls_field()

drmgr_register_tls_field()

drmgr_unregister_tls_field()

drmgr_insert_read_tls_field()

dr_raw_tls_calloc()

dr_raw_tls_cfree()

dr_raw_mem_alloc()

例12 instrace_simple.c中有多种内存使用方法


4.4线程内存分配


dr_thread_alloc()可用于tlsp12

dr_global_alloc()(inline.c)

dr_nonheap_alloc()


5、函数分析


Ø判断基本块的首指令instrlist_first_app()、drmgr_is_first_instr()

Ø取得fragment的app_pc

Ø插入元指令?(例二p3bbcount.c)

uinstrlist_meta_preinsert()


上述指令前要使用drreg_reserve_aflags()?

Ødrreg_are_aflags_dead()?什么函数?

ØClean call指令:dr_insert_clean_call()

Ø条件分支分析:instr_is_cbr();找出条件分支的状态、目标指令instr_get_branch_target_pc()、dr_insert_cbr_instrumentation_ex()、instr_is_mbr()

Ø指令类型判定:instr_is_call_direct()/ instr_is_call_indirect()/ instr_is_return

Ø取得指令的源操作数instr_get_src();取得指令的目标操作码:instr_get_opcode()

Ø模块操作指令(inscount.c)

udr_free_module_data()

udr_lookup_module()

udr_get_main_module()

udr_module_preferred_name()

udr_loopup_module_by_name()

Ødr_get_dr_segment_base()

Ødr_get_current_drcontext()

Ødr_get_mcontext()

Øinstrlist_create()

Øinstr_reads_memory()、instr_writes_memory()

Ødr_get_proc_address();

Ødrmgr_decode_sysnum_from_wrapper()

Ø系统调用函数处理

uDr_syscall_get_param()

uDr_syscall_set_param()

uDr_syscall_set_result_ex()

uDr_syscall_set_sysnum()

uDr_syscall_invoke_another()

Dr_set_mcontext()

Dr_get_mcontext()


6、状态


保持寄存器的状态?drreg_reserve_register()

保存标志寄存器状态drreg_reserve_aflags()

说明文档关于:状态的保存restore_state()restore_state_ex()dr_register_restore_state_event()dr_register_restore_state_ex_event();

状态的转换state translation


告一段落,现在要看模糊测试了。其实DynamoRIO早看了,只是没时间整理。关键是决心!!!


插桩分析就那些东东,看似平淡,还是要根据需求才能做出有价值的东西。可能这就是工程实践的魅力。不过,插桩分析还是没有找到我想要的东西,可能还是要从二进制代码静态分析来找。


几个问题:

1、二进制层面动态代码有那几类,动到什么程度?

2、应用逻辑层的信息在插桩中能找到吗?

3、函数信息、循环信息在插桩中找不到啊?


不知是否有有缘人回答?其实这些的深入讨论是很有趣的。


[课程]Linux pwn 探索篇!

最后于 2019-1-17 16:11 被CCkicker编辑 ,原因: 格式调整优化
收藏
免费 2
支持
分享
最新回复 (1)
雪    币: 11596
活跃值: (6949)
能力值: ( LV13,RANK:550 )
在线值:
发帖
回帖
粉丝
2
我也在研究rio,加我微信一起讨论下cbwang505
2021-3-19 10:47
0
游客
登录 | 注册 方可回帖
返回
//