淺析go逆向符號恢復
前言
之前一直沒怎么重視,結果發(fā)現每次遇到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;
}注意&與==的優(yōu)先級,操作單位是字節(jié)所以需要異或0xff
go_get_the_flag
先符號恢復然后發(fā)現輸入是和程序一起輸入的,分析程序

發(fā)現有一個比較字符串和輸入的長度為18也正好契合輸入得到
fb{.60pcln74b_15_4w350m3}
參考鏈接:https://jiayu0x.com/2020/09/28/go-binary-reverse-engineering-tips-and-example/
到此這篇關于go逆向符號恢復的文章就介紹到這了,更多相關go逆向符號恢復內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go語言字典(map)用法實例分析【創(chuàng)建,填充,遍歷,查找,修改,刪除】
這篇文章主要介紹了Go語言字典(map)用法,結合實例形式較為詳細的分析了Go語言字典的創(chuàng)建、填充、遍歷、查找、修改、刪除等操作相關實現技巧,需要的朋友可以參考下2017-02-02

