欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Go语言逆向去符号信息还原

来源:本站整理 作者:佚名 时间:2018-08-03 TAG: 我要投稿

一、实例
在国内很多朋友都觉得golang的逆向分析很难,其实不然,和其他编程语言相比,go语言的函数太多。但是如果go语言不去符号话,则觉得和.net差不多难度(还是未混淆的)。本文就是要解决golang逆向过程中所遇到去符号化问题。
图1是没有去掉符号信息的反汇编,可以看到GOLANG运行时的各函数名 , 第二张图是去掉符号信息的反汇编,GOLANG运行时的函数名都没了(样本准备,最好是在linux下自己编译一个helloworld用于分析对比)。

图1 go语言没有去掉符号信息的反汇编

图2 go语言去掉符号信息的反汇编
二、分析
这里先感谢https://rednaga.io/2016/09/21/reversing_go_binaries_like_a_pro/链接的作者所提供的的脚本和资料(Reversing GO binaries like a pro)。其提供了golang_loader_assist.py脚本可用于还原符号信息。不过该脚本并不能直接用于windows环境下编译的go程序。在golang_loader_assist.py代码中使用了.gopclntab, .gopclntab 是一个非常重要的segments 。在windows环境下去符号化编译go程序逆向分析时不包含该segments。如图3所示:

图3  windows环境下去符号化编译go程序无.gopclntab
图4 linux下没有去除符号信息的go。

图4  含有.gopclntab
因此在他人的肩膀上,对于windows环境go语言的去符号化还原,核心就是要确认.gopclntab的位置:
1、首先旅一下golang_loader_assist.py代码的流程,之后再说windows环境下的go符号还原。
先将golang_loader_assist.py中核心代码贴出,如代码1所示:
Line 1: def renamer_init():
Line 2:     renamed = 0
Line 3:     gopclntab =idaapi.get_segm_by_name(‘.gopclntab’)
Line 4:     ifgopclntab is not None:
Line 5:         # Skip unimportant header and gotosection size
Line 6:         addr = gopclntab.startEA + 16
Line 7:         size, addr_size = create_pointer(addr)
Line 8:         addr += addr_size
Line 9:         # Unsure if this end is correct
Line 10:         early_end = addr + (size * addr_size *2)
Line 11:         while addr
Line 12:             func_offset, addr_size =create_pointer(addr)
Line 13:             name_offset,addr_size = create_pointer(addr + addr_size)
Line 14:             addr += addr_size * 2
Line 15:             func_name_addr = Dword(name_offset +gopclntab.startEA + addr_size)                                                                                       +gopclntab.startEA
Line 16:             func_name =GetString(func_name_addr)
Line 17:             MakeStr(func_name_addr,func_name_addr + len(func_name))
Line 18:             appended = clean_func_name =clean_function_name(func_name)
Line 19:             debug(‘Going to remap function at0x%x with %s – cleaned up as %s’ % (func_offset, func_name, clean_func_name))
Line 20:             ifidaapi.get_func_name(func_offset) is not None:
Line 21:                 if MakeName(func_offset,clean_func_name):
Line 22:                     renamed += 1

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载