逆向一个Go程序

news2024/9/28 19:25:32

前奏

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1363703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于YOLOv3开发构建道路交通场景下CCTSDB2021交通标识检测识别系统

交通标志检测是交通标志识别系统中的一项重要任务。与其他国家的交通标志相比,中国的交通标志有其独特的特点。卷积神经网络(CNN)在计算机视觉任务中取得了突破性进展,在交通标志分类方面取得了巨大的成功。CCTSDB 数据集是由长沙…

柠檬Lemon测评机的配置和测试方法

柠檬Lemon测评机的配置和测试方法 只需3步,即可配置好柠檬 第一步:选择g++,点击下一步 第二步:找到g++的目录,添加编译器,点击下一步 第三步:检查结果,点击完成。(此时,配置完成) 只需3步,即可用柠檬做考试测试 第一步:新建比赛

如何实现公网访问GeoServe Web管理界面共享空间地理信息【内网穿透】

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现,利用GeoServer可以方便地发布地图数据,允许用户对要素数据进行更新、删除、插入…

普中STM32-PZ6806L开发板(资料收集...)

简介 逐渐收集一些开发过程中使用到的文档资料数据手册 DS18B20 数据手册 DS18B20 Datasheet 开发文档 STM32F1各种文档 https://www.st.com/en/embedded-software/stm32cubef1.html#documentation HAL库文档开发文档 你使用的HAL文档, 在STM32CubeMX生成过程的最下面有…

uniapp 解决安卓App使用uni.requestPayment实现沙箱环境支付宝支付报错

背景:uniapp与Java实现的安卓端app支付宝支付,本想先在沙箱测试环境测支付,但一直提示“商家订单参数异常,请重新发起付款。”,接着报错信息就是:{ "errMsg": "requestPayment:fail [pa…

基于springboot智慧食堂管理系统源码和论文

随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化,网络化和电子化。网上管理,它将是直接管理“智慧食堂”系统的最新形式。本论文是以构建“智慧食堂”系统为目标,使用java技术制作&…

Spring之循环依赖底层源码(一)

文章目录 一、简介1. 回顾2. 循环依赖3. Bean的生命周期回顾4. 三级缓存5. 解决循环依赖的思路 二、源码分析三、相关问题1. Async情况下的循环依赖解析2. 原型Bean情况下的循环依赖解析3. 构造方法导致的循环依赖解析 一、简介 1. 回顾 前面首先重点分析了Spring Bean的整个…

消息队列-RocketMQ-概览与搭建

RocketMQ 领域模型 RockeMQ整体结构预览 RocketMQ 中的一些概念 Topic:主题,可以理解为类别、分类的概念 MessageQueue:消息队列,存储数据的一个容器(队列索引数据),默认每个 Topic 下有 4 个队…

Danil Pristupov Fork(强大而易用的Git客户端) for Mac/Windows

在当今软件开发领域,团队协作和版本控制是非常重要的方面。在这个过程中,Git成为了最受欢迎的版本控制工具之一。然而,对于Git的使用,一个好的客户端是至关重要的。 今天,我们要为大家介绍一款强大而易用的Git客户端—…

C++ 软件常用分析工具及项目实战问题分析案例集锦

目录 1、库依赖关系查看工具Dependency Walker 2、GDI对象查看工具GDIview 3、PE信息查看工具PeViewer/MiTeC EXE Explorer 4、进程信息查看工具Process Explorer 5、进程监控工具Process Monitor 6、API函数调用监测工具API Monitor C软件异常排查从入门到精通系列教程&…

Linux-v4l2框架

框架图 从上图不难看出,v4l2_device作为顶层管理者,一方面通过嵌入到一个video_device中,暴露video设备节点给用户空间进行控制;另一方面,video_device内部会创建一个media_entity作为在media controller中的抽象体&a…

基于springboot的停车场管理系统-计算机毕业设计源码82061

摘要 由于数据库和数据仓库技术的快速发展,停车场管理系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。停车场管理系统对处理对象和服务对象,自身的系统结构,处理能力,都将适应技术发展的要求发生重大的变化。停…

【读书笔记】网空态势感知理论与模型(九)

对分析人员数据分类分流操作的研究 1.概述 本章节介绍一种以人员为中心的智能数据分类分流系统,该系统利用了入侵检测分析人员的认知轨迹。整合了3个维度的动态网络-人系统(cyber-humber system):网空防御分析人员、网络监测数据…

基于天牛须算法优化的Elman神经网络数据预测 - 附代码

基于天牛须算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于天牛须算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于天牛须优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#x…

OpenCV图像处理|1.1 OpenCV介绍与环境搭建

1.1.1 介绍 OpenCV(Open Source Computer Vision Library)开放源代码计算机视觉库,主要算法涉及图像处理、计算机视觉和机器学习相关方法。OpenCV 其实就是一堆 C 和 C语言的源代码文件,这些源代码文件中实现了许多常用的计算机视…

JavaWeb——新闻管理系统(Jsp+Servlet)之jsp新闻新增

java-ee项目结构设计 1.dao:对数据库的访问,实现了增删改查 2.entity:定义了新闻、评论、用户三个实体,并设置对应实体的属性 3.filter:过滤器,设置字符编码都为utf8,防止乱码出现 4.service:业务逻辑处理 5.servlet:处…

Spring中事务控制的API介绍(PlatformTransactionManager和TransactionDefinition)

事务控制的API PlatformTransactionManager接口 作用:是一个事务管理器,负责开启、提交或回滚事务 实现类:DataSourceTransactionManager(sqlSession) 此接口是spring的事务管理器,它里面提供了我们常用的操作事务的方法…

生信 R语言

11.芯片表达矩阵下游分析 ​rm(list ls())#清除所有变量 options(stringsAsFactors F) #BiocManager::install("CLL") suppressPackageStartupMessages(library(CLL)) data("sCLLex") sCLLex ## ExpressionSet (storageMode: lockedEnvironment) ## as…

报错curl: (6) Could not resolve host: raw.githubusercontent...的解决办法

我起初想要在macOS系统安装pip包,首先在终端安装homebrew,敲了命令:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent...)" 之后触发的报错,报错内容:curl: (6) Could not resolve host: raw.…

如何从 Android SD卡/存储卡中恢复删除的照片

虽然大多数摄影师和智能手机用户都非常喜欢在一张 存储卡上存储数千张照片的能力,但它也可能导致灾难性的数据丢失,而 存储卡照片恢复软件通常是唯一的解决方案。 但是,如果您不迅速采取行动并在图像被覆盖之前恢复图像,那么即使…