XCTF-reverse-高手进阶 write up
2019-07-16 本文已影响0人
Pig_deng饲养员
dmd-50
-
用ida打开后查看伪码看到一长串数字,将数字转化成字符串
数字780438d5b6e29db0898bc4f0225935c0
。
-
伪码中有看到
md5
函数,用strings
命令也能查看到程序中有md5
函数,因此猜测是md5加密,用Md5解密得到字符串grape
。 -
到这一步!!!没想到还要再次md5加密,只需要用md5将上一步得到的
grape
加密即可,得到的字符串即为flag。
万万没想到,要Md5两次。还以为md5解密结果错了。。
shuffle
ida打开后同样发现一长串数字,将数字转成字符后就是flag。
re2-cpp-is-awesome
-
先运行程序,发现程序要求输入Flag。
-
ida查看伪码,找到字符串
伪码字符串比较位置.pngbetter luck next time
的位置,在伪码循环中发现一个比较,如果不相等则输出该字符串,因此猜测比较的字符串值即为正确的flag。如下图所示:
-
可以看到字符串同
字符串.pngoff_6020A0
处dword_6020c0
偏移字符串进行比较,因此找到两个位置,可以看到off_6020A0
是一串奇怪的字符串,而dword_6020c0
则为一串数字,结合伪码形式可知flag即为6020A0
处对应偏移位置的字符。切换到十六进制窗口更容易看清楚。
十六进制视图.png -
编写代码求得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)
- 循环里面是一个典型的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
-
用ida打开发现找不到可读字符串同时显示段信息被破坏,使用PEid查看是否加壳,结果显示为nSPack加壳,如下图所示,使用相应的脱壳工具脱壳。
nsPack加壳.png -
使用工具脱壳后再用ida打开,查看main函数伪码,如下图所示,可以看出程序的思路是非常清晰地,输入flag然后while循环进行异或比较,如果正确显示"right",否则显示“error!”,而且由第一个if可知flag的长度为42:
主函数伪码.png - 重点看while循环处的语句,该语句为:将输入的字符串同
byte_402130
处的字符串进行循环异或,结果与dword_402150
处的字符串进行比较,其中v4为循环变量。因此找到两个位置的字符串,进行循环异或即可得到flag。
字符串位置.png
402130处字符.png
402150处字符.png - 代码如下:
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)