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的还原脚本如下:

python 复制代码
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)
相关推荐
lularible17 分钟前
HSM技术精讲(3.8):证书对象——数字世界的“身份证明“
安全·开源·嵌入式·汽车电子·hsm
德迅--文琪2 小时前
筑牢主机安全最后一公里,德迅卫士构建全维度智能防护屏障
安全
+wacyltd大模型备案算法备案2 小时前
大模型评估测试题库怎么建?风险分类、测试样本的完整方法
人工智能·算法·安全·分类·大模型·大模型备案·大模型上线登记
zenithdev13 小时前
fastcache:为 Go 设计的低 GC 压力内存缓存
开发语言·其他·缓存·golang
志栋智能5 小时前
超自动化安全如何优化安全运营成本?
人工智能·安全·自动化
jieyucx5 小时前
【系统安全铁律】解密 Linux 权限三色数字密码:chmod 最小化赋权与生产环境避坑指南
linux·安全·系统安全·权限·chmod·777
xiaohaiAIgeo6 小时前
【2026年】生物安全实验室P2/P3通风系统设计要点与合规要求
安全·科普知识
猫头虎6 小时前
城市级IP代理:赋能全球企业本地化数字增长与安全合规 | Decodo 德口多
网络·python·网络协议·tcp/ip·安全·pandas·pip
HackTwoHub7 小时前
某单位 CMS 完整渗透链、SQL 注入→后台拿权→绕过宝塔 Waf 上线 shell
数据库·人工智能·sql·安全·网络安全·系统安全·安全架构
山东穆柯传感器7 小时前
车间安监验收不通过?安全地毯选对厂家一次达标
安全