zoukankan      html  css  js  c++  java
  • hgame week4 re

    RE

    1,secret

    elf,用ida打开,从main中看不到什么,经过调试发现是个假的main找到真正的main

     先看的第一个函数

     在这里卡了好久,我开始一直以为是在这里加密的,加密后与unk_6032E0相比对,因为对加密算法不熟悉,对上图中hash256的分析耗了将近两天,当我分析出是hash256的时候简直崩溃~

    不过得到这个结果,确定了此处不是关键,看下一函数

     在这个函数里找到了

     对这个函数进行分析

     

     可以得出是XTEA加密,但是这一串sigaction打的我有点懵,经过了一天时间四处查,得到了我不用在意sigaction的结论(╯' - ')╯┻━┻

    于是再次调试,得到了key

    k[4]={0x42655F29,0x9E822EFC,0xDA278C92,0x4E355A62}

    unk_603200为

    E9C8A927 B473A9BA F972C0AA 0080FAA3 D3C2F4D9 C56B3FFB 5ED9D3D3 
    771D9686 3FC500E6 B927BC98 ACC3AA09 2424DC6A 04E30506 778CE765 

    之前的分析中我得到了每两个32位的数进行XTEA,所以解密时要改为

    27A9C8E9 BAA973B4 AAC072F9 A3FA8000 D9F4C2D3 FB3F6BC5 D3D3D95E
    86961D77 E600C53F 98BC27B9 09AAC3AC 6ADC2424 0605E304 65E78C77
    #include <stdio.h>
    #include <stdint.h>
    void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
        unsigned int i;
        uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
        for (i=0; i < num_rounds; i++) {
            v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
            sum -= delta;
            v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
        }
        v[0]=v0; v[1]=v1;
    }
    
    int main()  {
        uint32_t v[2]={0x0605E304,0x65E78C77};
        uint32_t const k[4]={0x42655F29,0x9E822EFC,0xDA278C92,0x4E355A62};
        unsigned int r=32;
        printf("解密前原始数据:%x %x
    ",v[0],v[1]);
        decipher(r, v, k);
        printf("%u 解密后的数据:%x %x
    ",r,v[0],v[1]);
    
        return 0;
    }

    于是得到

    6d616768 6f4e7b65    hgame{No
    654e305f 4e34635f    _0Ne_c4N
    5f30745f 405f6542    _t0_Be_@
    6174245f 68542e52    _$taR.Th
    735f7933 4c6c3174    3y_st1lL
    6e41435f 4e34635f    _CAn_c4N
    3148735f 7d2e336e    _sH1n3.}

    得到flag

    2,easyvm

    拖进ida,

    将一些数据,和我们的flag进行处理,vm函数有一些switch,可以看出是vm题(当然题目告诉我了)

    a1就是加密的处理

    按正常思路分析虚拟机指令,可以看到要了一段内存,应该是作为栈,就从可以看出push和pop

    本来想分析清楚每个操作,但在调试中发现了其实关键就是xor操作

    而异或的值在

     就是此时rax的值,那么

    c=[0x3A,0x54,0x2F,0x2A,0x2F,0x36,0x13,0x01,0x2E,0x03,0x35,0x40,0x47,0x0E,0x5F,0x59,0x01,0x69,0x27,0x08,0x3D,0x4C,0x33,0x1A,0x2D,0x0B,0x40,0x0E,0x4B,0x24,0x41,0x27,0x25,0x28,0x29,0x2A,0x02,0x02,0x5D,0x24]
    x=[0x52,0x33,0x4e,0x47,0x4a,0x4d,0x67,0x69,0x47,0x70,0x6a,0x36,0x2a,0x51,0x36,0x2a,0x5e,0x36,0x54,0x67,0x4e,0x23,0x40,0x75,0x5e,0x64,0x33,0x61,0x38,0x4b,0x32,0x48,0x56,0x47,0x76,0x4f,0x63,0x71,0x24,0x59]
    
    for i in range(len(c)):
        print(chr(c[i]^x[i]),end='')

    得到flag(感觉有点对不起这道题( ‘ _ ‘ ))

  • 相关阅读:
    套题 codeforces 361
    hdu 5720
    套题 codeforces 360
    套题 codeforces 359
    套题 bestcoder 84
    hdu 5748(求解最长上升子序列的两种O(nlogn)姿势)
    观django-messages包笔记
    django form
    省份、城市、区县三级联动Html代码
    django perm用法
  • 原文地址:https://www.cnblogs.com/harmonica11/p/12292804.html
Copyright © 2011-2022 走看看