#逆向-Cyberpunk-复现

🤡5ea1
Cyberpunk
[NCTF 2022]cyberpunk
题目是一道VxWorks系统逆向,第一次碰到,故作记录,而且题目背景很帅很喜欢😍
先看题目给的Readme文档
故事背景:
你叫V,是一个无所不能的黑客,是夜之城的传奇。
在赛博朋克2077年,有一个叫做荒坂(Arasaka)的公司缠食着整个夜之城。
有一个叫做大卫(David)的年轻人想挑战这个公司,但是被公司里面的一个满是机械躯体的人(可以被叫做机器人了)残害了,这个人叫做亚当·重锤(Adam Smasher)。
在David被残害之前,他的天才黑客女朋友露西(Lucy)已经黑进了荒坂公司的内部,获得了一些核心机密。
其中有一些被标注为大鬼(DaiOni)战甲的详细资料,亚当重锤的动力战甲就是这个型号。
通过调查,露西发现它搭载的是VxWorks操作系统,而露西也尝试找到战甲的漏洞。
露西深知大卫打不过亚当重锤,但是也拦不住,因此一直告诉大卫再等等。
露西发现在战甲的作战系统固件里面,存在一个自动销毁战甲的函数,但是它被隐藏起来了,她想找到这个函数后,等大卫在与Adam的较量中能暗中帮助男友。
但是在露西找到之前,大卫就已经在与亚当重锤的较量中牺牲了。
现在露西仍然可以自由访问荒坂的后台,但是心上人已故,却再无心进行下去了。
她只想离开夜之城,远走他乡。
离开之前,露西在战甲系统里面留了后门和一些提示,希望你能完成她最后的心愿。
呜呜呜意难平啊😭...(Bad End!)
虽然手残打不过亚当,但是黑进去还是可以的😋为了给大卫报仇,我们需要黑掉亚当的大鬼战甲(拿到战甲的销毁指令)
思路
先分析Readme文档,找到如下关键词:VxWorks系统
,固件
,自动销毁战甲的函数
,可以查询相关资料
虽然对实际做题作用不大就是了
题目内给了一个qcow2
文件,通过查询得知这种文件类型的意思
QCOW2镜像格式是Qemu支持的磁盘镜像格式之一。它可以使用一个文件来表示一个固定大小的块设备。
再结合题目中附的启动文件(start.sh)内容,可以在Linux机器上打开这个镜像文件。
可以看到就是VxWorks操作系统,还很贴心的把CPU换成了DaiOni(大鬼)。
没啥提示,先敲一个help
进去
发现给出了大量可供使用的指令
注意到了一个很显眼的指令FLAG
,说是Lucy的一些小提示,打进去试试看,出现三段提示,其中第二第三段包含了hint

- 这一段首先提到了flag的格式为
flag{你找到的销毁指令}
- 其次,VxWorks系统是一个实时编程系统,可以直接输入一些指令来调用
- flag文件和VxWorks系统在同一个目录下,且flag存放在一个名为flag的文件中

- flag所在的目录可以由help中的某些指令中的信息拼接而成
- Lucy定义了一个解密函数,名为
xor
,用法为xor("flag",len(flag))
于是根据提示去把剩下的指令都打了一遍
在whoami
指令中获得了自己的用户名,version
里面获得了用户名和密码
不过按照help里的iam "name"[,"passward"]
格式打进去没用,我猜测是Lucy已经登录了亚当的账户,毕竟用户名上是一直显示着亚当的。
”现在露西仍然可以自由访问荒坂的后台“
同时,在调用version
的时候,还发现了一个路径/ata0/vxworks
不过输入到系统里面,调用不出来东西
再尝试各种指令,最后发现devs
(开发者)指令很有意思
是直接给了很多路径,一条一条尝试后发现正确路径/ata0a/
其中包含了flag
文件,接下来调用即可
EXP
上面说了是实时编程,那就直接写一个orw吧
fp=open("/ata0a/flag","r")
a=malloc(0x100)
read(fp,a,0x100)
printf("%s",a)
得到了乱码j]HXjDXjwvDh~Dih~jhzVQ\CRwf[hvVTwXFYh~XR]bVTw\Djh~VQh~VR]
为什么呢?喔!还记得有一个xor函数加密吗
修改
fp=open("/ata0a/flag","r")
a=malloc(0x100)
read(fp,a,0x100)
printf("%s",xor(a,81))//81是a的长度
得到一个可疑字符串ZmxhZ3thZGFtX3NtYXNoZXJfa2lsbGVkX2FfdGhvdXNhbmRfdGltZXNfaXNfbm90X3Rvb19tdWNofQ==
,一眼base64秒了😄
Final
flag{adam_smasher_killed_a_thousand_times_is_not_too_much}
👏
此时在镜像系统中输入销毁指令,镜像就会直接陷入永久的损坏...安息吧,亚当·铁锤
反思
实际上xor函数的逻辑就是一个^0x30
,这一点随便套一点数据就能发现了,1->31,30->0
这道题还有一种解法就是固件逆向
sudo apt-get install kpartx -y
sudo modprobe nbd max_part=8
lsmod |grep nbd
sudo qemu-nbd -c /dev/nbd0 ./DaiOni.qcow2
按照这一段指令可以挂载映射,获取固件文件。
想去月球了😭😭😭
别打啊别打,Lucy等着你呢😭😭😭😭😭
我是V:https://www.vgbaike.com/cyberpunk_2077/baike1627?wid=932
谁是亚当重锤:https://www.vgbaike.com/cyberpunk_2077/baike1602?wid=1098
荒坂是什么:https://www.vgbaike.com/cyberpunk_2077/baike1546?wid=934