后面的题几乎都是一些新东西了,感觉每个题可能都要搞好久。0——0
[GWCTF 2019]babyvm
无壳 64位elf
最后判断位置:
但感觉好像有点坑啊
嗯,应该是一个 Vm 的题,首先试试 angr ,不行再尝试解 VM
import angr
base_addr=0x400000
p=angr.Project('./babyvm',auto_load_libs=False,main_opts={"base_addr":base_addr})
init_state=p.factory.entry_state()
sm=p.factory.simgr(init_state)
sm.explore(find=base_addr+0x01081,avoid=base_addr+0x0FD6)
if sm.found:
found_state=sm.found[0]
flag=found_state.posix.dumps(0)
print(flag)
else:
raise Exception("no ")
大佬是用 angr 的 hook 来写的:
import angr
base_addr = 0x400000
project = angr.Project("attachment",
auto_load_libs = False,
main_opts={"base_addr":base_addr})
@project.hook(base_addr+0x1081)
def Hook(state):
print(state.posix.dumps(0))
project.terminate_execution()
project.execute()
是个假flag,再回去看看
这是 switch 里的,应该是判断1 flag的长度
wp说关键是这个:
要让 unk_202060 ==0xF4
一直往下翻,超过了16个,找到了 0xF4,下面还有数据
真正的Code 就是在 0x202180,就把 Vm_Run 中的 0x202060 patch 成 0x202180
那么 check_flag() 函数也是假的,翻一下会发现 sub_F00 应该是真正的。
也 patch 一下
烦死,keypatch 一直安装不好,各种方法都用了,还是没有显示。
按大佬说的,patch 完,直接再次运行脚本(不用改),得到真 flag
嗯,感觉这题搞的就是对 VM 的深度理解,知道哪里是关键点,最后 check_flag()真的是靠猜,真正的函数原来没有被引用。
[HDCTF2019]MFC
有个 VM 壳,百度看能不能脱,可以但很复杂
【旧文】VMProtect完美脱壳过程 - 逆向 - UzzzzZ
先运行一下看看
控件,去 RH 看看,发现没有什么
wp是用了 xspy 这个工具
并且他是一个 MFC程序,也是一种应用程序
帮你快速理解什么是MFC(Windows环境下)_mfc和windos-CSDN博客
MFC逆向初级研究(1)(2)-软件逆向-看雪-安全社区|安全招聘|kanxue.com
一个是窗口、消息查看分析利器:SPY++。
另一个是专门的 MFC 内部分析工具:XSPY。
还要分大小窗口
然后用 xspy
然后就要用到 MFC注入
MFC程序逆向 – 消息篇(上)+(下)_mfc42.-CSDN博客
// 1.cpp : 定义控制台应用程序的入口点。
//注意是MFC运行。
//#include "stdafx.h"
#include<stdio.h>
#include<string.h>
#include "windows.h"
int main()
{
HWND h = FindWindowA("944c8d100f82f0c18b682f63e4dbaa207a2f1e72581c2f1b", NULL);
//HWND h = FindWindowA(NULL, "Flag就在控件里");
//HWND h = FindWindowA("944c8d100f82f0c18b682f63e4dbaa207a2f1e72581c2f1b", "Flag就在控件里");
//这里用到两个关键函数,一个是获取窗口句柄函数,第二个就是根据句柄发送消息函数。获取句柄的FindWindowA中第一个可以传入类名,第二个可以传入标题,因为我们两个都有,所以任意一个都可以锁定程序窗口。
if (h)
{
SendMessage(h, 0x464, NULL, NULL);
//发送函数中第二个是区别其他消息的常量值,这里题目用了自定义常量值,所以我们要对应一致。
}
getchar();
return 0;
}
这个要学学 Windows api,句柄之类的,先了解一下流程吧