DASCTF八月挑战赛 re
2021-09-13 18:59:00 Author: mp.weixin.qq.com(查看原文) 阅读量:42 收藏


本文为看雪论坛优秀文章
看雪论坛作者ID:The_Itach1
做完了逆向,不得不说das的re还是比较友好的。

py

得到文件py.exe,肯定就是考python打包成exe文件了。可以参考文章
https://blog.csdn.net/m0_37552052/article/details/88093427
 
用pyinstxtractor.py还原
 
python pyinstxtractor.py [filename]
 
得到文件夹,看到里面有个py.pyc,直接还原不行,用文章里面的方法还原pyc头文件,如果想学习pyc还可以看看这篇文章
https://zhuanlan.zhihu.com/p/145811103

得到py文件。
# uncompyle6 version 3.7.4# Python bytecode 2.7 (62211)# Decompiled from: Python 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)]# Embedded file name: py.py# Compiled at: 1995-09-28 00:18:56  def encode(s):    str = ''    for i in range(len(s)):        res = ord(s[i]) ^ 32        res += 31        str += chr(res)     return str  m = 'ek`fz13b3c5e047b`bd`0/c268e600e7c5d1`|'strings = ''strings = input('Input:')if encode(strings) == m:    print 'Correct!'else:    print 'Try again!'

很简单。
m = 'ek`fz13b3c5e047b`bd`0/c268e600e7c5d1`|'str=''for i in m:  str+=chr((ord(i)-31)^32)print(str)#flag{24c4d6f158cacea10d379f711f8d6e2a}


apkrev

简单的apk逆向,加密函数和密文都在so文件的mycheck中,有经验的话不难看出是rc4,看不出来也没关系,反正最后就是一个异或,动调把异或数组取出来就行了,动调apk方法在https://the_itach1.gitee.io/2021/08/02/D0g3%E6%AF%94%E8%B5%9B%E5%B9%B3%E5%8F%B0%20re%20wp/的medical_app
 
由于比较懒,不想一个一个调,就直接输入了个错误flag,然后得到假密文,去得到异或的数组。好像rc4的key是12345678,可能也可以用rc4来做。
fake_code=[   0xDD, 0x9F, 0x58, 0xB3, 0x72, 0xD0, 0xBC, 0xC4, 0x94, 0x56,  0x6C, 0xA8, 0xCE, 0x54, 0x62, 0xCE, 0x1E, 0xF3, 0xF3, 0x26,  0xB9, 0x19, 0x0F, 0xC6, 0x2D, 0x6E, 0xA3, 0xC0, 0x21, 0xD4,  0x99, 0x13]fake_flag='flag{abcdefghijklmnopqrstuvwxyz}'enc=[0x8C, 0xC4, 0x00, 0xE6, 0x6A, 0x88, 0xB8, 0x90, 0xC2, 0x07,  0x6B, 0xA9, 0xC3, 0x0A, 0x3E, 0xC0, 0x44, 0xA6, 0xFE, 0x7E,  0xF0, 0x59, 0x4C, 0x83, 0x3D, 0x2B, 0xE2, 0xD3, 0x38, 0xCB,  0x82, 0x5B]for i in range(32):  print(chr(ord(fake_flag[i])^fake_code[i]^enc[i]),end='')#7792c9f724afe76e68c79116d07dafa5


LittleJunk

题刚出来2分钟就有人直接秒了,可能是出题人。
 
就是有很多花指令,来干扰分析,动调就好了,main函数前面一大部分感觉都是用来解密函数代码的,真正要看的地方在(loc_584000)(&v19);
 
进去可以看到,图片里面忘了说sub_581FA0应该也是用来解密函数代码的。

然后先看看rc4吧:

retn后,32字节转4*8。
 

魔改的tea。
 
然后解密:
#include<stdio.h>void encrypt(unsigned __int64 *code , unsigned __int64 *key){    unsigned __int64 delta=0x9E3779B9;   unsigned __int64 tmp1,tmp2,tmp3,tmp4,key1,key2,key3,key4,d;   int i;     tmp1=code[0];    tmp2=code[1];    tmp3=code[2];    tmp4=code[3];     key1=key[0];    key2=key[1];    key3=key[2];    key4=key[3];     for(i=0;i<32;i++)    {        d+=delta;        tmp1 += (key2 + (tmp2 >> 5)) ^ (d + tmp2) ^ (key1 + 16 * tmp2);        tmp2 += (key4 + (tmp1 >> 5)) ^ (d + tmp1) ^ (key3 + 16 * tmp1);        tmp3 += (key2 + (tmp4 >> 5)) ^ (d + tmp4) ^ (key1 + 16 * tmp4);        tmp4 += (key4 + (tmp3 >> 5)) ^ (d + tmp3) ^ (key3 + 16 * tmp3);    }    code[0]=tmp1;    code[1]=tmp2;    code[2]=tmp3;    code[3]=tmp4;} void decrypt(unsigned __int64 *code , unsigned __int64 *key){    unsigned __int64 delta=0x9E3779B9;   unsigned __int64 sum=delta*32;// sum=0x13C6EF3720   unsigned __int64 tmp1,tmp2,tmp3,tmp4,key1,key2,key3,key4;   int i;     tmp1=code[0];    tmp2=code[1];    tmp3=code[2];    tmp4=code[3];     key1=key[0];    key2=key[1];    key3=key[2];    key4=key[3];     for(i=0;i<32;i++)    {        tmp4 -= (key4 + (tmp3 >> 5)) ^ (sum + tmp3) ^ (key3 + 16 * tmp3);        tmp3 -= (key2 + (tmp4 >> 5)) ^ (sum + tmp4) ^ (key1 + 16 * tmp4);        tmp2 -= (key4 + (tmp1 >> 5)) ^ (sum + tmp1) ^ (key3 + 16 * tmp1);        tmp1 -= (key2 + (tmp2 >> 5)) ^ (sum + tmp2) ^ (key1 + 16 * tmp2);        sum-=delta;    }    code[0]=tmp1;    code[1]=tmp2;    code[2]=tmp3;    code[3]=tmp4;} int main(){    unsigned __int64 code[4]={0x0E990A522BE80F786,0x8B836286B8A5EB59,0x2FDE61CCEFC70FF8,0x56BC19E119C8B07B},key[4]={0x54466076484C5476,0x4550504F765F4344,0x5A796F755F6D6179,0x5F6E6565645F7468};     //encrypt(code,key);    decrypt(code,key);    printf("%016llx%016llx%016llx%016llx",code[0],code[1],code[2],code[3]);}//505a4cc462489e8003aef16b785c7501343057844ff5acb809616159f51713f3
enc = bytearray.fromhex('505a4cc462489e8003aef16b785c7501343057844ff5acb809616159f51713f3')fake_flag='abcdefghijklmnopqrstuvwxyzabcdea'xor=[0x00000005,0x00000059,0x0000001a,0x000000c3,0x00000037,0x00000048,0x000000c8,0x0000008a,0x0000005f,0x000000a7,0x000000f9,0x00000030,0x00000073,0x00000004,0x0000002a,0x00000014,0x0000007c,0x00000073,0x0000001c,0x000000c6,0x0000000b,0x000000b2,0x000000ec,0x000000f2,0x00000041,0x00000078,0x00000038,0x0000000c,0x000000f4,0x00000012,0x00000046,0x000000a5]flag=''for i in range(32):  flag+=chr((ord(fake_flag[i])^xor[i]^enc[i]))flag='flag{'+flag+'}'print(flag)#flag{4a5c0f1b5cc7f60e918611721c87ba07}

 

看雪ID:The_Itach1

https://bbs.pediy.com/user-home-926755.htm

*本文由看雪论坛 The_Itach1 原创,转载请注明来自看雪社区

# 往期推荐

1. 对使用系统调用进行收发包的frida hook抓包

2. 恶意样本分析——XOR加密与进程注入

3.超级长的IE调试总结:CVE-2013-1347 IE CGenericElement UAF漏洞分析

4. MS17-010 “永恒之蓝”漏洞分析与复现

5. 11个小挑战,Qiling Framework 入门上手跟练

6. VMP导入表修复

公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458392508&idx=1&sn=e60b11a27f9ef2c9b55189c8cca6dbd8&chksm=b18f273686f8ae20ba53ee897f8ae9069f2fe80eb0853184b4b0b9310596b9be0dfb81967201#rd
如有侵权请联系:admin#unsafe.sh