type
status
date
slug
summary
tags
category
icon
password
WOW
IDA打开,main函数里面有很多引用函数,逐个点开,分析得到
四个加密函数里的逻辑都不简单,可以dump下来的数据很多很长,且有被隐藏的代码
搜索了一下知道这是Heaven's Gate,是一种在32位WoW进程中执行64位代码,调用64位win32API技术(防止静态分析)
这里密文cipher和Buf2比较,一样则输出win,多半下面flag的结果与input就关系不大了
那我直接把cipher的数据pasta data给Buf2,再动调步过加密逻辑,Buf2或input地址变化后的位置应该就是flag了
开搞:
打好断点,方便pasta data和步过逻辑
提取cipher(hex)
=29209862FC467956A5904AF6A370D91B34021B5065863335BBA59F96BB2BE32A
构建调试用flag = ‘aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa’
动调至memset函数时,浏览器自动跳转到B站视频《猫中毒》(测试了一下error情况下自动跳转至B站视频《Never Gonna Give You Up》)
继续步过逻辑,成功得到flag
server
main_main主函数,是go语言
回调函数为main_HttpHandleFunc,调试发现,输入经过main_encrypt处理后,与已知的res比较
进入main_encrypt函数,伪代码看不出什么
那就只有看汇编,发现有RSA加密,p,q,e已知
RSA后传参给RSA_cipher,经过两轮异或后与已知的res比较
提取res
但是其中有很多0是无用数据,写个脚本去除:
exp:
ezvm
switch—case的vm保护,根据
需要计算一下找到opcode的地址
索引到指定地址,提取opcode
根据case18计算data的地址
同样索引
通过switch-case逻辑以及以上数据,可以构建脚本来复现这个vm隐藏的代码操作:
通过copyIDA中打开的21个case操作,写出:
试运行,可以看到遍历四个case跳入case16的getchar函数(与IDA动调结果一致),模拟flag:hame{a......a}(个数从20开始调整),目的是找到出现循环的的地方,所对应flag长度即为真正flag长度,一直到32位出现循环
通过以上操作,可以发现实际上循环加密只进行了*2和case3的异或操作,知道加密方法,就可以开始提取数据
通过case18,提取出数据(其实是上面data中的部分数据),按32位一组提取出
据此,可以写出脚本:
hardasm
main函数打开以后,和题目名字一样,6750行的汇编指令,读不了一点
只有慢慢尝试理解
- 这里很明显能清楚flag长度为32
经过搜索可以知道这是X86-64架构下使用AVX2指令的汇编代码
这里可以看出ymm0-ymm7都被赋予了data,而ymm0被赋予了input
下面主要涉及vpermd,vpxor,vpaddb,vpsubb,vpshufb这5个指令
但是运算过程以及汇编代码量过于庞大,且不会AVX2指令集,果断动调
在一大串指令过后找到cmp对比,以此为断点,构造hgame{aaaaaaaaaaaaaaaaaaaaaaaaa}
在这里的ptr可以看到最后比较数据的前6位有了回显,应该是'hgame{'的回显,而其他数据都因为错误而回显0
为了测试,构造hg3m3{aaaaaaaaaaaaaaaaaaaaaaaaa}
很明显,猜测完全正确
那可以patch程序,将[rsp+70h+var_50]处的内容传递给rcx,以此打印;
- 作者:Sh4d0w
- 链接:https://sh4d0w.life//article/44d5172c-370c-4a05-972d-868bfed2401e
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。