24H&N逆向部分wp

菜鸡新手师傅wp,Re 5/9,记录一下qaq

最喜欢的逆向题

64位,进主函数之后直接看,要求输入第5位为i,然后后面依次相等,长度为24,就输出flag

image-20240516004257710

按照要求输入即可:

image-20240516004318413

DO YOU KNOW SWDD?

主函数中函数并不多,一直跟进sub_41127B到最后你就会发现就是一个简单的smc

image-20240516004333994

待解密部分:

image-20240516004355826

idapython patch一下即可:

1
2
3
4
5
6
7
8
9
addr = 0x00417000
v5 = "swdd"
for j in range(4):
for i in range(331):
temp = addr+i
value = idc.get_wide_byte(temp)
value ^=ord(v5[j])
ida_bytes.patch_byte(temp,value)
print("OK")

得到加密逻辑如下:

image-20240516004414169

exp:

1
2
3
4
5
6
7
8
data = [83,95,86,89,70,79,95,67,71,78,78,95,71,82,75,68,95,75,76,89,69,68,95,73,89,69]#S_VYFO_CGNN_GRKD_KLYED_IYE

for i in range(len(data)):
if(data[i]>=65 and data[i]<=90):
print(chr((data[i]-10-65)%26+65),end='')
else:
print(chr(data[i]),end='')
#I_LOVE_SWDD_WHAT_ABOUT_YOU

hwanna

直接看Assembly-CSharp.dll

image-20240516002252596

直接用python跑一下既可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def a(input, shift):
text = ""
for c in input:
if c.isalpha(): # 检查字符是否为字母
# 使用ord()函数获取字符的ASCII码,然后进行偏移操作,最后使用chr()函数转换回字符
text += chr((ord(c.lower()) - ord('a') + shift) % 26 + ord('a')) if c.islower() else chr((ord(c.upper()) - ord('A') + shift) % 26 + ord('A'))
else:
text += c
return text
data = "justaeasyunitygame"

aaa = a(data,5)
print(aaa)
#套上flag头即可H&NCTF{ozxyfjfxdzsnydlfrj}

childmaze

一开始用的ida7.5,符号表一直载入不了,f5也看不了,动调也调不起来,纯坐牢了属于是,但看到一堆函数,同时有点混淆的感觉,寻思用d810去去混淆,用ida8.3打开了一下,发现可以正常载入符号表,看出来是rust,动调还是调不起来,难绷,大概逛了一下代码,找到应该是密文

image-20240516002945995

没有逆向逻辑,就是在走完所有地图之后正常解密,用python跑一下直接出了

1
2
3
4
5
data = "H'L@PC}Ci625`hG2]3bZK4{1~"

for i in range(len(data)):
print(chr((ord(data[i]))^(i%7)),end='')
#H&NCTF{Ch411enG3_0f_M4z3}

Baby_OBVBS

查看vbs源码发现是一长串,确定是混淆无疑,execute是执行,即是执行后面这一长段

image-20240516004436789

跑起来用ce附加了一下,查找了一下关键字符串"Enter the key:",发现了真正的代码逻辑:

image-20240516004544014

dump下来之后确认为输入的key做了一个MD5的加密之后判断,然后flag是一个RC4的加密

image-20240516004638074

而解密的关键是找到MD5的密文和RC4的密文,ANtg和eAqi,显然从dump下来的东西里已然没有这个信息了

image-20240516004656266

所以还是得从给的vbs脚本入手,执行脚本之后能看到去混淆的代码,所以直接将所需要执行的带混淆的输出一下即可,将原先脚本中开头命令换成 WScript.Echo(vbs里的语法,类似c里面的printf),修改一下保存为vbs,运行并能看到代码逻辑以及需要的密文

image-20240516004736786

image-20240516005142016

加密部分还是带了base64加密,正常解码就能看出是MD5和RC4,但现在不用了,直接取开头的两个密文即可,MD5解完之后是H&NKEY,然后直接RC4解就行,找个在线网站解了

image-20240516005357675

H&NCTF{VBS_1s_@_s0_7unny_an4_pow3rfu1_t00l!}

隐藏的眼睛

比赛时候瞅了一眼,一堆爆红,貌似还是个病毒,解也不多,就没细看,后期复现了一下

拉进ida全是爆红,有点懵逼,看了wp说是程序大量动态调用与api重写导致ida静态分析函数爆红,眼瞅着下图中一眼有个myDLL,还有一个LocalHide(这个应该就是一个自隐藏,类似删除吧)

image-20240530000433771

这块儿应该就是一个检测虚拟环境的部分,启动虚拟环境之后,查看进程就会发现有挂载这些东西,所以这块的作用应该就是检测

image-20240530001025145

继续往下逛就是基本每个函数点进去都有爆红,只能随便看看信息了,下面这个好像是检测运行环境的,chat之后的结果是RtlGetVersion 是 Windows 操作系统中一个未公开的函数,属于 Runtime Library (RTL) 部分。这个函数用于获取当前操作系统的版本信息。由于它是未公开的,也就是说它不是 Microsoft 官方文档中明确定义的 API,因此使用它存在一定的风险,比如在未来版本的 Windows 中可能不再支持或者行为发生变化。

嗯,没啥用

image-20240530001450379

逛一圈只有最后这个函数能进去

image-20240530001629716

进去之后有大发现,一眼顶针鉴定为xxtea的shellcode,同时这个程序是没有提示输入之类的,按道理直接把这个过程走一遍就能出,但是动调是过不来这块的

image-20240530001754306

所以这个题的考点感觉还是在过一开始的那个隐藏吧,加载了一个dll声明了LocalHide函数(顾名思义程序的本地隐藏)赋值给了v4,然后作为函数执行

image-20240530002055650

倒是第一次知道这种做法,直接拉到dbg里结合ida调试直接就可以过了,基址是对齐的,直接找就行

image-20240530002401789

设置完新运行点之后,再找到xxtea完之后的这个函数(感觉是一个check吧),然后断下来直接f9过来就好了

image-20240530002733196

xor为check,其中的edx的值是从rdi的地址中取的,内存窗口直接跟过去就可以看到flag了,这种方法我只能说狠狠的学到了

image-20240530003030727

H&NCTF{0h!!_Y0u_F0UND_MY_1P_ADDRESs}