首页
社区
课程
招聘
[讨论]buuctf两道休闲题(2021羊城杯babysmc,Crakme)
2022-5-10 21:31 5589

[讨论]buuctf两道休闲题(2021羊城杯babysmc,Crakme)

2022-5-10 21:31
5589

2021羊城杯babysmc

SMC概念

1
2
3
4
5
提前将重要的代码节进行加密,或将加密数据提前存放在内存中,并且配有一个解密函数。
再静态调试中很难观察出有用的信息
这种加密算法可以被用来做免杀,防止特征码被查杀
 
特征:在汇编代码中夹杂大片的数据

解题过程


打开程序按顺序分析发现这一步有一个直接访问内存的Call

 


执行call之后下方数据发生变化

从自解密函数向下找,找到所属的retn,将retn包含的函数体框起来,右键按照图里操作

出现这个窗口选择force,之后就能F5了

跟随动态调试进入解密后的函数,这个程序是变形的base64
四个字母为一组,右移0,2,4,6后,作为v95的角标,分别和0xA6,0XA3,0XA9,0XAC做与运算

输入数组做完以上运算和v84做比较

脚本思路

先将字符串四个一组做与运算的反运算

 

然后和v95数组内的值比较,得到对应的角标

 

将角标字符串做base64反向编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    unsigned char key[] = "H>oQn6aqLr{DH6odhdm0dMe`MBo?lRglHtGPOdobDlknejmGI|ghDb<4";
    int data[] =               
    {   
          0xE4, 0xC4, 0xE7, 0xC7, 0xE6, 0xC6, 0xE1, 0xC1, 0xE0, 0xC0,
          0xE3, 0xC3, 0xE2, 0xC2, 0xED, 0xCD, 0xEC, 0xCC, 0xEF, 0xCF,
          0xEE, 0xCE, 0xE9, 0xC9, 0xE8, 0xC8, 0xEB, 0xCB, 0xEA, 0xCA,
          0xF5, 0xD5, 0xF4, 0xD4, 0xF7, 0xD7, 0xF6, 0xD6, 0xF1, 0xD1,
          0xF0, 0xD0, 0xF3, 0xD3, 0xF2, 0xD2, 0xFD, 0xDD, 0xFC, 0xDC,
          0xFF, 0xDF, 0x95, 0x9C, 0x9D, 0x92, 0x93, 0x90, 0x91, 0x96,
          0x97, 0x94, 0x8A, 0x8E
    };
    int xr[] = {0xA6, 0xA3, 0xA9, 0xAC};
    int i, j;
    unsigned int v3;
    int flag[100] = {0};
 
    for(i = 0; i < 56; i++)
    {
        key[i] ^= xr[i % 4];
//        printf("%d ",key[i]);   
    }
//    printf("\n");
    for(i = 0; i < 56; i++)   
        for(j = 0; j < 64; j++)
            if(key[i] == data[j])
                {
                    key[i] = j;                    
//                    printf("%d:%d ",i,j);
                    break;
                }
    for(i = 0, j = 0; i < 56; i += 4, j += 3)
    {
        v3 = key[i+3] + (key[i+2] << 6) + (key[i+1] << 12) + (key[i] << 18);
        flag[j] = (v3 >> 16) & 0xFF;
        flag[j+1] = (v3 >> 8) & 0xFF;
        flag[j+2] = v3 & 0xFF;
    }
 
    for(i = 0; i < 100; i++)
        printf("%c",flag[i]);
 
    return 0;   
}

Buuctf Crakme

Mains


v3返回值恒定是1
sub_CE1830的返回值为1 ——>Format

 

format=congratulation
v4=pleace try again

Sub_CE1830


Sub_CE1470

脚本

1
2
3
4
box = [0x2a,0xd7,0x92,0xe9,0x53,0xe2,0xc4,0xcd]
a =[100,98,97,112,112,115,101,99]
for i in range(8):
    print(hex(a[i]^box[i])[2:],end = '')

博客:https://qwer597.github.io/


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2022-6-15 10:57 被wx_好一脚头球编辑 ,原因:
收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回