不安全的日志
首先运行靶场应用或者用以下命令启动程序
adb shell am start -n infosecadventures.allsafe/.MainActivity
>Starting: Intent { cmp=infosecadventures.allsafe/.MainActivity }
第一节--创建项目
创建了项目及项目目录,
新创建的目录结构如图
然后重写了onCreate方法onCreate()
是应用启动时最早执行的方法(早于任何 Activity),适合做全局配置,然后在AndroidManifest.xml对项目基本信息进行定义
base64加密
- 首先建立一个0~63的数据字典
- 然后将字符转为二进制
- 原先按8个划分,现在6个位为一组重新分组
- 对应分组对应base64编码表
base64解密
- 移除填充代码
原始字节数 = (Base64字符串长度 × 6) / 8 - 填充数
TEA算法
如何理解TEA算法
想象你要加密一段秘密信息,TEA会把它切成一个个8字节的小块(比如像切豆腐块)。每次只处理一块。
-
准备工作:先把这8字节切成左右两半,叫左变量和右变量。同时准备好你的128位密钥(16字节),它也切成4小份。
-
开始搅拌(32轮):每一轮的操作都非常相似,就像和面一样:
-
先加一勺固定的“魔法调料水”(这个水叫 delta,值是
0x9E3779B9
)。每一轮都加一勺,所以调料水越加越多。 -
然后,用右变量(右边那半)来炒左变量:把右变量做一些移位操作(左移4位,右移5位),和当前的“调料水”以及密钥的第1、2份混合在一起,做复杂的异或和加法。把这个炒出来的结果,“浇”到左变量上,让左变量彻底变样。
-
紧接着,用这个刚更新完的左变量,以完全同样的方式去炒右变量,并把它“浇”到右变量上。
-
这样,左右变量就互相“污染”了对方一次。
-
-
循环往复:这个互相“炒菜”的过程重复整整32轮。每一轮都让左右变量混合得更彻底,直到原始信息面目全非。
-
出锅:32轮结束后,最终被彻底“炒熟”的左变量和右变量拼在一起,就形成了最终的8字节密文
一生之敌--线代
矩阵的运算法则

-
- 本行作为被减数,减去其他行的k倍,保持矩阵的基本性质,可以进行运算(对应行列式2,相)
-
- 交换任意两行,也是可以进行的操作(对应行列式3,不同)
-
- 某行直接乘k,不改变矩阵性质(对应行列式1,不同)
16,048 users solved
Author: thelshell
Description
Best Stuff - Cheap Stuff, Buy Buy Buy... Store Instance: source. The shop is open for business at .nc mercury.picoctf.net 10337
信息收集
开启虚拟机,NAT,扫描对应C段,发现主机
Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-15 22:58 CST
Nmap scan report for 192.168.254.1
Host is up (0.00038s latency).
Nmap scan report for 192.168.254.145
Host is up (0.00046s latency).
Nmap done: 256 IP addresses (2 hosts up) scanned in 16.88 seconds
这题和上题差不多,简单分析逻辑即可
int __fastcall main(int argc, const char **argv, const char **envp)
{
int stat_loc; // [rsp+4h] [rbp-3Ch] BYREF
int i; // [rsp+8h] [rbp-38h]
__pid_t pid; // [rsp+Ch] [rbp-34h]
char s2[24]; // [rsp+10h] [rbp-30h] BYREF
unsigned __int64 v8; // [rsp+28h] [rbp-18h]
v8 = __readfsqword(0x28u);
pid = fork();
if ( pid )
{
waitpid(pid, &stat_loc, 0);
}
else
{
for ( i = 0; i <= strlen(flag); ++i )
{
if ( flag[i] == 105 || flag[i] == 114 )
flag[i] = 49;
}
}
printf("input the flag:");
__isoc99_scanf("%20s", s2);
if ( !strcmp(flag, s2) )
return puts("this is the right flag!");
else
return puts("wrong flag!");
}