滴水三期01-19CreakMe

本文介绍了作者通过观看滴水三期视频学习逆向工程的过程,使用OD调试器分析并破解了一个简单的CrackMe程序。作者设置了断点在MessageBoxA函数,通过跟踪代码发现程序对Name和Serial进行特定的异或运算。通过编写Python脚本,作者尝试爆破正确的Serial,展示了学习逆向工程的基础步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢谢)
一直想要有个二进制相关的工作,但是奈何能力太差,只能继续学习了,看见有人推荐要会加壳、脱壳、基础逆向,所以最近在看滴水三期的视频,据说很经典。
感觉前几期偏基础,基本都学过,就当作是复习以前学的知识了,视频里是直接用od来讲汇编的,感觉利用od直接讲汇编是挺好的方法。挺适合初次接触汇编语言的朋友们,比当初我用dosbox来编写汇编要方便些,不过可能会缺乏些基础知识,例如:数据段、栈段、代码段的定义,并且也不能用od编写完整的汇编程序。总体来说通过od来学习汇编语句还是很方便的,毕竟现在使用汇编编程的人比较少了,只要知道大概意思就好,不用熟悉完整的编译过程了。
这篇文章记录下滴水三期01-19中涉及的CreakMe。

查看程序信息

下载地址:https://pan.baidu.com/s/1ZwjT1xM67OQ0FKL8WbcXlA?pwd=rcwc
提取码: rcwc
先尝试运行一下,在Help下有个Register的功能可以使用,需要输入Name和Serial
在这里插入图片描述

当然我们是不知道正确的输入的,所以就随便输入,结果弹出了一个新的窗口。后续根据视频了解到创建窗口使用MessageBoxA函数。
在这里插入图片描述

程序的基本功能就是有个类似登录的判断,查壳试一下,MASM32 / TASM32 [Overlay],汇编的程序,可以直接用od查看
在这里插入图片描述

OD调试

使用命令bp MessageBoxA设置断点在创建窗口的函数
在这里插入图片描述
点击上方的在这里插入图片描述按钮或者选择上方工具栏中查看->断点,查看当前断点情况
在这里插入图片描述
继续运行程序,在输入后触发断点
在这里插入图片描述
在这里插入图片描述

查看栈,根据函数调用栈,右键反追踪到ret点
在这里插入图片描述
在这里插入图片描述
再次根据函数调用栈反追踪到ret点
在这里插入图片描述
发现此处将输入当作参数调用 0x0040137e函数,F2设置断点,查看该函数。
在这里插入图片描述
修改其中的判断将je short 0040139c,更改为jmp short 0040139c
继续执行,发现00401243有一个跳转,将je short 0040124c更改为jmp short 0040124c
在这里插入图片描述
此时基本破解程序,无论输入什么都返回正确的结果
在这里插入图片描述

进阶调试

还可以通过调试来查看正确的Name和Serial
在这里插入图片描述
发现该函数会讲小写字母转成大写字母,Name只要是字母就正确,但返回结果为xor edi,0x5678,所以0040137e会将Name中每个字母对应的大写字母的ascii相加的和再与0x5678异或
在这里插入图片描述
发现该函数将密码的每位字符(ascii-0x30)*0x0A,这个运算是为了方便纯数字的Serial进行运算,可以将Serial作为数字与1234异或
整理得出:Name xor 0x5678 = Serial xor 0x1234
==>Name(ascii) xor 0x5678 xor 0x1234 = Serial
==>Name(ascii) xor 0x444c = Serial
例如:a(ascii=0x41) xor 0x444c = 0x440d = 17421,故a对应的纯数字Serial为17421

副章

这里我发现程序没有对Serial进行类型限制,可能就是这么设计的,于是尝试编写脚本爆破正确密码,奈何本人太菜了,花了很久才写了个脚本出来

# !/usr/bin/python3
# -*- coding:utf-8 -*-
# @Author : Jokid
# @Time : 2023-06-05
import string


#确认密码
name = 'a'
name = name.upper()
name_sum = 0
for i in name:
	name_sum += ord(i)
	a = name_sum ^ 0x444c
	#print(a)
	str_a = str(a)

#定义字符集
lower = string.ascii_lowercase
list_of_lowercase_letters = list(lower)
upper = string.ascii_uppercase
list_of_uppercase_letters = list(upper)
num_list = []
for i in range(0,10):
	num_list.append(str(i))
	pwd_list = list_of_lowercase_letters+list_of_uppercase_letters+num_list

#计算当前pwd的值
def pwd_ord(pwd):
	j=0
	for i in pwd:
		i_v = ord(i)-0x30
		j = j*10 + i_v
	return(j)

#递归获取正确密码
def get_pwd(index,pwd,demo):
	index+=1
	for i in pwd_list:
		l_pwd = pwd
		l_demo = demo
		l_demo = str(ord(i)-0x30+int(l_demo)*10)
		if(l_demo[:index]==str_a[:index]):
			l_pwd +=i
			tt = pwd_ord(l_pwd)
			if(tt==a):
				print('ok',l_pwd)
			get_pwd(index,l_pwd,l_demo)

pwd = ''
demo = 0
index = 0
get_pwd(index,pwd,demo)

运行结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值