浅析go逆向符号恢复

 更新时间:2023年08月04日 11:34:38   作者:Wo0w  
这篇文章主要介绍了go逆向符号恢复的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

前言

之前一直没怎么重视,结果发现每次遇到go的题都是一筹莫展,刷几道题练习一下吧

准备

go语言写的程序一般都被strip去掉符号了,而且ida没有相关的签名文件,没办法完成函数名的识别与字符串的定位,所以第一步通常为恢复相应符号文件,网上有许多脚本可以用来恢复
**golang_loader_assist :**靠汇编代码的特征来找出 runtime_morestack 和 runtime_morestack_noctxt 函数,然后在 IDAPro 种遍历对这两个函数交叉引用的位置来找出函数体。
https://github.com/strazzere/golang_loader_assist
**IDAGolangHelper :**从 pclntab 结构中解析、恢复函数符号,Go 二进制文件中还有大量的类型、方法定义的信息,也可以解析出来
https://github.com/sibears/IDAGolangHelper
**go_parser:**功能比前面几个工具更加完善的 Go 二进制文件解析工具,除了解析前面提到的函数名、字符串和数据类型信息
https://github.com/0xjiayu/go_parser
直接用ida运行下载的python文件即可恢复

go go go! gorev

*ctf的一道签到题,可恶使用前两个脚本的时候显示代码错误和恢复失败,第三个可以使用

在这里插入图片描述

其中v16是输入前由随机数产生,可以动调产生,比较函数里面应该是直接实现了比较函数,所以看着比较奇怪可以直接看第一个寄存器比较,得到最终的比较字符串

import base64
str1 = b'fiAGBkgXN3McFy9hAHRfCwYaIjQCRDFsXC8ZYBFmEDU='
str2 = base64.b64decode(str1)
print(str2)
rand = b'TcR@3t_3hp_5_G1H'
flag =''
for i in range(len(str2)):
    flag += chr(rand[i % 16] ^ str2[i])
    print(flag)

easy_go

被strip掉了,用golang_loader_assist恢复符号

在这里插入图片描述

#include"stdio.h"
int main(){
	int byte_561538[] =
{
  0xDB, 0x9E, 0xB7, 0x9A, 0x91, 0xCA, 0xA1, 0x6B, 0x97, 0xC1, 
  0x74, 0xB3, 0x90, 0x00, 0x00, 0x00
};
	int byte_561518[] =
{
  0xD3, 0x75, 0x9B, 0xF9, 0xA3, 0x87, 0xED, 0x93, 0x8D, 0xDD, 
  0x77, 0xED, 0x67, 0x00, 0x00, 0x00
};
	int byte_561528[] =
{
  0xB7, 0x9C, 0x79, 0x43, 0x9B, 0xAF, 0x94, 0xE4, 0x94, 0x71, 
  0xEC, 0xEA, 0x8E, 0x00, 0x00, 0x00
};
	for(int i=0;i<13;i++){
		for(int k=0;k<128;k++){
			if(((byte_561538[i] + byte_561518[i] * k )&0xff) ==byte_561528[i] ){
			    putchar(k);
				break;
			}
		}
	}
	getchar();
return 0;
}

注意&与==的优先级,操作单位是字节所以需要异或0xff

go_get_the_flag

先符号恢复然后发现输入是和程序一起输入的,分析程序

在这里插入图片描述

发现有一个比较字符串和输入的长度为18也正好契合输入得到

fb{.60pcln74b_15_4w350m3}

参考链接:https://jiayu0x.com/2020/09/28/go-binary-reverse-engineering-tips-and-example/

到此这篇关于go逆向符号恢复的文章就介绍到这了,更多相关go逆向符号恢复内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言hello world实例

    Go语言hello world实例

    这篇文章主要介绍了Go语言hello world实例,本文先是给出了hello world的代码实例,然后对一些知识点和技巧做了解释,需要的朋友可以参考下
    2014-10-10
  • 服务器端Go程序对长短链接的处理及运行参数的保存

    服务器端Go程序对长短链接的处理及运行参数的保存

    这篇文章主要介绍了服务器端Go程序对长短链接的处理及运行参数的保存,这里针对使用Go语言编写的Socket服务器进行实例说明,需要的朋友可以参考下
    2016-03-03
  • Go语言指针用法详解

    Go语言指针用法详解

    Go指针和C指针在许多方面非常相似,但其中也有一些不同。本文详细讲解了Go语言指针的用法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • mac下安装golang框架iris的方法

    mac下安装golang框架iris的方法

    这篇文章主要介绍了mac下安装golang框架iris的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 详解go-zero如何实现令牌桶限流

    详解go-zero如何实现令牌桶限流

    令牌桶算法既能够将所有的请求平均分布到时间区间内,又能接受服务器能够承受范围内的突发请求,因此是目前使用较为广泛的一种限流算法,本文就来看看go-zero如何实现令牌桶限流的吧
    2023-08-08
  • go货币计算时如何避免浮点数精度问题

    go货币计算时如何避免浮点数精度问题

    在开发的初始阶段,我们经常会遇到“浮点数精度”和“货币值表示”的问题,那么在golang中如何避免这一方面的问题呢,下面就跟随小编一起来学习一下吧
    2024-02-02
  • Go底层select的原理分析

    Go底层select的原理分析

    这篇文章主要介绍了Go底层select的原理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • GO中的条件变量sync.Cond详解

    GO中的条件变量sync.Cond详解

    条件变量是基于互斥锁的,它必须基于互斥锁才能发挥作用,条件变量的初始化离不开互斥锁,并且它的方法有点也是基于互斥锁的,这篇文章主要介绍了GO的条件变量sync.Cond,需要的朋友可以参考下
    2023-01-01
  • golang 防缓存击穿singleflight的实现

    golang 防缓存击穿singleflight的实现

    本文主要介绍了golang 防缓存击穿singleflight的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 基于Go语言开发一个编解码工具

    基于Go语言开发一个编解码工具

    这篇文章主要为大家详细介绍了如何基于Go语言开发一个编解码工具,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起了解一下
    2025-03-03

最新评论