2021虎符Re-GoEncrypt
2021-06-05 18:59:00 Author: mp.weixin.qq.com(查看原文) 阅读量:132 收藏

本文为看雪论坛优秀文章
看雪论坛作者ID:SYJ-Re

GoEncrypt

题目文件下载地址:

链接:

https://pan.baidu.com/s/1CcaW8R02wB6puHSCsY89nQ


提取码:0syj

找到mainmain开始分析:

对main_check的分析,其实就在这个函数里,一个字符串地址给的提示。

然后回到main函数分析这个主要的加密。

点进去之后发现是改了delta的一个xtea加密,

然后分析一下过程,看一下哪些变量对应哪些变量:

这里给个链接,这篇文章中有TEA,XTEA,XXTEA三种加解密的分析。

https://bbs.pediy.com/thread-266933.htm

然后现在我们还需要key和加密后的数据才能解密,分析了加密过程我们知道这个key就是v21,我们随便输入flag{12345678-1234-1234-1234-12345678abcd}满足前面条件的假flag。

然后进行动调:

直接在那条命令的下一条指令下断点F9然后查看V21的值即可得到key,如下图:

得到key为:

{0x10203, 0x4050607, 0x8090A0B, 0x0C0D0E0F};

继续动调,到比较函数的地方下个断点再次F9,然后F7进入比较函数。

慢慢单步,发现cmd rdi, rsi的时候我们可以得到我们想要的加密之后的值(我是连续动调了两次发现这个值没变得出的这个是加密后的数据这个结论的)

得到加密后的值:

0EC311F045C79AF3EDF5D910542702CB

上脚本:

#include <stdio.h>#include <stdint.h>/* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]){    unsigned int i;    uint32_t v0=v[0], v1=v[1], sum=0, delta=0x12345678;    for (i=0; i < num_rounds; i++) {        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);        sum += delta;        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);    }    v[0]=v0; v[1]=v1;}
void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) { unsigned int i; uint32_t v0=v[0], v1=v[1], delta=0x12345678, sum=delta*num_rounds; for (i=0; i < num_rounds; i++) { v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]); sum -= delta; v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]); } v[0]=v0; v[1]=v1;}
int main(){ uint32_t v_part1[2]={0x0EC311F0, 0x45C79AF3}; //动调得到的加密后的值,内存中就是小端储存我们不用再手动改变0EC311F0 45C79AF3 EDF5D910 542702CB uint32_t v_part2[2]={0xEDF5D910, 0x542702CB}; uint32_t const k[4]={0x10203, 0x4050607, 0x8090A0B, 0x0C0D0E0F}; //动调得到的key unsigned int r=32;//num_rounds建议取值为32// v为要加密的数据是两个32位无符号整数// k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位printf("加密前原始数据:%u %u\n",v[0],v[1]); //encipher(r, v, k); //printf("加密后的数据:%u %u\n",v[0],v[1]); decipher(r, v_part1, k); decipher(r, v_part2, k); printf("解密后的数据:%x %x %x %x\n",v_part1[0],v_part1[1], v_part2[0], v_part2[1]); return 0;}//最后按照开始分析的flag的格式排列一下得到flag{3bbcf9ea-2918-4fee-8a2e-201b47dfcb4e}

看雪ID:SYJ-Re

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

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

《安卓高级研修班》2021年6月班开始招生!

# 往期推荐

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

球分享

球点赞

球在看

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


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458386296&idx=2&sn=6c778bce98eda44286296f1bf42bd7be&chksm=b180cff286f746e4e0cc176b0dadd7a06f2b0addaddfcda27610333e6cfa30ef8b879527bc33#rd
如有侵权请联系:admin#unsafe.sh