Learn Learn Go Reverse

news/2025/2/7 20:17:06/文章来源:https://www.cnblogs.com/Un1corn/p/18681611

根据做题学习

[i春秋ezgo]

  1. Go栈扩容的逻辑,这里无需关注。
    img
    具体汇编代码
    img
  2. 输入函数与输出函数
    img

系统学习go reverse

参考文章: https://forum.butian.net/share/1874

Go基础

见 https://forum.butian.net/share/1874

查看Go版本

//一、查看版本号
go version xx.exe
//二、查看地址以及依赖库
go version -m xxx.exe

如果go版本较低可以尝试脚本还原符号表

还原符号表

工具

都是下载好直接用IDA加载脚本就好了,不需要放在插件文件夹里

IDAGolangHelper(idaapi变了,不支持ida8.3)
https://github.com/sibears/IDAGolangHelper

golang_loader_assist
https://rednaga.io/2016/09/21/reversing_go_binaries_like_a_pro/
https://github.com/strazzere/golang_loader_assist/

go_parser(感觉最好用,支持高版本go,ida8.3,但不支持9.0)
https://github.com/0xjiayu/go_parser

IDA加载go_parser.py即可,效果很好,如果有问题注意文件或者项目路径不包含中文试试

go语言逆向的难点

go语言逆向的难点主要分为三点:独特而复杂的数据类型;独特的调用约定和栈结构,多返回值机制;全静态链接构建。

全静态链接构建

Go 语言的编译工具链会全静态链接构建二进制文件,把标准库函数和第三方 package 全部做了静态编译,再加上 Go 二进制文件中还打包进去了 runtime 和 GC(Garbage Collection,垃圾回收) 模块代码,所以即使做了 strip 处理( go build -ldflags "-s -w" ),生成的二进制文件体积仍然很大。在反汇编工具中打开 Go 语言二进制文件,可以看到里面包含动辄几千个函数。使得对 Go 二进制文件的分析,无论是静态逆向还是动态调式分析,都比分析普通的二进制程序要困难很多。

独特的函数调用约定、栈结构和多返回值机制

Go 语言用的是 continue stack 栈管理机制 ,并且 Go 语言函数中 callee 的栈空间由 caller 来维护,callee 的参数、返回值都由 caller 在栈中预留空间,就难以直观看出哪个是参数、哪个是返回值。

具体调用关系: https://forum.butian.net/share/1874

独特而复杂的数据类型

Go 语言内置一些复杂的数据类型,并支持类型的组合与方法绑定,这些复杂数据类型在汇编层面有独特的表示方式和用法。比如 Go 二进制文件中的 string 数据不是传统的以 0x00 结尾的 C-String,而是用 (StartAddress, Length) 两个元素表示一个 string 数据;这样的话,在汇编代码中看,给一个函数传一个 string 类型的参数,其实要传两个值;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/880204.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Learn Learn Android Reverse

安卓基础 NDK开发 jni调用什么是jni?jni是Java Native lnterface的缩写。从java1.1开始,jni标准成为Java平台的一部分,允许Java代码和其他语言写的代码进行交互GetStringUTFChars();将java字符串转换为c字符串.java的字符串在虚拟机中,通过硬编码调用,cstring在内存中.env-&g…

2016蓝桥杯省赛B组

2016蓝桥杯省赛B组 1.煤球数目#include<bits/stdc++.h>using namespace std;int dp[200];int main(){ int sum=0; for(int i=1;i<=100;i++){ dp[i]=dp[i-1]+i; sum+=dp[i]; } cout<<sum; return 0;} 思路: 每一层煤球个数 0+1-&g…

css3手册

布局浮动:做文字环绕效果 弹性盒:单行或单列布局 网格:多行多列布局 弹性盒详细文档见MDN 弹性盒小游戏生成弹性容器和弹性项目默认情况下,弹性项目沿着主轴依次排列,侧轴拉伸 更改方向 通过flex-direction可更改主轴方向主轴排列 通过justify-content属性,可以影响主轴的…

CNN

具体在第五次汇报卷积神经网络是多层感知机(MLP)的变种。卷积神经网络(Convolutional Neural Networks)是一种包含卷积计算且具有深度结构的前馈神经网络,CNN具有表征学习的能力,能够按阶层对输入数据进行平移不变分类。CNN的设计灵感来源于动物视觉系统分级处理信息的能力…

LSTM(Long Short-Term Memory)长短时记忆结构

随着RNN在长序列处理中的应用深入,发现了其难以捕捉长距离依赖的问题。LSTM是传统RNN的变体,与经典RNN相比能够有效捕捉长序列之间的语义关联,通过引入了“记忆单元”(Memory Cell)和“门控机制”来控制信息的流动,解决了标准RNN中梯度消失和梯度爆炸的问题。其核心结构可…

MDB2PPT_v2.0 mdb数据转换为PPT

前言: 本软件原名“DataToPowerPoint”,已有将近20年的历史,目的是方便将mdb数据库中的数据导出为ppt进行学习或讲座。2007-9-29曾发布于“网上读书园地”,原先为共享软件,未注册版本有功能限制,如:至多输出30条数据、不能使用高级功能。近期对软件界面的布局等作了一些…

2.7 完成剩余表

今天完成了作业中所有表的建立,还剩余历史查询功能计划明天完成所有内容,并进行测试 今天还通过视频进一步学习了javaweb的知识

RNN

一.RNN介绍在学习LSTM之前,得先学习RNN。RNN实际上就是一个带有记忆的时间序列的预测模型。RNN的基本结构包括输入层、隐藏层和输出层。在RNN中,输入序列被分成多个时间步,每一个时间步都对应于序列中的一个元素。每个时间步更新一个隐藏状态(Hidden State),该状态不仅接…

每日练习 25.2.7

Guess the K-th Zero (Hard version) 题目 这是一个交互问题。 这是问题的困难版本。与简单版不同的是,在困难版中,查询次数为 \(1 \le t \le \min(n, 10^4)\),查询总数限制为 \(6 \cdot 10^4\)。 波利卡普正在玩一个电脑游戏。在这个游戏中,一个由 \(0\) 和 \(1\) 组成的数…

树上邻域理论(树上圆理论) 小记

邻域:记 \(f(u, r)\) 表示距离 \(u\) 不超过 \(r\) 的点组成的邻域。令 \(x, y\) 为点集 \(S\) 中两个距离最远的点,设 \(u\) 为 \(x, y\) 中点(可能是一条边的中心),设 \(d\) 为 \(x, y\) 的距离,那么覆盖 \(S\) 的最小邻域为 \(f(u, \frac d2)\)。邻域 \(f(u_1, r_1)\)…

Docker搭建Jenkins并共用宿主机Docker部署服务(一)搭建Jenkins及插件配置 -转载

前言 公司项目多忙着开发,所有项目服务都是博主一个个部署的,时间久了也是心累,所以抽时间把Jenkins部署上,之后让其他开发人员自己部署(让我解脱吧!!)。 部署Jenkins容器 Docker安装就不在赘述了,可以看我之前的文章(懒了);直接开始拉取jenkins镜像。 拉取镜像 docker…

Adam优化器、其与策略梯度法结合

一.Adam优化器旨在根据历史梯度信息来调整每个参数的学习率,从而实现更高效的网络训练。Adam算法的核心思想是同时计算梯度的一阶矩(均值)和二阶矩(未中心的方差)的指数移动平均,并对它们进行偏差校正,以确保在训练初期时梯度估计不会偏向于0。Adam优化器是一种梯度下降…