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

话说夜夜真的很像一位绿头发的老奶奶啊(各方面),是谁呢是谁呢(

posted @   brs7  阅读(20)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示