主页 > 创业  > 

go语言逆向-符号恢复

go语言逆向-符号恢复
背景

IDA7.6以后对go语言编译的二进制程序能够自动恢复符号,获取某样本后放入IDA中发现其存在方法名信息,但是IDA并不能自动恢复符号。

还原符号

.go.buildinfo节区版本信息为unkown 查看.gopclntab节区中,其中magic存在明显异常,正常情况下.gopclntab一般为0xffffff开头 编译go1.21版本.gopclntab的节区如下, 对比样本中的.gopclntab节区,发现明显头信息的magic有问题,尝试修改后再进行反编译。发现IDA能够解析.gopclntab节区头信息,但是符号仍然没有自动还原。 因此我们尝试进行手动解析符号。其中比较重要的字段为如下三个 funcnametab为字符串数组,functab为函数地址偏移和funcInfo偏移组成的结构体 继续看funcinfo构成的结构体信息,第一个字段在该样本中存在明显异常。但是第二个字段表示了函数的名称。 知道了functable的数量,且其中存在函数偏移和符号名称,因此我们可以写idapython脚本自动恢复。

还原脚本

最终idapython的还原脚本如下:

import ida_segment import ida_bytes def readstr(address): raw_data = ida_bytes.get_bytes(address, 100) if raw_data: string = b"" for byte in raw_data: if byte == 0: # 检测到 \x00 break string += bytes([byte]) return string seg = ida_segment.get_first_seg() start_addr = 0 end_addr = 0 while seg: # 获取段名称 name = ida_segment.get_segm_name(seg) print(name) if name == ".gopclntab": start_addr = seg.start_ea # 起始地址 end_addr = seg.end_ea # 结束地址 print(f".gopclntab found at: {hex(start_addr)} - {hex(end_addr)}") break seg = ida_segment.get_next_seg(seg.start_ea) if not seg: print(".gopclntab section not found.") funcnamenum = ida_bytes.get_dword(start_addr+8) funcnametab = ida_bytes.get_dword(start_addr+0x20) + start_addr functabaddr = ida_bytes.get_dword(start_addr+0x40) + start_addr funcaddrbase = ida_bytes.get_dword(start_addr+0x18) print(hex(funcnamenum)) for i in range (funcnamenum): print(i) struct_FUNCTAB_ENTRY118_addr = functabaddr + 8 * i renameaddr = ida_bytes.get_dword(struct_FUNCTAB_ENTRY118_addr) + funcaddrbase struct_FUNCINFO120_addr = ida_bytes.get_dword(struct_FUNCTAB_ENTRY118_addr + 4) + functabaddr name_offset = ida_bytes.get_dword(struct_FUNCINFO120_addr + 4) + funcnametab renamename = readstr(name_offset) ida_bytes.del_items(renameaddr, ida_bytes.DELIT_SIMPLE, 4) ida_funcs.add_func(renameaddr) ida_name.set_name(renameaddr, renamename.decode('utf-8'), ida_name.SN_NOWARN) print(hex(renameaddr),renamename)
标签:

go语言逆向-符号恢复由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“go语言逆向-符号恢复