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

您所在的位置:网站首页 朱婷的最新视频 无符号Golang程序逆向方法解析

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

#无符号Golang程序逆向方法解析| 来源: 网络整理| 查看: 265

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

前言

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

奈沙夜影师傅的题解 分析静态编译无符号文件的方法 Go语言逆向去符号信息还原 reversing_go_binaries_like_a_pro 手把手教你如何专业地逆向GO二进制程序 IDAGolangHelper diaphora IDA F.L.I.R.T. Technology: In-Depth IDA7.0 IDAPython MakeStr Bug fix angr源码分析——库函数识别identify golang语言编译的文件大小解析 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个条件:

go程序中需要包含main包 在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 办公设备维修网 版权所有 豫ICP备15022753号-3