本次大赛官网:https://gslab.qq.com/html/competition/2021/race-final.htm
本人水平有限,这份WP可能存在错误的地方,还望各位前辈指正。
0x00 生成Flag
先用工具关掉ASLR,拖入IDA和x64dbg动静结合进行调试。第一步发现需要构建一个hack.dat文件作为启动配置。
把hack.dat读入的内容放到encode函数进行编码,编码后的内容特定位赋值到ProcName字符串数组,作为后续快照中寻找所需进程的进程名。
在获取目标进程句柄后,先前编码的内容与程序内硬编码进行比较。如果全部相同则进入打印flag分支。
为了后续调试的方便,可以通过硬编码内容和encode函数反推hack.dat文件内容。encode函数大致就是 以0x96和0x56的对称值进行编码,例如:0x32编码后的值就是0x7A
0x01 shellcode和Dll
对特定区域编码获得一个大小为0xFA00的PE文件,用Scylla插件 Dump下来,发现是一个Dll程序。
获取API地址作为后续shellcode的参数。
在游戏进程申请空间并把Dll和shellcode写入,然后创建远程线程执行shellcode。
可以在CreateRemoteThreadEx位置下断点观察R9和堆栈即为创建远程线程的起始位置和参数。在游戏进程创建新线程调试shellcode。
对dll文件一些操作后通过call rax跳到DllEntryPoint。
找到DllMain函数,发现创建了一个无参的线程,接着跟进线程。线程起始地方有一些偏移地址,猜测和后续自瞄的实现有关系。
前面都是做一些判断和准备操作最后两个函数才是重点,这两个函数HOOK了游戏原始函数流程,跟进去可以发现在0x7FF766990EA6 和0x7FF7679DEA00进行了HOOK。
通过计算偏移可以知道 “当前函数 = DllEntry - 0x5FC”,在IDA中查看该函数。
0x02 自瞄函数分析
通过x64dbg不断测试,可以发现最后两个call是关键call。
接下来直接分析自瞄实现函数,先是判断是否按下鼠标右键。
如果按下了鼠标右键则获取敌人基址,进入坐标赋值区域,先通过dll入口中写好的偏移得到自身坐标位置并赋值。
然后通过刚才获取的敌人基址得到敌人坐标并赋值。
最后计算坐标偏移差,然后转换为偏移角度写入源本准星偏移角的内存区域达到自瞄锁定的效果。
0x03 总结
第一次接触UE4的游戏逆向学到很多,感谢腾讯游戏安全举办本次比赛。
|