hook_TLs (buuctf k00h_slT)
WaitForSingleObject 利用函数让下一步出现阻塞状态 进入上一个函数所调用的属性StartAddress
对其汇编定位 jnz jz 给 nop
先把call 90 nop 走一下啊 40176E后到40177A的nop
对下面数据也进行转汇编格式这所出现的 反复调用对齐 call 进行nop 40179C到4017A8 这边利用双字节一个一个90
反编译 看样子是完整的
分析wccmp 一个进程比较
继续往下 sub_401500 中的函数 sub_401170 base64 的加密
开始没有思绪了这个东西好像不是很重要 我回到主main 看看 下面 rdata 表在入口处有没有钩把
更近TLS看看 三个选项
case 0 sub_401600()后就 break 了
case 1 一个IsDebuggerPresent()反调试函数 不允许调试他
case 2 TlsCallback_0 的汇编代码 不允许替换成 0x90 也就是 不允许自己函数被nop 会对其dword_4A7000 进行修改
case 3 对其函数修改 不过调用的是之前分析到的base64
也就是你调试他就开始做了检测在入口处真正常
1 | #define DLL_PROCESS_ATTACH 1 |
1 -2 -3 -0 的顺序
开始整理思绪 入口出现TLS 也是就是说 检测到的调试是 case1 让你一直循环进程 mian函数开始创建进程 WaitForSingleObject 利用 StartAddress 属性进入堵塞 一直等待释放后结束进程 在这期间通过 case2 检测 关键点是否被nop 有 nop开始对dword_4A7000 修改 下面就应该是会去退出时进入base64 完全退出 call会被修改 这些无伤大雅 猜测后续解开始一串base64 因为退出call 程序被修改 最后拿base64
拿case 2 dword_4A7000[1] *= 2
开始动调
第一个就是挠过循环 jz 改jnz 进入旁边的判断
断点调试 一次循环进行一次加密
case0加密数据 长度补0
case2
case3
往下走完 case3 的循环 call 更改 401170被改为了4013B0
往下 P xxtea
这边出现的 不知为啥 74 应该是 75emmmm
先跑个脚本试试
1 | #include <stdio.h> |
得到数据 48Pt4WXo+yhqh0GzFAbRg0XqgFhq4UOl+UwqL8wUHy6rEFSQ
Qu7e3T0yEknVghYa6vf1oOsF94H+LxIqbtKpzw8U5CJN2XlZRPM/SdAWDGcjBimr