题目
Die
IDA
main函数
dword_1B336C 与 v7 ,是两个记录循环次数的计数器
红框:加密逻辑,很简单
绿框:成功条件,需要满足两个,第一个是 dword_1B336C == 43 ,当 dword_1B336C 不等于43的时候进入else,然后需要满足条件 input[v9] == key[v8] 与 v7 == 42
key
0x3E, 0xCD, 0xAA, 0x8E, 0x96, 0x1F, 0x89, 0xCD, 0xDB, 0xF1, 0x70, 0xF2, 0xA9, 0x9C, 0xC2, 0x8B, 0xF2, 0xFE, 0xAD, 0x8B, 0x58, 0x7C, 0x2F, 0x03, 0x4A, 0x65, 0x31, 0x89, 0x76, 0x57, 0x88, 0xDF, 0xB8, 0xE9, 0x01, 0xE9, 0xDE, 0xE5, 0x86, 0x68, 0x8F, 0x24, 0xD3, 0x5A
第一种解题方法
编写逆向脚本时,需要注意下面的代码
在满足第一个条件的循环中,里面又调用了mian函数
这里通过动调给大家看看顺序
做好断点标记
第一轮运行main
第一次进行rand(),及srand()
第一轮main中调用mian
F7,进去第二轮main
在进行第二次异或操作前,进行了第二次rand(),及srand()
综上,在两次异或操作之间,夹着两组and(),及srand(),使用第二个随机数设置种子并生成第三个随机数,用于第二轮异或操作
EXP1
#include<stdio.h> #include<stdlib.h> void main() { unsigned int v4, v6; unsigned char v5; unsigned char ida_chars[] = { 0x3E, 0xCD, 0xAA, 0x8E, 0x96, 0x1F, 0x89, 0xCD, 0xDB, 0xF1, 0x70, 0xF2, 0xA9, 0x9C, 0xC2, 0x8B, 0xF2, 0xFE, 0xAD, 0x8B, 0x58, 0x7C, 0x2F, 0x03, 0x4A, 0x65, 0x31, 0x89, 0x76, 0x57, 0x88, 0xDF, 0xB8, 0xE9, 0x01, 0xE9, 0xDE, 0xE5, 0x86, 0x68, 0x8F, 0x24, 0xD3, 0x5A }; for (int i = 0; i < 44; i++) { v4 = rand(); // 生成第一个随机数 srand(v4); // 使用第一个随机数设置种子 v4 = rand(); // 生成第二个随机数 srand(v4); // 使用第二个随机数设置种子 v4 = rand(); // 生成第三个随机数 v5 = ida_chars[i] ^ v4; // 进行异或操作 printf("%c", v5); // 输出结果字符 } }
第二种解题方法
如果你实在是摸不清到底有几组rand于srand,可以试试这个手搓方法
加密操作重点是与随机数异或,那如果我们能得到每次进行随机数呢?
在关键代码上断点
随机输入一串
第一次异或
随机数存放在 al 里,查看eax最后两位的值: 0x58
第二次异或: 0xA1
第三次异或: 0xCB
以此类推,得到43个随机数
0x58,0xa1,0xCB,0xE9,0xED,0x2C,0xEC,0xFB,0xE9,0xC4,0x16,0x97,0x99,0xb1,0xa4,0xe9,0xc3,0xc6,0x80,0xBF,0x3e,0x44,0x18,0x2e,0x73,0x56,0x52,0xB8,0x5B,0x66,0xED,0xBC,0x8a,0xd8,0x36,0x8f,0xe6,0xd3,0xb1,0x51,0xb9,0x59,0xd3,0x5a
EXP2
rand_num = [0x58,0xa1,0xCB,0xE9,0xED,0x2C,0xEC,0xFB,0xE9,0xC4,0x16,0x97,0x99,0xb1,0xa4,0xe9,0xc3,0xc6,0x80,0xBF,0x3e,0x44,0x18,0x2e,0x73,0x56,0x52,0xB8,0x5B,0x66,0xED,0xBC,0x8a,0xd8,0x36,0x8f,0xe6,0xd3,0xb1,0x51,0xb9,0x59,0xd3,0x5a] key=[0x3E, 0xCD, 0xAA, 0x8E, 0x96, 0x1F, 0x89, 0xCD, 0xDB, 0xF1, 0x70, 0xF2, 0xA9, 0x9C, 0xC2, 0x8B, 0xF2, 0xFE, 0xAD, 0x8B, 0x58, 0x7C, 0x2F, 0x03, 0x4A, 0x65, 0x31, 0x89, 0x76, 0x57, 0x88, 0xDF, 0xB8, 0xE9, 0x01, 0xE9, 0xDE, 0xE5, 0x86, 0x68, 0x8F, 0x24, 0xD3] flag = "" for i in range(len(key)): flag += chr(key[i] ^ rand_num[i]) print(flag)
flag
flag{3e625fe0-fb18-4f87-93c1-1ec217f86796}
标签:rand,0xE9,Random,0xF2,MTCTF,异或,v4,随机数 From: https://www.cnblogs.com/demo41/p/18239045