逆向一个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:

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。只用于演示逆向的基本操作,欢迎指点。
很多程序为了防止逆向,会加壳。但是有非常多的脱壳工具可以选择。“逆向技术虽好,可不要贪杯哦~”。

相关推荐

  1. Go 程序结构

    2024-01-08 20:54:02       32 阅读
  2. 逆向】fridaAPI_如何hook一个静态方法和实例方法

    2024-01-08 20:54:02       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-08 20:54:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-08 20:54:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-08 20:54:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-08 20:54:02       20 阅读

热门阅读

  1. Trino:分区表上的SQL提交 & 查询流程浅析

    2024-01-08 20:54:02       35 阅读
  2. HarmonyOS@Extend装饰器:定义扩展组件样式

    2024-01-08 20:54:02       34 阅读
  3. DDD领域驱动设计(六)

    2024-01-08 20:54:02       39 阅读
  4. JDBC-常用API

    2024-01-08 20:54:02       41 阅读
  5. 笨蛋学设计模式创建者模式-单例模式【2】

    2024-01-08 20:54:02       30 阅读
  6. Django5+DRF入门教程

    2024-01-08 20:54:02       39 阅读
  7. 2024校招,网易互娱游戏测试工程师一面

    2024-01-08 20:54:02       34 阅读
  8. Vagrant Centos 7 环境配置

    2024-01-08 20:54:02       38 阅读
  9. 使用structured concurrency简化异步并发调用

    2024-01-08 20:54:02       52 阅读
  10. Wargames与bash知识10

    2024-01-08 20:54:02       32 阅读