wdb ctf re

一共有四道re题,两题apk,两题exe
apk本菜鸡完全不会,过了过了

然后就是

signal


这题就是一个 switch

用switch把操作分离,然后用一串数据来实现类似指令的效果,从而实现功能
首先找到输入字符串
char a[] = {
    0x0A,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
    0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
    0x20,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
    0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
    0x0B,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
    0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,
    0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x21,0x00,0x00,0x00,
    0x01,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,
    0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
    0x03,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
    0x51,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x24,0x00,0x00,0x00,
    0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,
    0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
    0x02,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
    0x36,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x41,0x00,0x00,0x00,
    0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
    0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,
    0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x25,0x00,0x00,0x00,
    0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
    0x03,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
    0x41,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
    0x07,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,
    0x07,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x32,0x00,0x00,0x00,
    0x07,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x33,0x00,0x00,0x00,
    0x07,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xA7,0xFF,0xFF,0xFF,
    0x07,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xF1,0xFF,0xFF,0xFF,
    0x07,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x84,0xFF,0xFF,0xFF,
    0x07,0x00,0x00,0x00,0xC1,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,
    0x07,0x00,0x00,0x00,0x7A,0x00,0x00,0x00,0x90,0x20,0x40,0x00,0x00,0x00,0x00,0x00,
    0x26,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x29,0x6E,0x00,0x26,0x00,0x00,0x00
};
然后是用int型的,其实也没多少个

然后把ida里的加密函数拷贝一下,稍微修改一下

int vm_operad(int *a,int a2)
{
    int i = 0;
    int v6 = 0;
    int v7 = 0;
    int v8 = 0;
    int v9 = 0;
    char v4[100] = {NULL};
    char v3[100] = {NULL};
    int v5 = 0;
    while(1)
    {
        if(i >= a2)
            break;
        switch(a[i])
        {
        case 1:v4[v7] = v5;
        ++i;
        ++v7;
        ++v9;break;
        case 2:v5 = a[i+1] + v3[v9]; i+=2;break;
        case 3:v5 = v3[v9] - a[i+1]; i+=2;break;
        case 4:v5 = a[i+1] ^ v3[v9]; i+=2;break;
        case 5:v5 = a[i+1] * v3[v9]; i+=2;break;
        case 6:i++;break;
        case 7:v4[v8] == a[i+1]; v8++; i+= 2;break;
        case 8:v3[v6] = v5; i++; v6++;break;
        case 9:;;;break;
        case 10:{
            printf("string\n");
            scanf("%s",v3);
            i++;
                };break;
        case 11:v5 = v3[v9] - 1; i++;break;
        case 12:v5 = v3[v9] + 1; i++;break;
        default:;break;
        }
        printf("%d,%d\n",i,a[i]);                                       //获得流程 存放到b数组中,因为这题不能逆推顺序
    }
    printf("\n\n\n\n\nv6 = %d\nv7=%d\nv8=%d\nv9=%d\n",v6,v7,v8,v9);           //输出这些数组最后的值
    return 1;
}

然后进行逆算法

int devm_operad(unsigned int *a,int a2)
{
    int i;
    int j = a2-1;
    int v5;
    int v6 = 15;
    int v7 = 15;
    int v8 = 15;
    int v9 = 15;
    unsigned char v4[100] = {NULL};             //不用unsigned 进行除法会有问题
    unsigned char v3[100] = {NULL};

    while(1)
    {
        if(j < 0)
            break;
        i = b[j];
        if(i == 70)
        {
            printf("0");
            printf("%s",v4);
        }
        switch(a[i])
        {
        case 1: v7--;v9--;        v5 = v4[v7];break;
        case 2:                 v3[v9] = v5 - a[i+1];break;
        case 3:                 v3[v9] = v5 + a[i+1];break;
        case 4:                 v3[v9] = a[i+1]^v5;break;
        case 5:                 v3[v9] = v5/a[i+1];break;
        case 6:                 break;
        case 7: v8--;            v4[v8] = a[i+1]; break;
        case 8:v6--;            v5 = v3[v6];break;
        case 10:                break;
        case 11:                v3[v9] = v5+1;break;
        case 12:                v3[v9] = v5-1;break;
        default:;break;
        }
        j--;
        printf("%d,%d\n",i,a[i]);
    }
    printf("%d %d %d %d\n",v6,v7,v8,v9);
    printf("flag{%s}",v3);                                        //直接打印值,完事
    return 0;
}

然后是

joker



所以输入字符串为24位
wrong+omg 都是无效操作,恶心人的
然后是重点 代码段被简单加密了
整个代码段进行了 xor 0x41

od 断点下到这个循环做完//然后把内存dump下来,我不会,所以直接看着汇编翻译的

大致翻译成这样,就是取用户输入和hahahaha_do_you_find_me?进行异或运算
即用户输入[i] xor hahaha[i] = 403040[i]                 // 403040是一次+4位其他两个数组都是+1

然后最后是脑洞,这个是真的坑人

有个字符串d[] = 25 74 70 26 3A

代码里有个time(0) srand(),rand() 然后比较 (用户输入[0] != d[0]) == rand()
这段代码有用的就一个字符串

然后根据 最后一位是}        猜是xor操作//我没猜出来
char k = '}' xor 0x3A


    for(int i = 0; i < 5; i++)
    {
        putchar(b[i]^a);
    }
解决

wtcl

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值