腾讯游戏安全2024决赛 PC-WriteUp
腾讯游戏安全2024决赛-PC-WriteUp 题目解读后,可以分为两个块,一个是写注册机,一个是分析内核shellcode的位置和干了什么 分析USER和KEY 在进行这个题目的时候,发现双机调试不能使用,分析的ark工具也不能使用,基本上这种方式不太行了,但是仍然比不了自己手速!哈哈哈哈!在没有蓝屏的时候用ark dump了一份load.dump.bin,哈哈哈哈 因为题目要求将card.txt放置到C盘根目录:这个时候发现一个现象,如果我不放到根目录下,或者如果我card.txt里面的值被我随便修改的情况下可以进行双机调试不会被检测,这个时候自己有了一点想法,(但是还是先做这个问为主),因为这个时候可以进行双机调试所以自己用双机调试做的USER和KEY分析的东西 load.dump.bin中,可以看到路径的名称为:\\??\\C:\\card.txt,但是回溯不了很烦 还根据ZwCreateFile入手 NTSYSAPI NTSTATUS ZwCreateFile( [out] PHANDLE FileHandle, [in] ACCESS_MASK DesiredAccess, [in] POBJECT_ATTRIBUTES ObjectAttributes, [out] PIO_STATUS_BLOCK IoStatusBlock, [in, optional] PLARGE_INTEGER AllocationSize, [in] ULONG FileAttributes, [in] ULONG ShareAccess, [in] ULONG CreateDisposition, [in] ULONG CreateOptions, [in, optional] PVOID EaBuffer, [in] ULONG EaLength ); 直接看一下ObjectAttributes里面的ObjectName的名字 一般来说如果读取文件来说,用的是ZwCreateFile,进行栈回溯一直跟一直跟,因为在vm中一定要回到text段,这个时候我认为的方式是:参数写入后,进行call lea reg,xxxxxx call vm 但是感觉栈回溯太多了不太行,然后想了一下看了一下这个地址的address模块在这个loader.sys中,计算一下offset = 0x675e20,然后交叉引用回去即可 这个的路径是xor 0xace做到的,我这边直接解密,也可以看到code References的地址 直接windbg分析后,这个位置不难,很好的可以分析user算法的位置: key的算法位置: 这两个位置我是动态调试出来的,大概算法的表示为-进行分割后,user计算后的值转化为10进制,就是key的值 注册机: #include <iostream> using namespace std; uint64_t getkey(string user) { uint32_t encuser = 0; for(int i : user) { encuser = (i + encuser)*0x1003f; } return encuser; } int main() { string user; cout << "input your user: " << endl; cin >> user; cout << "your key : " << getkey(user) << endl; return 0; } 第一问:administrator-4007951923...