逆向入门(14、15)程序逆向篇-Brad Soblesky.1-fty_crkme3

0x01 Brad Soblesky.1

这个就比较简单,打开后直接就是注册界面
在这里插入图片描述
OD找到对应字符串
在这里插入图片描述
下个断点就读到了字符串<BrD-SoB>,搞定
在这里插入图片描述

0x02 fty_crkme3

这个有壳,先用upx脱壳,然后就可以找到关键代码信息了
在这里插入图片描述
跳转到关键代码处
在这里插入图片描述
发现这里是由esiedi比较的结果,edi由上面的数加也就是计算上来的,先追一下esi
在这里插入图片描述
esi由上面的call计算而来
在这里插入图片描述
这个call的作用经由上面一步步的下断调试可以发现经过了很多次调用,最明显的第一次作用就是十进制的数转为十六进制,这里为了方便查看函数,可以进这个call,然后在首行给他右键添加一个标签,比如我这里起个标签名叫dec2hex,当标签起好以后再次看之前的内容就变成了下面这个样子,这样就会更加容易分析
在这里插入图片描述
这里是最近的一个esi取值,但是这个地址并没有断下,说明还要继续往上找
在这里插入图片描述
正好就是这个地址这里进行的传值,那这个eax又是由什么东西转成的十六进制呢?接着追

在这里插入图片描述
这里我手动调整了下注释,这样就看得比较清楚了,这里看着很复杂,但是实际上最后追出来的结果就是:如果这是一个9位数的序列的话,第2位和第6位为要为-符号,其他的必须要为数字,比如12-456-89,然后将-符号去掉,得到一个7位数,将这个数转成十六进制后存储在esi中。接下来再接着分析edi是怎么来的了。
在这里插入图片描述
通过断点调试发现以上规律,即对每一位进行取值后,都进行这个整数的长度次的幂运算,现在长度为7即,每位数都进行7次方的处理,然后加所有的结果进行相加,最后要和这个数本身相同。那这样就可以写出注册机了

#include <stdio.h>

int main() {
    int nums = 7;

    // 1. 预计算0-9的nums次幂(避免重复计算)
    int powers[10];
    for (int digit = 0; digit < 10; digit++) {
        int power = 1;
        for (int exp = 0; exp < nums; exp++) {
            power *= digit;
        }
        powers[digit] = power;
    }

    // 2. 精确计算范围(避免浮点数误差)
    int start_num = 1;
    for (int i = 1; i < nums; i++) {
        start_num *= 10;
    }
    int end_num = start_num * 10;

    // 3. 优化数字分解(避免使用字符串转换)
    for (int i = start_num; i < end_num; i++) {
        int n = i;
        int sum = 0;

        // 直接分解数字的每一位
        while (n > 0) {
            int digit = n % 10;  // 获取最后一位数字
            sum += powers[digit]; // 使用预计算结果
            n /= 10;             // 移除最后一位
        }

        if (sum == i) {
            // 4. 将数字格式化为 xx-xxx-xx 样式
            int part1 = i / 100000;      // 前两位 (除以100000)
            int part2 = (i / 100) % 1000; // 中间三位 (除以100后取后三位)
            int part3 = i % 100;         // 后两位 (模100)

            // 使用 %02d 确保两位数格式,不足补零
            printf("%02d-%03d-%02d\n", part1, part2, part3);
            break; // 找到第一个符合条件的数就退出
        }
    }

    return 0;
}

自己先写了一个,但是用的循环及使用pow函数的方法,效率比较低,让ai优化了下,香!
在这里插入图片描述
搞定
在这里插入图片描述
后来查了下资料,还挺有意思的,只能说编程知识真的少,又进步了!

水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个数位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
一位自幂数:独身数
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数

水仙花数又称阿姆斯特朗数。
三位的水仙花数共有4个:153,370,371,407;
四位的四叶玫瑰数共有3个:1634,8208,9474;
五位的五角星数共有3个:54748,92727,93084;
六位的六合数只有1个:548834;
七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;
八位的八仙数共有3个:24678050,24678051,88593477;
九位的九九重阳数共有4个: 146511208,472335975,534494836,912985153;
十位的自幂数只有1个:4679307774
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baynk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值