本文首发于安全客: https://www.anquanke.com/post/id/218674
书接前文,本文介绍 Go 语言二进制文件逆向的几个 Tips,最后用实际案例演示一个 Go 二进制文件逆向分析的进阶玩法——还原复杂数据结构的 Go 语言定义。
传送门:
- Go二进制文件逆向分析从基础到进阶——综述
- Go二进制文件逆向分析从基础到进阶——MetaInfo、函数符号和源码文件路径列表
- Go二进制文件逆向分析从基础到进阶——数据类型
- Go二进制文件逆向分析从基础到进阶——itab和strings
11. 逆向分析 Tips
11.1 函数的参数与返回值
本系列第一篇《Go二进制文件逆向分析从基础到进阶——综述》中提到过,Go 语言有自己独特的调用约定和栈管理机制,使 C/C++ 二进制文件逆向分析的经验在这里力不从心:Go 语言用的是 continue stack 栈管理机制 ,并且 Go 语言函数中 callee 的栈空间由上层调用函数 caller 来维护,callee 的参数、返回值都由 caller 在栈中预留空间,传入参数和返回值都是通过栈空间里的内存,就难以直观看出哪个是参数、哪个是返回值。详见 The Go low-level calling convention on x86-64 。Go 中函数内存空间布局如下:
那么,在 IDAPro 中打开某个函数的反汇编代码看一看,函数头部一堆 args 中哪些是传入的参数,哪些又是返回的值呢?