0xgame Re wk1 writeup
Oct 6
下午刚到北京的我又来水了
0xgame Re wk1 writeup
BabyBase
IDA Pro打开,找到encode方法,裸的base64。

BinaryMaster
这标题以为是在暗示二进制,结果跟二进制一点关系都没有。
运行程序,将八进制转化为十六进制数并输入即可获得flag,也可以直接用IDA Pro打开来找。盐豆不带盐的。出题人这样做,一定有他的意图。
SignSign
运行一下,给了一半flag,用IDA Pro打开,看字符串窗口可得到另一半。
Xor-Beginning
IDA Pro打开可看到对v5的赋值,这个就是密文了。下面有一个对v5的异或加密,可直接正向爆破,或逆向算法,逐项+i再^78。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string v5="~5\v*',3";
for(int i=7;i<=29;i++)
v5+='*';
v5[7] = 31;
v5[8] = 118;
v5[9] = 55;
v5[10] = 27;
v5[11] = 114;
v5[12] = 49;
v5[13] = 30;
v5[14] = 54;
v5[15] = 12;
v5[16] = 76;
v5[17] = 68;
v5[18] = 99;
v5[19] = 114;
v5[20] = 87;
v5[21] = 73;
v5[22] = 8;
v5[23] = 69;
v5[24] = 66;
v5[25] = 1;
v5[26] = 90;
v5[27] = 4;
v5[28] = 19;
v5[29] = 76;
// cout<<v5;
for(int i=0;i<v5.length();i++)
for(char j='!';j<='~';j++)
{
if(char(j^78-i)==v5[i])
{
printf("%c",j);
break;
}
}
return 0;
}
//0xGame{X0r_1s_v3ry_Imp0rt4n7!}
Xor-Endian
想到了名曲《奇异恩典》。
用DIE看一眼,是ELF文件。打开后发现:

根据下文v7与v6比较,按理来说v6应该是一个完整的字符串,但是却以int型存储(IDA Pro特有的整型走天下),所以v6事实上是一个长度为12*4=48的字符型数组(也就是字符串)。再点进encrypt:
__int64 __fastcall encrypt(__int64 a1, __int64 a2, int a3, int a4)
{
int i; // [rsp+24h] [rbp-4h]
for ( i = 0; i < a3; ++i )
*(_BYTE *)(i + a1) ^= *(_BYTE *)(i % a4 + a2);
return 0LL;
}
把_BYTE一顿改(其实不改也挺清楚)就能看出该段加密是对输入字符串的每一项进行一个异或操作,异或的值是字符串“Key0xGame2024”中的某一项(每13个字符轮回一次),所以我们解密的时候再异或回去就行。
这题的一个重点是如何正确地获取v6的值。由于我对IDA Pro还不是很熟悉,改了几次v6的类型还是没什么效果,直接Shift+e又有中文混入其中。所以只能逐项按热键R:
v6[0] = 'Q>\x1D{';
v6[1] = '\x0F\x1A"\x15';
v6[2] = 'VQ\nV';
v6[3] = 'T](\0';
v6[4] = '\x05tK\a';
v6[5] = '\bTQ@';
v6[6] = 'Vr\x19T';
v6[7] = 'vU\x04\x1D';
v6[8] = 'WT\vV';
v6[9] = 'sU\v\a';
v6[10] = '\x05\bO\x01';
v6[11] = 0;
然后让AI来帮我提取:

转的时候注意小端序存储,每四位ASCII应该倒过来。然后写脚本来解密:
#include<bits/stdc++.h>
using namespace std;
char v6[]={123,29,62,81,21,34,26,15,86,10,81,86,0,40,93,84,7,75,116,5,64,81,84,8,84,25,114,86,29,4,85,118,86,9,84,87,7,9,85,115,1,79,8,5,0};
int main()
{
string a2="Key0xGame2024";
for(int i=0;i<44;i++)
{
if(v6[i]==9)v6[i]=11;//修正AI转换时的错误
int x=(a2[i%13]);
v6[i]^=x;
printf("%c",v6[i]);
}
return 0;
}
//0xGame{b38ad4c8-733d-4f8f-93d4-17f1e79a8d68}
解释一下第9行。由于不知道什么原因,AI将转义‘\v’的ASCII值识别为9,但其实应该是11。本来我也没发现这一点,但是直接按AI提取的字符串来解密结果会有一个分号,在一众小写字母,数字和连字符中显得格格不入,所以找到它并修正。然后就可以得到正确的flag。
END
准备被wk2薄纱了QAQ
踊レ、歌エ、一心不乱に回レ!今宵は雪月花
ーー「回レ!雪月花」

日日夜夜(bushi
话说夜夜真的很像一位绿头发的老奶奶啊(各方面),是谁呢是谁呢(
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?