设为首页收藏本站 今天是: 2024-03-01    "国际海豹日 "  保护海豹这种珍稀动物

复仇者黑客组织

 找回密码
 立即注册

QQ登录

只需一步,快速开始

    查看: 370|回复: 3

    滴水三期01-19中涉及的CreakMe

    [复制链接]

    该用户从未签到

    4

    主题

    4

    帖子

    14

    积分

    新手上路

    Rank: 1

    积分
    14
    发表于 2023-11-29 13:48:57 | 显示全部楼层 |阅读模式
    简介
    时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢谢)
    一直想要有个二进制相关的工作,但是奈何能力太差,只能继续学习了,看见有人推荐要会加壳、脱壳、基础逆向,所以最近在看滴水三期的视频,据说很经典。
    感觉前几期偏基础,基本都学过,就当作是复习以前学的知识了,视频里是直接用od来讲汇编的,感觉利用od直接讲汇编是挺好的方法。挺适合初次接触汇编语言的朋友们,比当初我用dosbox来编写汇编要方便些,不过可能会缺乏些基础知识,例如:数据段、栈段、代码段的定义,并且也不能用od编写完整的汇编程序。总体来说通过od来学习汇编语句还是很方便的,毕竟现在使用汇编编程的人比较少了,只要知道大概意思就好,不用熟悉完整的编译过程了。
    这篇文章记录下滴水三期01-19中涉及的CreakMe。
    查看程序信息
    下载地址:链接: https://pan.baidu.com/s/1ZwjT1xM67OQ0FKL8WbcXlA?pwd=rcwc 提取码: rcwc
    先尝试运行一下,在Help下有个Register的功能可以使用,需要输入Name和Serial
    图片1
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(1)
    当然我们是不知道正确的输入的,所以就随便输入,结果弹出了一个新的窗口。后续根据视频了解到创建窗口使用MessageBoxA函数。
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(2)
    程序的基本功能就是有个类似登录的判断,查壳试一下,MASM32 / TASM32 \[Overlay\],汇编的程序,可以直接用od查看
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(3)
    OD调试
    使用命令bp MessageBoxA设置断点在创建窗口的函数
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(4)
    点击上方的 TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(5) 按钮或者选择上方工具栏中查看->断点,查看当前断点情况
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(6)
    继续运行程序,在输入后触发断点
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(7)
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(8)
    查看栈,根据函数调用栈,右键反追踪到ret点
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(9)
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(10)
    再次根据函数调用栈反追踪到ret点
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(11)
    发现此处将输入当作参数调用 0x0040137e函数,F2设置断点,查看该函数。
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(12)
    修改其中的判断将`je    short 0040139c`,更改为`jmp    short 0040139c`
    继续执行,发现00401243有一个跳转,将`je short 0040124c`更改为`jmp short 0040124c`
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(13)
    此时基本破解程序,无论输入什么都返回正确的结果
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(14)
    进阶调试
    还可以通过调试来查看正确的Name和Serial
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(15)
    发现该函数会讲小写字母转成大写字母,Name只要是字母就正确,但返回结果为`xor edi,0x5678`,所以0040137e会将Name中每个字母对应的大写字母的ascii相加的和再与0x5678异或
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(16)
    发现该函数将密码的每位字符`(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进行类型限制,可能就是这么设计的,于是尝试编写脚本爆破正确密码,奈何人太菜了,花了很久才写了个脚本出来
    1. # !/usr/bin/python3
    2. # -*- coding:utf-8 -*-
    3. # home.php?mod=space&uid=686208 : Jokid
    4. # @Time : 2023-06-05
    5. import string
    6. #确认密码
    7. name = 'a'
    8. name = name.upper()
    9. name_sum = 0
    10. for i in name:
    11.         name_sum += ord(i)
    12.         a = name_sum ^ 0x444c
    13.         #print(a)
    14.         str_a = str(a)
    15. #定义字符集
    16. lower = string.ascii_lowercase
    17. list_of_lowercase_letters = list(lower)
    18. upper = string.ascii_uppercase
    19. list_of_uppercase_letters = list(upper)
    20. num_list = []
    21. for i in range(0,10):
    22.         num_list.append(str(i))
    23.         pwd_list = list_of_lowercase_letters+list_of_uppercase_letters+num_list
    24. #计算当前pwd的值
    25. def pwd_ord(pwd):
    26.         j=0
    27.         for i in pwd:
    28.                 i_v = ord(i)-0x30
    29.                 j = j*10 + i_v
    30.         return(j)
    31. #递归获取正确密码
    32. def get_pwd(index,pwd,demo):
    33.         index+=1
    34.         for i in pwd_list:
    35.                 l_pwd = pwd
    36.                 l_demo = demo
    37.                 l_demo = str(ord(i)-0x30+int(l_demo)*10)
    38.                 if(l_demo[:index]==str_a[:index]):
    39.                         l_pwd +=i
    40.                         tt = pwd_ord(l_pwd)
    41.                         if(tt==a):
    42.                                 print('ok',l_pwd)
    43.                         get_pwd(index,l_pwd,l_demo)
    44. pwd = ''
    45. demo = 0
    46. index = 0
    47. get_pwd(index,pwd,demo)
    复制代码



    运行结果
    TBC茶馆-复仇者黑客组织简介时隔多年再次写东西,记录一下当前的学习过程(ps:本人太懒了,学了这么多年还在原地打转,勿喷,谢复仇者黑客组织(17)




    上一篇:绕过 AGE 动漫的 wasm 加密与解密函数
    下一篇:protobuf知识补充

    该用户从未签到

    5

    主题

    2024

    帖子

    2001

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    2001
    发表于 2023-11-29 13:49:37 | 显示全部楼层
    由于是第一次发帖,图片大小和文字排版有点奇怪,希望大家谅解
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    1923

    帖子

    890

    积分

    高级会员

    Rank: 4

    积分
    890
    发表于 2023-11-29 13:50:33 | 显示全部楼层
    梦回十多年前
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    2098

    帖子

    2080

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    2080
    发表于 2023-11-29 13:51:18 | 显示全部楼层
    小白不懂就问: 为何要修改`je    short 0040139c`,更改为`jmp    short 0040139c` ??这个意义是在哪没懂?    为何不在MessageboxA的寄存器里把相关PUSH全部NOP掉呢?  或者在开头RETUN掉?
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭Powered by ©科大讯飞语音云
    嗨!您好:
    欢迎来到 复仇者黑客组织。
    我的名字叫小光
    很高兴能够为您服务!
    如果已经注册【立即登录】
    还没有账号请立即注册
    Loading...
    快速回复 返回顶部 返回列表