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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DTD(文档类型定义)

一、简介 为什么使用DTD 通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。 通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。 而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。 您还可以使用 DTD 来验…

【架构专题】不会业务稳定性建设架构师直接开除!!!

为什么要做业务稳定性建设? 首先,什么是业务稳定性建设?顾名思义,就是保证系统的稳定运行,让用户不受任何影响地使用产品。对于一个企业来说,这非常重要,因为如果产品出现问题,那么…

Kafka(六)消费者

目录 Kafka消费者1 配置消费者bootstrap.serversgroup.idkey.deserializervalue.deserializergroup.instance.idfetch.min.bytes1fetch.max.wait.msfetch.max.bytes57671680 (55 mebibytes)max.poll.record500max.partition.fetch.bytessession.timeout.ms45000 (45 seconds)he…

C++实现单例模式

单例模式: 一种设计模式,它的目的是确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。它适用于需要全局唯一的对象或资源的情况。 23种设计模式种最简单最常见的一种(高频考点) 要求:通过一个…

Python打印Python环境、PyTorch和CUDA版本、GPU数量名称等信息

代码: import torch import platformgpu_num torch.cuda.device_count() torch_version torch.__version__ python_version platform.python_version()print("Python Version: Python %s" % python_version) print("PyTorch Version: %s" %…

代码随想录刷题第四十二天| 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

代码随想录刷题第四十二天 今天是0-1背包问题,掌握了套路就不难了~~~ 0-1背包问题理论基础(二维数组篇)卡码网第46题 题目思路: 代码实现: input_line input() # 读取一行输入 mn input_line.split() m, n int…

Oracle-expdp备份变慢问题分析

问题背景: 应用有一个每日跑批之前的备份作业,通过expdp备份应用的用户数据,数据量大概为600G左右,正常情况下可以在20分钟内跑完,但最近expdp备份完成时间却突然猛涨到要2小时32分才能备份完,导致后续的跑…

QT上位机开发(会员充值软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 所有的控件当中,除了label、edit、radio、combobox和button之外,另外一个用的比较多的控件就是grid,也可称之为…

前台收款单选择的保险公司 提示 往来户不属于该财务组织

前台收款单选择的保险公司 提示 往来户不属于该财务组织 问题避免 新增保险公司的时候,找一个已经存在的保险公司,利用多页签复制的方式来新增 保险公司 不然不能够自动生成 财务客户

【无标题】- 自用代码 优化资源时常用的备份一个目录

右键&#xff0c;备份并删除 using System.IO; using UnityEditor; using UnityEngine; /// <summary> /// 删除字体&#xff0c;减少资源等优化功能&#xff0c;并且可以备份 /// </summary> public class BackUpYouhuaWindow : EditorWindow {[MenuItem("As…

linux 02 vmware的快照,文件管理

01.快照 使用快照&#xff1a; 同时的快照管理器&#xff1a; 如果想要返回快照&#xff0c;选择要选择的快照&#xff0c;跳转 02. 文件管理&#xff1a; cd 02.touch 2. mkdir 文件夹 mkdir -p 文件夹 &#xff08;创建之前没有的上级文件夹&#xff09;

SD-WAN:提升连锁零售企业异地组网稳定性

连锁零售企业往往拥有众多分布在不同地区的分支机构和零售店&#xff0c;为保证企业高效运转&#xff0c;各地区之间的网络连接必须稳定可靠。但基于各地网络基础设施的不同和网络延迟、带宽等限制&#xff0c;异地组网往往并不稳定。在这背景下&#xff0c;SD-WAN成为连锁零售…

CentOS:docker容器日志清理

1.先查看磁盘空间 df -h 2.找到容器的containerId-json.log文件,并清理 find /var/lib/docker/containers/ -name *-json.log |xargs du -sh 3、可以根据需求清理对应日志也可以清理数据大的日志 $ cat /dev/null > /var/lib/docker/containers/dbaee0746cc6adad3768b4ef…

[C#]使用sdcb.paddleocr部署v4版本ocr识别模型

【官方框架地址】 https://github.com/sdcb/PaddleSharp 【算法介绍】 PaddleOCR&#xff0c;全称为PaddlePaddle OCR&#xff0c;是PaddlePaddle深度学习平台下的一款强大的光学字符识别工具。它利用深度学习技术&#xff0c;实现了高精度的文字识别&#xff0c;可以帮助用户…

K8S--安装MySQL8(单机)

原文网址&#xff1a;K8S--安装MySQL8&#xff08;单机&#xff09;-CSDN博客 简介 本文介绍K8S部署MySQL8&#xff08;单机&#xff09;的方法。 本文的目标 1.通过PV和PVC&#xff08;hostPath方式&#xff09;存储MySQL的数据 2.通过Deployment、Service部署MySQL8&…

SpringBoot2基础

SpringBoot2 一、初始化项目 ①、创建project ②、构建maven项目 如果选项里没有8的&#xff0c;可以最顶上镜像换成阿里巴巴的&#xff1a;https://start.aliyun.com/ 直接在main函数运行就行 二、SpringBoot入门 1、复制工程 原则 保留工程基础结构抹掉原始工程痕迹 做个…

【MIdjourney】图像角度关键词

本篇仅是我个人在使用过程中的一些经验之谈&#xff0c;不代表一定是对的&#xff0c;如有任何问题欢迎在评论区指正&#xff0c;如有补充也欢迎在评论区留言。 1.侧面视角(from side) 侧面视角观察或拍摄的主体通常以其侧面的特征为主要焦点&#xff0c;以便更好地展示其轮廓…

K近邻算法(K-Nearest Neighbors,KNN)

K近邻算法&#xff08;K-Nearest Neighbors&#xff0c;KNN&#xff09;是一种基本的监督学习算法&#xff0c;常用于分类和回归任务。KNN的基本思想是通过测量不同样本点之间的距离&#xff0c;将新样本的类别标签赋予其K个最近邻居中出现最频繁的类别。 以下是KNN的基本原理和…

CAN协议层详细介绍

CAN物理层协议介绍-CSDN博客 目录 1. CAN的波特率及位同步 2. 位时序分解 3. CAN的报文种类及结构 3.1 报文的种类 3.2 数据帧的结构 3.2.1 仲裁段 3.2.2 RTR位(Remote Transmission Request Bit) 3.2.3 IDE位(Identifier Extension Bit) 3.2.3 SRR位(Substi…

【代码】Keras3.0:实现残差连接

简介 残差连接是一种非常重要的网络结构创新&#xff0c;最早被广泛应用于ResNet&#xff08;Residual Neural Network&#xff09;模型中&#xff0c;由何凯明等人在2015年的论文"Deep Residual Learning for Image Recognition"中提出。 核心思想 通过引入“short…