[2019红帽杯]easyRE
查壳
无壳,64位elf文件
分析
首先没找到什么有用的函数,用shift + 12
搜索字符串
定位这个字符串
x追踪到函数
首先关注这里第一个for循环,按tab到汇编界面查看
这是个简单的异或,写一下脚本
a = [73,111,100,108,62,81,110,98,40,111,99,121,127,
121,46,105,127,100,96,51,119,125,119,101,107,
57,123,105,121,61,126,121,76,64,69,67]
hint = ''
for i in range(len(a)):
hint += chr(a[i] ^ i)
print(hint)
得到hint : Info:The first four chars are flag
第二个加密
跟进sub_400E44
函数
查看里面的aAbcdefghijklmn
字符串:
很明显这是一个base64加密
将off_6CC090
变量进行解密
十次base64解密
得到https://bbs.pediy.com/thread-254172.htm
点进去是看雪论坛的一篇文章,但没有什么与flag有关的内容
后面其实就没思路了,后面也是看的别的大佬的wp:
最后加密
点进off_6CC090
这里还有一大串字符串,对着变量名按x找到函数,f5反汇编
直接关注这个for循环
if ( (v1 ^ byte_6CC0A0[0]) == 'f' && (HIBYTE(v4) ^ byte_6CC0A3) == 'g' )
{
for ( j = 0; j <= 24; ++j )
sub_410E90((byte_6CC0A0[j] ^ *(&v4 + j % 4)));
}
这里最主要是拿byte_6CC0A0
与v4
进行异或
byte_6CC0A0
是已知的
现在就是要求v4
关注上面的if判断,让v1
第一个字节与byte_6CC0A0[0]
进行异或和让v4
(v4就是v1)高字节(也就是最后一个字节与byte_6CC0A3
第一个字节进行异或,分别得到字符f和g
因此猜测v4与byte_6CC0A0
前四字节进行异或得到字符串flag
(逆向七分技术三分猜说是)
为什么v4是四字节,可以从这里看到v4是unsigned int
变量,从其在rsp寄存器中的位置也能知道他是4字节
因此便可写脚本得到v4
并进行后面的for循环异或得到flag
enc = [0x40,0x35,0x20,0x56,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B]
key = []
enc2 = 'flag'
flag = ''
for i in range(len(enc2)):
key.append(ord(enc2[i]) ^ enc[i])
for i in range(len(enc)):
flag += chr(enc[i] ^ key[i % 4])
print(flag)
flag{Act1ve_Defen5e_Test}