Golang call conversion (Golang 调用规约)
0x00 前言
在逆向 Golang 程序时,发现调用约定和平时遇到的 C/C++ 不太一样,ida 反编译效果也不咋样,于是研究一番。
本次分析的 go 版本为 go1.19.3:
|
|
0x01 寄存器还是栈
Go internal ABI specification [2] 中给出了函数调用时参数和返回值传递的规范,总的来说:使用寄存器和栈混合放置的方式,优先使用寄存器,不适用的情况使用栈。
在逆向 Golang 程序时,发现调用约定和平时遇到的 C/C++ 不太一样,ida 反编译效果也不咋样,于是研究一番。
本次分析的 go 版本为 go1.19.3:
|
|
Go internal ABI specification [2] 中给出了函数调用时参数和返回值传递的规范,总的来说:使用寄存器和栈混合放置的方式,优先使用寄存器,不适用的情况使用栈。
最近学了点 eBPF 相关的东西,写了 github-hosts-ebpf 这个项目练手, 项目基于 aya-rs 开发,功能是通过 XDP 解析 DNS 响应包,当发现 DNS 解析 GITHUB 相关域名时,修改 DNS 响应包中的 A 记录为加速 IP 地址。你可能要问了,为什么不直接改 hosts 文件?emmm, just for fun :)
在逆向工程中,常常会遇到加/解密函数,运气好的话发现是常见算法,找个在线工具直接解就好;运气不好的话就得慢慢厘清算法细节,并尝试写脚本还原算法。之前翻四哥 scz 博客 [1] 的时候发现了 flare-emu 这个模拟执行工具,留了个印象,最近逆向时有个解密字符串的需求,就翻出这个工具试用了一下,体验很棒,这里整理了一些基础用法分享给大家。
断点打印 eax 的值,然后继续
|
|
断点打印 eax 和 poi(ebp-0x35c) 的值,然后继续
|
|
如果 eax 满足条件,则断下,否则继续运行
|
|