就做了一道题拿了1血,后面就忘记做了,复现学到东西的题
[rev]babyre
hook了一个从ring3到ring0的函数,所以v9调用的其实是自己的函数。
通过调试没找到那个函数,只能在函数列表一个一个寻找(也可以过滤函数长度,找了一下不是库函数就是直接jmp的函数,所以应该很容易过滤)
找到了sub_412A20,其中有ZwSetInformatinoThread反调试,这个函数如果执行到最后恰好返回0x7ff,我tm直接nop反调试
然后加载了一个资源文件并且解密,然后是sm4加密
1 |
|
[rev]Enigma
异常虚拟机
通过SetUnhandledExceptionFilter进行了无效指令的处理和反调试,SetUnhandledExceptionFilter主要通过ZwQueryInformationProcess查询调试器,可以patch掉ZwQueryInformationProcess的代码,具体是在ZwQueryInformationProcess下断点,断下时如果第二个参数为7,infoClass=7,就回溯到调用者函数,把je改为jmp
https://www.cnblogs.com/zpchcbd/p/12079166.html
反汇编脚本
1 |
|
patch程序方法:可以先都patch成0x90,这样就可以patch 汇编了。更好的方法当然是使用一个汇编引擎(已知pwntools)
patch之后就可以直接f5了(~ ̄▽ ̄)~(~ ̄▽ ̄)~(~ ̄▽ ̄)~(~ ̄▽ ̄)~(~ ̄▽ ̄)~
1 | char sub_4018F0() |
首先是一个群上面的移位,然后整体循环左移3位,最后是简单的异或处理
1 |
|
[rev]child_protect
既然是child_protect,直接找CreateProcess,交叉引用找到了父进程主函数sub_413670,然后pid交叉引用找到了DebugActiveProcess,sub_413D10下面是主进程对子进程进行处理的函数sub_411415
查了一下GetLastError的ErrorCode,183恰好是文件已存在,也就是说父子进程通过这个判断自己的身份
根据父进程patch子进程,得到流程是先异或再byteswap再tea再byteswap
1 |
|