仅供个人学习使用,侵权删除!
[RE2]P1
定位到字符串即可

脱壳类
[RE2]P2
锻炼ESP定律脱壳
官方也给了方法。注意OD的ctrl+a是自动分析

X64dbg也行

[RE2]P3
也是一个脱壳题。
经检测是32位程序,可以使用OD和X32,我这里就用X32了
先F9找到字符串,再追踪哪里引用到这里了

最终定位到关键跳:这里就是OEP

ESP定律在这里失效了。单步执行太几把慢了
用工具也可以脱出来
[RE2]P4
这个是P3的延展。
和上一题思路一模一样。我感觉这道题本意是魔改UPX,结果上传错误附件
[RE2]P5
ESP定律秒杀了!

SMC
[RE2]P6
这种题目用IDA动调解决起来最快,我们双击解密函数,进入text段,按U解除定义,按C转为代码,按P定义为函数即可

接下来就是关键代码:

解题脚本:
python
cipher = [0x9f, 0x91, 0xa7, 0xa5, 0x94, 0xa6, 0x8d, 0xb5, 0xa7, 0x9c, 0xa6, 0xa1, 0xbf, 0x91, 0xa4, 0x53, 0xa6, 0x53, 0xa5, 0xa3, 0x94, 0x9b, 0x91, 0x9e, 0x8f, 0x0]
flag=''
for i in cipher:
flag+=chr((i^0x39)-57)
print(flag)
[RE2]P7
这个用一大段函数来介绍SMC,特别提到现在存在内存保护机制,搞不好SMC会导致程序崩溃,这个学到新知识了。
我们还是选择动调,但是需要注意这是linux,用到远程调试(好麻烦)

这里存在这个指令,GetNextNumber函数直接跳到一个地址,我们猜测这个函数是来结合i做索引的
IDA识别错误,我们按Y按Ctrl+E,将返回值改为int即可

结果如下:
cpp
int GetNextNumber()
{
_DWORD v2[66]; // [rsp+10h] [rbp-110h]
unsigned __int64 v3; // [rsp+118h] [rbp-8h]
v3 = __readfsqword(0x28u);
v2[0] = 78;
v2[1] = 82;
v2[2] = 81;
v2[3] = 64;
v2[4] = 80;
v2[5] = 65;
v2[6] = 117;
v2[7] = 97;
v2[8] = 43;
v2[9] = 44;
v2[10] = 79;
v2[11] = 37;
v2[12] = 106;
v2[13] = 92;
v2[14] = 52;
v2[15] = 93;
v2[16] = 49;
v2[17] = 101;
v2[18] = 58;
v2[19] = 34;
v2[20] = 75;
v2[21] = 28;
v2[22] = 88;
v2[23] = 93;
v2[24] = 27;
v2[25] = 89;
v2[26] = 75;
v2[27] = 26;
v2[28] = 88;
v2[29] = 76;
v2[30] = 80;
v2[31] = 72;
v2[32] = 63;
v2[33] = 82;
v2[34] = 17;
v2[35] = 14;
v2[36] = 66;
v2[37] = 58;
v2[38] = 71;
v2[39] = 9;
v2[40] = 60;
v2[41] = 8;
v2[42] = 60;
v2[43] = 78;
v2[44] = 51;
v2[45] = 54;
v2[46] = 2;
v2[47] = 53;
v2[48] = 3;
v2[49] = 46;
v2[50] = -1;
v2[51] = 5;
v2[52] = 35;
v2[53] = 30;
v2[54] = 18;
v2[55] = 13;
v2[56] = 30;
v2[57] = -6;
v2[58] = 59;
v2[59] = -4;
v2[60] = 51;
v2[61] = 6;
v2[62] = 22;
v2[63] = 62;
return v2[count++];
}
解题脚本:
cpp
#include <stdio.h>
int main()
{
int v2[66]; // [rsp+10h] [rbp-110h]
v2[0] = 78;
v2[1] = 82;
v2[2] = 81;
v2[3] = 64;
v2[4] = 80;
v2[5] = 65;
v2[6] = 117;
v2[7] = 97;
v2[8] = 43;
v2[9] = 44;
v2[10] = 79;
v2[11] = 37;
v2[12] = 106;
v2[13] = 92;
v2[14] = 52;
v2[15] = 93;
v2[16] = 49;
v2[17] = 101;
v2[18] = 58;
v2[19] = 34;
v2[20] = 75;
v2[21] = 28;
v2[22] = 88;
v2[23] = 93;
v2[24] = 27;
v2[25] = 89;
v2[26] = 75;
v2[27] = 26;
v2[28] = 88;
v2[29] = 76;
v2[30] = 80;
v2[31] = 72;
v2[32] = 63;
v2[33] = 82;
v2[34] = 17;
v2[35] = 14;
v2[36] = 66;
v2[37] = 58;
v2[38] = 71;
v2[39] = 9;
v2[40] = 60;
v2[41] = 8;
v2[42] = 60;
v2[43] = 78;
v2[44] = 51;
v2[45] = 54;
v2[46] = 2;
v2[47] = 53;
v2[48] = 3;
v2[49] = 46;
v2[50] = -1;
v2[51] = 5;
v2[52] = 35;
v2[53] = 30;
v2[54] = 18;
v2[55] = 13;
v2[56] = 30;
v2[57] = -6;
v2[58] = 59;
v2[59] = -4;
v2[60] = 51;
v2[61] = 6;
v2[62] = 22;
v2[63] = 62;
for (int i = 0; i <= 63; i++)
{
v2[i] += i;
printf("%c", v2[i]);
}
return 0;
}
反调试(有待学习)
[RE2]P12
花指令
[RE2]P8
很简单,就一处,改了即可,不多赘述了。
[RE2]P9
同上,只需要掌握基础花指令就能做出来。
[RE2]P10
本质上还是套娃花指令,也不多说了
[RE2]P11
都是一个套路,U-->C-->P,三板斧。
[RE2]P17
几处花指令不多说,一样的去除方式

最终脚本
python
flag=''
a="?'+*\"17!\x1B-7\x1B7+\x1B!%7=9"
for i in a:
flag+=chr(ord(i)^0x44)
print(flag)