逆向一个Go程序

前奏

事先声明,自导自演,纯属为了演示基本的逆向思维

用Go写一段模拟登录的代码:

go 复制代码
package main

import (
	"fmt"
)

func main() {
	pass := ""
	fmt.Print("input password:")
	fmt.Scan(&pass)
	if pass == "hello" {
		fmt.Println("login successfully!")
	} else {
		fmt.Println("login failed!")
	}
	fmt.Scan(&pass)
}

编译一下:
运行一下login.exe:

shell 复制代码
input password:hello
login successfully!

解释一下:若输入hello则表示登录成功,反之,则提示登录失败。
如下将对该程序进行逆向,目的是输入任何密码,都可以直接显示:"login successfully!",也就是跳过验证逻辑。

IDA 静态分析

加载login.exe文件。
等待反汇编完成。
显示的是程序的EntryPoint了。

Go程序比较特殊,不是直接从main函数开始执行的。后期有时间会详细介绍一下Go程序的加载与初始化运行流程。

我们将左侧的函数窗口下滑,滑到最后,看到了main_main这个是用户的main函数。一个可执行的go程序,执行用户代码都是从main.main方法开始的。
点击该函数,这就是代码的主要逻辑:
Go栈扩容的逻辑,这里无需关注。
猜测一下,下边 call fmt_Fprint 应该是打印第一个提示信息的地方,那如果是的话,上边这两个箭头指的地址,必定和要打印的内容有关系。
果然,第二个地址里边,有内容。
点击进去看一下,您猜怎么着:
一层套一层,好在拨云见日。

这存储的不就是"input password:"的提示信息嘛。

那输出都找到了,下边盲猜就是输入内容了:
按正常思维,输入一个内容后,就应该是比对内容了吧。

这3个cmp后,一共有两个分支。猜测一下,一个分支应该是输入的内容与原有的内容能匹配上,另一个是不能匹配上的情况。

3个cmp后,是3个,jnz(jump if not zero),即不符合相等条件则跳转。

那左侧的这一块儿,应该就是判定登录成功的逻辑了吧。

嘿,您还别说,看见点不一样的东西:
"login successfully!"。
那右侧那一块是不是就是登录失败了呢?
没错!"login failed!"。
至此也就分析的差不多了,后边的代码就不用管了。

逆向的目的是让程序绕过登录判定

也就是将红色区域的部分绕过就可以了!由于,rcx,rdx两个寄存器都是临时使用,无后效性。所以我们(斜眼笑),更改一下跳转逻辑,让逻辑走到判定登录的时候,就向"左跳",不就可以了嘛。(其实你也可以忽略输入,这里还是以上述内容为例。不搞得那么绝对。)
右键,选择Text view
找到call fmt_Fscan后边的代码,记录一下左侧的地址。00000000004979D8,基地址偏移。

x64dbg 动态调试代码

打开软件,加载login.exe程序。
在窗口中右键》转到》表达式。
粘贴进用IDA静态分析的地址:00000000004979D8
跳转到该地址后,打一个断点,在这里(这怎么还说上倒装句了)。
点击运行按钮,直到程序阻塞在输入位置。
输入一个非正确的密码(假装不知道真实密码),此时程序停在了断点位置。
我们先看一下想要忽略掉的指令。然后记录一下忽略掉的指令的后一条指令的地址。00000000004979F5
在该断点所在代码位置上点击右键,选择汇编。将该行指令修改为跳转指令,目标地址是00000000004979F5

指令是:jmp 00000000004979F5
下一条指令取消即可
然后捏。点击运行,发现被调试程序显示出了"login successfully!"。哇哦~

将逆向过的程序保存到本地

在窗口中右键选择补丁
选择修补文件
然后取个名,保存即可
点击dump到本地的程序,任意输入一些内容就可以登录。
至此完结撒花~biu特否

总结

以上使用Go、IDA、x64dbg调试,并逆向了一个自己写的demo。只用于演示逆向的基本操作,欢迎指点。

很多程序为了防止逆向,会加壳。但是有非常多的脱壳工具可以选择。"逆向技术虽好,可不要贪杯哦~"。

相关推荐
盐水冰5 分钟前
【烘焙坊项目】后端搭建(12) - 订单状态定时处理,来单提醒和顾客催单
java·后端·学习
凸头8 分钟前
CompletableFuture 与 Future 对比与实战示例
java·开发语言
wuqingshun31415912 分钟前
线程安全需要保证几个基本特征
java·开发语言·jvm
Moksha26216 分钟前
5G、VoNR基本概念
开发语言·5g·php
紫丁香18 分钟前
AutoGen详解一
后端·python·flask
jzlhll12335 分钟前
kotlin Flow first() last()总结
开发语言·前端·kotlin
小涛不学习35 分钟前
Spring Boot 详解(从入门到原理)
java·spring boot·后端
W.D.小糊涂36 分钟前
gpu服务器安装windows+ubuntu24.04双系统
c语言·开发语言·数据库
用头发抵命1 小时前
Vue 3 中优雅地集成 Video.js 播放器:从组件封装到功能定制
开发语言·javascript·ecmascript
似水明俊德1 小时前
02-C#.Net-反射-学习笔记
开发语言·笔记·学习·c#·.net