吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2017|回复: 2
收起左侧

[会员申请] 申请会员ID:hujiayucc【申请通过】

[复制链接]
吾爱游客  发表于 2023-9-7 04:27
1、申请ID:hujiayucc
2、个人邮箱:hujiayucc@qq.com
3、3、原创技术文章:

前言

对于这次解密Flag拿奖励的活动被终止,我深表歉意,希望大家下次能积极参与进来。其次,能不能解开Flag都是无关紧要的,我的初衷是能调动大家一起学习网安知识,分享网络/编程技术。

本CM已开源:https://github.com/hujiayucc/Crackme2


解密过程

调试环境

  • Debian buster Arm64
  • Termux OpenSSH
  • Radare 5.8
  • g++/clang++(用于编译运行payload)

注:可用gcc/clang平替g++/clang++

Crackme2

简单查看一下ELF文件,可以发现是一个UPX压缩壳,脱壳方法有很多,可以通过DUMP内存来获取源程序的代码,也可以通过UPX官方提供的工具来解压,网上教程很多不过多介绍。

解密后用Radare2分析

跳转定位到main函数

没有发现有价值的线索,简单阅读一下汇编:

str w0, [sp, 0x1c]  ; 第一个参数
str x1, [sp, 0x10]   ; 第二个参数的第二个元素数据 例如args[1]
cmp w0, 1             ; 判断第一个参数是否为1
; ...忽略为1代码段....
adrp x0, map._root_Crackme2_Crackme2.rw_ ; 将map._root_Crackme2_Crackme2.rw_地址存到x0寄存器
ldr x0, [x0, 0xfb8]   ; 将x0 + 0xfb8的地址加载到x0寄存器
str x1, [x0]               ; 将x1的数据写入x0,x0=0x5f24b05000

也就是将输入的参数赋值给了0x5f24b05000地址!

这里再讲一下ELF文件的代码执行顺序,main并非是最先执行的,也不是最后执行的,从入口进入如果有其他函数存在,就不会最先执行main,相同道理程序运行结束也是,所以之前有人粗心没注意看entry入口,说我CM写的有问题。

这里没有发现entry.init,自动忽略,直接来看到entry.fini:

汇编语法上面做了简要说明,这里不一一介绍了(懒得码字/doge)
这里是通过sym.imp.dlsym函数加载了一个外部动态库,动态库名字地址为0x5f24b05fa0,我们打印看一下

check为sym.imp.dlsym加载的函数或变量/常量,下面对check进行了传参,那说明是一个函数。
传入的数据0x5f24b05fb8正是我们输入的参数,显而易见了,是验证flag。

这里讲个小知识,在Linux中可以使用ldd命令查看可执行文件link的库文件~

libxy.so


从汇编代码中看到

stp x29, x30, [sp, -0x20]!  ; 调用了一个地址-0x20的函数
; 这里传入两个参数,第一个参数为传入的flag
stp x19, x20, [sp, 0x10]
mov x19, x0
; 第二个为flag的长度
bl sym.imp.strlen
mov w1, w0
mov x0, x19

直接转到-0x20地址

看到verify函数了,这里有一个循环判断,判断flag字符是否为第一个
有多层异或代码,反汇编看一下伪代码

简化一下代码

bool verify(long *param_1, int param_2)
{
        for (int i = 0;i < param_2)
        {
                long *l = *(0xbd0 + i);
                switch (i)
                {
                        case 0:
                                if (l != (param_2 ^ (0xc6e6 | 0xbb0000) ^ param_1[i])) return false;
                                break;
                        default:
                                if (l != (i * (0x5677 | 0x1310000) ^ param_1[i]) ^ param_2) return false;
                                break;
                }
        }
    return param_2 == 0x17;
}

这里调用了0xbd0地址的数据,循环了23次,每次往后推8个字节,由此我们可以这样做

然后我们可以写个小小的exp来输出为16进制:

#include <iostream>

using namespace std;

const long buffer[23] = {
    12306071, 20010508, 40021144, 60031765,
    80042416, 100053036, 120063727, 140074275,
    160084895, 180095570, 200106113, 220116835,
    240127410, 260138109, 280148645, 300159127,
    320169809, 340180357, 360191096, 380201633,
    400212334, 420222903, 440233552
};

int main()
{
        for (int i = 0;i < 23;i++)
    {
        cout << "0x" << hex << buffer[i] << ", ";
    }

    cout << endl;
}

也可以不转换,我这儿转换只是为了看着舒服(被编程惯坏了)

payload

根据上面解析出来的验证规则,写一个payload,实现自动输出flag

#include <iostream>

using namespace std;

const long buffer[23] = {
    0xbbc697, 0x131560c, 0x262ac98,
    0x3940315, 0x4c559b0, 0x5f6b02c,
    0x72806ef, 0x8595d23, 0x98ab39f,
    0xabc0a52, 0xbed6081, 0xd1eb763,
    0xe500db2, 0xf81647d, 0x10b2baa5,
    0x11e41097, 0x13156751, 0x1446bd85,
    0x15781478, 0x16a96aa1, 0x17dac16e,
    0x190c17b7, 0x1a3d6e50,
};

int get(long l, int i)
{
    if (i == 0) return (23 ^ (0xc6e6 | 0xbb0000) ^ l);
    else return (i * (0x5677 | 0x1310000) ^ l ^ 23);
}

int main()
{
        for (int i = 0;i < 23;i++)
    {
        cout << ((char) get(buffer[i], i));
    }

    cout << endl;
}

得到flag以后直接进行验证

验证成功!!!

挂个payload2

#include <dlfcn.h>
#include <iostream>

using namespace std;

int get(long l, int i, int ii)
{
    if (i == 0) return l ^ ((2001L*615*1950/195) ^ ii);
    return (l ^ (20010615*i)) ^ ii;
}

int main()
{
    void *handle = dlopen("libxy.so", RTLD_LAZY);
    if (handle == NULL) exit(-1);
    long *buffer = (long*) dlsym(handle, "buffer");
    char flag[23] = {};
        for (int i = 0;buffer[i] > 0;i++)
    {
        flag[i] = get(buffer[i], i, 23);
    }
        cout << flag << endl;;
    dlclose(handle);
}

总结

本次讲解希望大家能多多学习相关知识,之后还会推出不同难度的Crackme,包括但不限于这次已经讲解的内容。重在参与,主要以分享知识为目的!!!

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

Hmily 发表于 2023-9-7 15:51
I D:hujiayucc
邮箱:hujiayucc@qq.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

PS:登录后文章整理一下发到脱壳破解区。
hujiayucc 发表于 2023-9-7 18:30
Hmily 发表于 2023-9-7 15:51
I D:hujiayucc
邮箱:hujiayucc@qq.com

来报道了,这就去整理一下文章
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-15 10:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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