Babyre1
考点:xxtea加解密算法、RCR16校验
第一个函数的作用是将我们输入的16位数据变成对应的hex值
动态调试结果如下:
我们输入1234567890123456
返回值为8
第二个函数里面有xxtea解密操作
v8是密文,v7是秘钥,中间的数为负数表示是解密操作,正数即为加密操作
跟进去看看为什么是xxTEA算法
在我们对比了xxtea源码的时候,我们就可以看出这是个xxtea解密操作
在第二个函数中还有一个关键的点
这里表示最后一位应该是小于4
第三个函数就是CRC16校验,但是只对前6位做了校验,并没有对后两位做校验,所以hint中又加入了一个md5值来限定多解问题
如果我们的答案正确,我们将的到Bingo!,这个是我们输入异或上0x17的结果。
这样我们前6位可以找到,后面的两位暂时不确定
因为有md5值,我们可以选着爆破后面两位
最后一位是小于4的,爆破可以选着在0到4中考虑,再上一张图中我们可以确定最后一位是2
现在只需要爆破一位就可以达到我们的目的
xxtea的秘钥是这样的:
直接写脚本爆破
import xxtea
import hashlib;
def decrypt(text,key):
return xxtea.decrypt(text, key,padding=False);
def encrypt(text,key):
return xxtea.encrypt(text, key,padding=False);
key = [0xc7,0xe0,0xc7,0xe0,0xd7,0xd3,0xf1,0xc6,0xd3,0xc6,0xd3,0xc6,0xce,0xd2,0xd0,0xc4]
key = ''.join( [ chr(i) for i in key ] );
cipher = [0x55,0x7e,0x79,0x70,0x78,0x36,0,0];
for i in range(0xff):
print i;
for j in range(4):
cipher[6]=i;
cipher[7]=j;
t = encrypt( ''.join( [ chr(k) for k in cipher ] ) , key);
t = t.encode('hex');
t = "rctf{" + t + "}"
# print i,j,t;
# print hashlib.md5(t).hexdigest()
if ( hashlib.md5(t).hexdigest()=="5f8243a662cf71bf31d2b2602638dc1d" ):
print 'get!!!!!!!!!!!!!!!!!!!';
print t;
babyre2
同样是64位的ELF文件
因为出题人使用异或手段将关键字符串给隐藏起来,不过直接动态调试就可以看到各个关键字符串
结合动态分析,一个一个函数的看
sub_55f806c0691a这个函数是对用户名进行输入:
可以看到输入的用户长度为8到16,并没有对输入有具体的要求
第二个函数就是输入密码:
密码的输入长度也是在8到16之间,同时对输入的内容作出了限制,ascii码在9到99之间
再输入data前有一个函数对输入的用户名进行了处理
这里是用我们输入的用户名作为xxTEA加密的秘钥,对v8进行加密,得到一个字符串s1
然后看我们输入data,data的数据长度为1到1024,对输入也是做了限制的,只能是0~9a~fA~F
总体的逻辑就是用户作为xxtea的秘钥对字符串加密生成字符串s1
输入的密码作为索引在我们输入的data中寻找字符作为s2,然后又使用xxtea进行加密,指套最后一位小于4就可以得到flag
但是这个题目是放在服务器上进行验证的,后面的就不是那么会分析。(5555555)
ps后面还有几个要复现,这个月底2020RCTF就要开始了,加油