美文网首页
XCTF-reverse-高手进阶 write up

XCTF-reverse-高手进阶 write up

作者: Pig_deng饲养员 | 来源:发表于2019-07-16 21:31 被阅读0次

    dmd-50

    1. 用ida打开后查看伪码看到一长串数字,将数字转化成字符串780438d5b6e29db0898bc4f0225935c0

      数字
    2. 伪码中有看到md5函数,用strings命令也能查看到程序中有md5函数,因此猜测是md5加密,用Md5解密得到字符串grape

    3. 到这一步!!!没想到还要再次md5加密,只需要用md5将上一步得到的grape加密即可,得到的字符串即为flag。

    万万没想到,要Md5两次。还以为md5解密结果错了。。

    shuffle

    ida打开后同样发现一长串数字,将数字转成字符后就是flag。

    re2-cpp-is-awesome

    1. 先运行程序,发现程序要求输入Flag。

    2. ida查看伪码,找到字符串better luck next time的位置,在伪码循环中发现一个比较,如果不相等则输出该字符串,因此猜测比较的字符串值即为正确的flag。如下图所示:

      伪码字符串比较位置.png
    3. 可以看到字符串同off_6020A0dword_6020c0偏移字符串进行比较,因此找到两个位置,可以看到off_6020A0是一串奇怪的字符串,而dword_6020c0则为一串数字,结合伪码形式可知flag即为6020A0处对应偏移位置的字符。切换到十六进制窗口更容易看清楚。

      字符串.png
      十六进制视图.png
    4. 编写代码求得flag:

    a = [0x24, 0x0, 0x5, 0x36, 0x65, 0x7, 0x27, 0x26, 0x2d,0x1, 0x3, 0x0, 0x0d, 0x56, 0x1, 0x3, 0x65, 0x3, 0x2d, 0x16, 0x2, 0x15, 0x3, 0x65, 0x0, 0x29, 0x44, 0x44, 0x1, 0x44, 0x2b ]
    b = 'L3t_ME_T3ll_Y0u_S0m3th1ng_1mp0rtant_A_{FL4G}_W0nt_b3_3X4ctly_th4t_345y_t0_c4ptur3_H0wev3r_1T_w1ll_b3_C00l_1F_Y0u_g0t_1t'
    
    for k in a:
        c += b[k]
    
    print(c)
    
    1. 循环里面是一个典型的c++迭代器循环,该程序的源代码应该是:
    string strIn = argv[1];
    vector<char>::iterator iter;
    int nIndex=0;
    for(iter=ivec.begin();iter!=ivec.end();++iter)
    {
        if(*iter != off_6020A0[dword_6020C0[nIndex]])       
        {
            cout<<"wrong";
        }
        ++ nIndex;
    }
    

    crackme

    1. 用ida打开发现找不到可读字符串同时显示段信息被破坏,使用PEid查看是否加壳,结果显示为nSPack加壳,如下图所示,使用相应的脱壳工具脱壳。


      nsPack加壳.png
    2. 使用工具脱壳后再用ida打开,查看main函数伪码,如下图所示,可以看出程序的思路是非常清晰地,输入flag然后while循环进行异或比较,如果正确显示"right",否则显示“error!”,而且由第一个if可知flag的长度为42:


      主函数伪码.png
    3. 重点看while循环处的语句,该语句为:将输入的字符串同byte_402130处的字符串进行循环异或,结果与dword_402150处的字符串进行比较,其中v4为循环变量。因此找到两个位置的字符串,进行循环异或即可得到flag。
      字符串位置.png
      402130处字符.png
      402150处字符.png
    4. 代码如下:
    x1 = ['74', '68', '69', '73', '5f', '69', '73', '5f', '6e', '6f', '74', '5f', '66', '6c', '61', '67']
    x2 = ['12', '04', '08', '14', '24', '5c', '4a', '3d', '56', '0a', '10', '67', '0', '41', '0', '1', '46', '5a', '44', '42', '6e', 
    '0c', '44', '72', '0C', '0D', '40', '3E',  '4B', '5F', '02', '01',  '4C', '5E', '5B', '17', '6E', '0C', '16', '68', '5B', '12']
    
    for i,k in enumerate(x2):
        c += chr(int(k,16) ^ int(x1[i%16], 16))
    
    print(c)
    

    看雪论坛里找到的nSPack脱壳工具

    相关文章

      网友评论

          本文标题:XCTF-reverse-高手进阶 write up

          本文链接:https://www.haomeiwen.com/subject/znqxlctx.html