XCTF-reverse-高手进阶 write up

2019-07-16  本文已影响0人  Pig_deng饲养员

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脱壳工具

上一篇下一篇

猜你喜欢

热点阅读