吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2257|回复: 19
收起左侧

[原创] 滴水三期01-19中涉及的CreakMe

[复制链接]
Jokid 发表于 2023-11-29 10:26
简介
时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢谢)
一直想要有个二进制相关的工作,但是奈何能力太差,只能继续学习了,看见有人推荐要会加壳、脱壳、基础逆向,所以最近在看滴水三期的视频,据说很经典。
感觉前几期偏基础,基本都学过,就当作是复习以前学的知识了,视频里是直接用od来讲汇编的,感觉利用od直接讲汇编是挺好的方法。挺适合初次接触汇编语言的朋友们,比当初我用dosbox来编写汇编要方便些,不过可能会缺乏些基础知识,例如:数据段、栈段、代码段的定义,并且也不能用od编写完整的汇编程序。总体来说通过od来学习汇编语句还是很方便的,毕竟现在使用汇编编程的人比较少了,只要知道大概意思就好,不用熟悉完整的编译过程了。
这篇文章记录下滴水三期01-19中涉及的CreakMe。
查看程序信息
下载地址:链接: https://pan.baidu.com/s/1ZwjT1xM67OQ0FKL8WbcXlA?pwd=rcwc 提取码: rcwc
先尝试运行一下,在Help下有个Register的功能可以使用,需要输入Name和Serial

图片1

图片1

当然我们是不知道正确的输入的,所以就随便输入,结果弹出了一个新的窗口。后续根据视频了解到创建窗口使用MessageBoxA函数。
Pasted image 20230602151551.png
程序的基本功能就是有个类似登录的判断,查壳试一下,MASM32 / TASM32 \[Overlay\],汇编的程序,可以直接用od查看
Pasted image 20230602101228.png
OD调试
使用命令bp MessageBoxA设置断点在创建窗口的函数
Pasted image 20230602152555.png
点击上方的 Pasted image 20230602153222.png 按钮或者选择上方工具栏中查看->断点,查看当前断点情况
Pasted image 20230602153414.png
继续运行程序,在输入后触发断点
Pasted image 20230602154008.png
Pasted image 20230602154053.png
查看栈,根据函数调用栈,右键反追踪到ret点
Pasted image 20230602154233.png
Pasted image 20230602154540.png
再次根据函数调用栈反追踪到ret点
Pasted image 20230602154916.png
发现此处将输入当作参数调用 0x0040137e函数,F2设置断点,查看该函数。
Pasted image 20230602155325.png
修改其中的判断将`je    short 0040139c`,更改为`jmp    short 0040139c`
继续执行,发现00401243有一个跳转,将`je short 0040124c`更改为`jmp short 0040124c`
Pasted image 20230602160433.png
此时基本破解程序,无论输入什么都返回正确的结果
Pasted image 20230602160836.png
进阶调试
还可以通过调试来查看正确的Name和Serial
Pasted image 20230602161522.png
发现该函数会讲小写字母转成大写字母,Name只要是字母就正确,但返回结果为`xor edi,0x5678`,所以0040137e会将Name中每个字母对应的大写字母的ascii相加的和再与0x5678异或
Pasted image 20230602164528.png
发现该函数将密码的每位字符`(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 -*-
# home.php?mod=space&uid=686208 : 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)


运行结果
Pasted image 20230605174924.png

免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
Chenda1 + 1 + 1 我很赞同!
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

supernox 发表于 2023-11-29 12:03
小白不懂就问: 为何要修改`je    short 0040139c`,更改为`jmp    short 0040139c` ??这个意义是在哪没懂?    为何不在MessageboxA的寄存器里把相关PUSH全部NOP掉呢?  或者在开头RETUN掉?
Chenda1 发表于 2023-12-1 18:28
滴水三期确实很经典 ,我看了一部分没坚持下去   。 以后打算从新在次学习。不过课程老师嘴上一直说我们是从三层看问题 ,很有逼格的样子。不知道的还以为 老师在让大家在大气层学习呢
 楼主| Jokid 发表于 2023-11-29 10:28
由于是第一次发帖,图片大小和文字排版有点奇怪,希望大家谅解
mycc 发表于 2023-11-29 11:49
梦回十多年前
 楼主| Jokid 发表于 2023-11-29 14:25
supernox 发表于 2023-11-29 12:03
小白不懂就问: 为何要修改`je    short 0040139c`,更改为`jmp    short 0040139c` ??这个意义是在哪没 ...

只修改判断语句的原因是为了最小化对程序逻辑的影响,并尽可能保持原有代码的结构和功能
331663154 发表于 2023-11-29 14:32

不明觉厉,感谢分享
smallzero 发表于 2023-11-29 15:08
感谢分享
supernox 发表于 2023-11-29 16:09
Jokid 发表于 2023-11-29 14:25
只修改判断语句的原因是为了最小化对程序逻辑的影响,并尽可能保持原有代码的结构和功能

厉害大神! 想再请教下最后个问题,在遇到判断跳的时候,只要将JE或JZ在短循环开头改成JMP是不是就可以完美破掉大部分程序??
 楼主| Jokid 发表于 2023-11-29 16:26
supernox 发表于 2023-11-29 16:09
厉害大神! 想再请教下最后个问题,在遇到判断跳的时候,只要将JE或JZ在短循环开头改成JMP是不是就可以完 ...

我也才开始学,感觉应该是可以的,至少可以按照需求修改程序流程

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
supernox + 1 + 1 感谢指教

查看全部评分

lduml 发表于 2023-11-29 18:13
学习了,mark
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-28 03:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表