无符号Golang程序逆向方法解析 您所在的位置:网站首页 纯黑色特殊符号 无符号Golang程序逆向方法解析

无符号Golang程序逆向方法解析

2023-04-20 02:29| 来源: 网络整理| 查看: 265

0 分享至

用微信扫码二维码

分享至好友和朋友圈

在去年的inctf2018中,出现了一道Go语言编写的进程通信逆向题,无论是从题目整体设计还是解题思路上来说都独树一帜,自己在解题过程中遇到了很多问题,但我这不打算做过多探讨,网上也有大佬的解题过程,本文仅针对该题涉及到的无符号Go语言恢复信息问题进行详细讨论。

前言

在整个后期整理过程中,自己参考了很多资料,现放出所有链接,下文中也会有对应的说明。

奈沙夜影师傅的题解分析静态编译无符号文件的方法Go语言逆向去符号信息还原reversing_go_binaries_like_a_pro手把手教你如何专业地逆向GO二进制程序IDAGolangHelperdiaphoraIDA F.L.I.R.T. Technology: In-DepthIDA7.0 IDAPython MakeStr Bug fixangr源码分析——库函数识别identifygolang语言编译的文件大小解析golang编译去符号信息逆向go语言学习-常用命令

初步分析

首先用file命令简单查看下文件类型,发现是64位的,由题目名也能猜出是和go语言有关的逆向题,但是发现虽然是动态链接的,但是无符号,这是比较坑的,心中有点小怕。

$ file ../ultimateGOal ../ultimateGOal: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, stripped

那么用ida打开之后,由于没有符号的原因,我们并不能找到主函数的位置,不熟悉go语言逆向的同学可能会不清楚go语言逆向的入口,那么简单说明一下。

简单demo测试

对下面这个简单的go语言例子而言,我们在进行编译go程序的时候,会生成可执行文件,而go程序需要满足2个条件:

1. go程序中需要包含main包2. 在main包中还必须包含main函数

package main import "fmt" func main() { fmt.Println("Hello World!") }

也就是说go语言的入口点是main.main(真正的入口点),即是main包下的main函数。对这个demo,我们编译之后用ida打开查看,搜索主函数,当确定了主函数入口时,尝试反编译代码,缺发现失败,如下图所示:

给出的提示是Size of 'int' is 8 (4 expected),对于这种错误,通过选项中的编译设置,修改整型的字长大小即可解决问题,如下图所示。

得到如下的代码:

void __cdecl main_main(){ __int64 v0; // rdx error_0 v1; // di __interface_{} ST00_24_2; // ST00_24 __interface_{} v3; // [rsp+30h] [rbp-18h] void *retaddr; // [rsp+48h] [rbp+0h] while ( (unsigned __int64)&retaddr /阅读下一篇/ 返回网易首页 下载网易新闻客户端



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有