点击此处获得更好的阅读体验
WriteUp 来源
题目考点
TLS
反调试
解题思路
写在前面
这题一开始是准备TLS+SMC+反调试的,发现放在第一题有些不太合适,就把SMC的调用部分删掉了。
其实留下了彩蛋,smc的实现我没有删XD
设计思路
用TLS检测工具进程和调试器,进入主函数后先检测用户名,通过后检测StartCode(即flag),最后输入'Y'确认CM。
部分细节
Win10的TLS在vs17上有点小Bug,只能在Debug模式下跑起来,于是没有选择Release版本,如果给大家带来困扰这里十分抱歉。 用户名注册存在多解,原因是我把进位值舍去了(输入'I'也能通过username验证哦) StartCode部分先验证长度为35 Step1: 全体 xor 0x76 Step2: [7:14]每个字节先异或0xAD, 再将0b10101010位与0b01010101位互换 Step3: [14:21]每个字节先异或0xBE, 再将0b11001100位与0b00110011位互换 Step4: [21:28]每个字节先异或0xAD, 再将0b11110000位于0b00001111位互换 Step2~4加密前先调用ntdll!NtQueryInformationProcess, 各检查1种标志(7, 30,31) 比较简单的做法直接用ida看了,cuz没有造成任何静态反编译的难度
EXP
1 | import random |
Flag
1 | hctf{>>D55_CH0CK3R_B0o0M!-xxxxxxxx} |