好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 smallzhong 于 2021-4-12 15:41 编辑
WriteUp
-
题目要求
-
赛题下载地址: https://gslab.qq.com/html/competition/2021/race-final.htm ,选择 PC客户端安全 下载。
-
拿到这道题目首先运行 hack.exe ,发现直接退出了。于是拖入ida查看。发现 1400015e0 处是主要函数。首先是遍历进程链表,然后通过 OpenProcess 打开进程,再通过 WriteProcessMemory 往进程中写入数据,再 CreateRemoteThread 开启远程线程。是标准远程线程注入模板。
-
拖入 x64dbg ,发现程序开启了 ASLR 。关闭 ASLR 重新进行动态调试,在 调用 OpenProcess 处下断,发现程序并未跑到这里便死掉了。猜想前面有验证,估计跟 flag 有关。
-
往前面看一下,发现调用了 ReadFile 从文件中读取数据。在 CreateFileA 处下断点发现打开的文件名为 hack.dat 。在程序目录下创建一个 hack.dat ,随便填入些数据,程序跑起来了,但是发现 ProcName 里面放了奇怪的数据。我填入 hack.dat 里面的数据是 123123123123 ,而 ProcName 里面的数据也与其结构类似,猜测前面有一个函数将读取的内容进行了解密。
-
往前面看发现在 1400014d0 有一个函数使用读入的数据作为参数且返回值赋给了 v6 ,而 v6 的双数下标又赋给了 ProcName 。跟进这个函数发现有很多浮点运算,并不太能看懂。回想到之前经过函数解密的结果非常有规律,我猜测这个加密函数对字节的加密是一一对应的,是置换加密。通过以下代码构造一个输入数据 hack.dat
FILE* fp = fopen("F:\\pc_saiti\\hack\\hack.dat", "w");
for (int i = 0; i <= 0xff; i++)
{
fwrite(&i, 1, 1, fp);
}
把程序拖入OD进行动态调试,在 1400016CE 处下断,在解密函数调用结束之后查看返回值 rax
可以看到解密后的数据。通过 x64dbg 插件 Scylla 将其 dump 下来
-
可以得到各个字节数据对应的数据。逐个比较可以得到 ShooterClient.exe 字符串对应的数据是
char a[] = {0x59, 0x44, 0xbd, 0xbd, 0xb8, 0x47, 0xba, 0x69, 0x40, 0x43, 0x47, 0xbe, 0xb8, 0x7e, 0x47, 0xb4, 0x47, 0x2c};
看到程序中给 ProcName 赋值的时候是交替选取的
因此写了一段小程序
FILE* fp = fopen("F:\\pc_saiti\\hack\\hack.dat", "w");
char t = 0x40;
fwrite(&t, 1, 1, fp);
for (int i = 0; i < sizeof(a); i++)
{
t = 0x40;
fwrite(&t, 1, 1, fp);
t = a[i];
fwrite(&t, 1, 1, fp);
}
来算得 flag 。在程序文件夹中放入对应 hack.dat 文件后外挂程序可正常运行, dll 成功注入到游戏中,外挂功能正常。
-
在 WriteProcessMemory 处下断,根据 x64 调用约定查看 rcx,rdx,r8,r9 ,可以看到第一次调用时注入的东西有明显的 MZ 头,应是一个 dll 文件。
-
……本wp到此为止,外挂写不出来,还是太菜了,希望明年能打得更好吧。
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|