开学了所以这两天做的题比较水。。。
- [ACTF 2020] Oruga
- 简单注册器
- [ACTF 2020] easyre
- findit
一、 [ACTF 2020] Oruga
这是我目前做过最麻烦的迷宫题了
关键函数是sub_78A,迷宫在byte_201020处,‘ !’ 是终点
这一段的意思。。大致可以理解为,除了0的地方都为障碍emmmmm
先写个脚本把迷宫打印出来(方便好看。。。
而且这个迷宫是真的强。。它的设定是遇到零一直走,遇到障碍才变换方向
这道题不看大佬们的wp我真的不太能琢磨出来。。。我。。废物实锤。。
二、简单注册器
是一道基础安卓逆向叭。。用jeb打开,找到关键函数
主要就是下面这部分啦,逻辑简单,复制粘贴跑一下flag就拿到了
#include<iostream>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
int main()
{
char v5[] = "dd2940c04462b4dd7c450528835cca15";
v5[2] = ((char)(v5[2] + v5[3] - 50));
v5[4] = ((char)(v5[2] + v5[5] - 48));
v5[30] = ((char)(v5[31] + v5[9] - 48));
v5[14] = ((char)(v5[27] + v5[28] - 97));
int v4;
for (v4 = 0; v4 < 16; ++v4)
{
char v0 = v5[31 - v4];
v5[31 - v4] = v5[v4];
v5[v4] = v0;
}
printf("%s", v5);
}
//flag 为 59acc538825054c7de4b26440c0999dd
三、[ACTF 2020] easyre
先脱一层upx的壳
if 那一行得出 flag 格式是 ACT{},且可知中间有十二个字符
shift e 提取出data里的数据
脚本也简简单单。。。我果然只会做签到题
#include<iostream>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
int main()
{
int v4[12] = { 42, 70, 39, 34,78, 44, 34,40, 73, 63,43,64 };
int v16[12] = {};
int data[100] = { 0x7E, 0x7D, 0x7C, 0x7B, 0x7A, 0x79, 0x78, 0x77, 0x76, 0x75, 0x74,
0x73, 0x72, 0x71, 0x70, 0x6F, 0x6E, 0x6D, 0x6C, 0x6B, 0x6A,
0x69, 0x68, 0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60,
0x5F, 0x5E, 0x5D, 0x5C, 0x5B, 0x5A, 0x59, 0x58, 0x57, 0x56,
0x55, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4F, 0x4E, 0x4D, 0x4C,
0x4B, 0x4A, 0x49, 0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42,
0x41, 0x40, 0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38,
0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2F, 0x2E,
0x2D, 0x2C, 0x2B, 0x2A, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24,
0x23, 0x20, 0x21, 0x22, 0x00 };
int v19 = 65; int v20 = 84;
int v21 = 70; int v22 = 123; int v26 = 125;
// v16 = v23;
// v17 = v24;
// v18 = v25;
for (int i = 0; i <= 11; ++i)
{
for (int j = 0; j < 100; j++)
{
if (data[j] == v4[i])
v16[i] = j + 1;
}
}
for (int i = 0; i <= 11; i++)
{
printf("%c", v16[i]);
}
return 0;
}
四、 findit
水题。。。APKIDE打开,得到字符串
从前几位应该为flag 判断凯撒后移10位