队友找到的引擎TorqueGameEngines/Torque3D (github.com)

将dso文件放到data/ExampleModule目录下,编辑ExampleModule.tscript文件

function ExampleModule::onCreate(%this)
{
trace(true);
exec("./crackme");
__main("aaaaaaaa");
quit();
}

然后点击主目录下的Torque3D-debug.bat就可以在生成的console.log文件里看到输出,发现使用的是getc获取输入,putc输出。

下载源码,在Engine\source\console\console.cpp中找到执行dso文件的位置

另外在CodeBlock这个类里面看到了一个dumpInstructions函数可以dump指令于是在code->read后面加上一个code->dumpInstructions语句来查看指令码,结果发现其他函数都有输出,只有我们的dso文件没有输出,麻,看代码。

发现造成没有输出的原因是codeSize为0;

再看看read函数发现果然读取文件后没有改变codeSize,有点小坑。

在这里加上一句改写codeSize。

这样就可以输出dso文件字节码了,由于字节码过长这里就不放了。

首先查找getc被调用的位置,发现在getc后面有一些OP_CMPNE指令,猜测这里是比较的地方,查看exec函数里实现OP_CMPNE的位置,发现是用doFloatMathOperation函数处理的,加上一句把比较的数据打印出来。

发现在IP=4125的地方有一个比较97与102的cmpne,97就是a的ascii码,102是f的ascii码,再看一下打印出的字节码发现结构很类似,首先getc然后再getc的地址+101处比较,然后比较处+18再次getc,这样就可以该写代码来获取flag,更改处如下





然后再log中发现了

看来不是简单的比较,接着看后面的字节码

简单讲一下指令的作用,其他指令基本一看就知道干嘛的。

OP_LOAD_LOCAL_VAR_UINT stk=+1 reg=4  --> push reg[4];
OP_SAVE_LOCAL_VAR_UINT stk=0 reg=7 --> mov reg[7], stack[sp];
OP_POP_STK --> sp--

发现后面的处理其实跟前面差不多只是把cmpne变成了sub,偏移变成了103,再修改一下代码得到第二部分的flag

接着看后面的指令,重点关注调用了doIntOperation和doFloatMathOperation的指令

而后面每两个getc之间的指令就变得特别多了达到了几万条,有限时间内肉眼看是基本上看不出来了,开始乱猜大法。

发现一个可疑的指令后面load了一个108,查找规律,发现应该是这个,偏移为距getc+61处,然后发现其实上面的也可以在这里获取到。

获取到第三部分flag

flag{vmprotect?_where_we_re_going_we_ll_need_protecti

再看下后面的指令,发现先将所有的数据全加起来跟减去1327

添加以下代码仔细观察数据操作指令



将输入改为flag{vmprotect?_where_we_re_going_we_ll_need_protecti0123456789abcdefghijklmnopq}输出为

再往后发现每次从输入中去除一个然后累加再减去以下数据然后判断等不等于0,这里的16776909等是因为signed类型的负数与0xffffff与得到结果,所以是个解方程问题,z3一把梭

[1327, 1394, 1332, 1347, 1372, 1360, 1394, 1365, 1333, 1347, 1326, 1338, 1391, 1347, 1324, 1333]
from z3 import *
sub = [1327, 1394, 1332, 1347, 1372, 1360, 1394, 1365, 1333, 1347, 1326, 1338, 1391, 1347, 1324, 1333]
s = Solver() flag = Ints("flag%d" %i for i in range(16))
for i in range(16):
s.add(flag[i] >0)
s.add(flag[i] <128)
exceptIndex = 14
for i in range(16):
result = 0
exceptIndex = (exceptIndex + 1) % 16
for j in range(16):
if j != exceptIndex:
result += flag[j]
s.add(result == sub[i]) if s.check() == sat:
print("find")
m = s.model()
f = ""
for i in range(16):
f += chr(m[flag[i]].as_long())
print(f)

得到flag

flag{vmprotect?_where_we_re_going_we_ll_need_protecti0n_FR0Mm_th3_vms}

只要跟踪每个getc后面的指令就可以分析清楚整个流程。

defcon-quals 2023 crackme.tscript.dso wp的更多相关文章

  1. HGAME 2023 WP week1

    WEEK1 web Classic Childhood Game 一眼顶真,直接翻js文件,在Events.js中找到mota(),猜测是获取flag,var a = ['\x59\x55\x64\x ...

  2. 2019 安洵杯 Re 部分WP

    0x01.EasyEncryption 测试文件:https://www.lanzous.com/i7soysb 1.IDA打开 int sub_416560() { int v0; // eax i ...

  3. 逆天通用水印支持Winform,WPF,Web,WP,Win10。支持位置选择(9个位置 ==》[X])

    常用技能:http://www.cnblogs.com/dunitian/p/4822808.html#skill 逆天博客:http://dnt.dkil.net 逆天通用水印扩展篇~新增剪贴板系列 ...

  4. wp已死,metro是罪魁祸首!

    1.这篇文章肯定会有类似这样的评论:“我就是喜欢wp,我就是喜欢metro,我就是软粉“等类似的信仰论者发表的评论. 2.2014年我写过一篇文章,windows phone如何才能在中国翻身? 我现 ...

  5. 关于 WP 开发中.xaml 与.xaml.cs 的关系

    今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: Windows Forms 先看看Window Forms中的 ...

  6. Android,ios,WP三大手机系统对比

    从前,我以为.一个手机系统只是一个系统的UI风格,没什么不同的.然而,在我混合使用这三个手机系统之后,才明白,一个手机系统远不只一个UI那么简单,而真的是可以称之为一个“生态”. 首先祭出三台经典设备 ...

  7. DSO之光度标定

    光度标定(Photometric Camera Calibration)是DSO(Direct Sparse Odometry)论文中比较特别的一部分.常规的vSLAM不太考虑光度标定的问题.比如基于 ...

  8. 搜狗输入法wp风格皮肤

    换了个nexus 发现输入法真的没有wp的好用 没办法,刚好搜狗输入法有定制皮肤的选项,所以自己做了个wp风格的输入法皮肤. 一点微小的工作 http://pan.baidu.com/s/1kVsHd ...

  9. 免费获取WP之类的开发者权限或免费使用Azure 2015-10-19

    上一次弄wp真机调试的时候,卡住了,这里讲一下怎么解决(http://www.cnblogs.com/dunitian/p/4870959.html) 进这个网址注册一下:https://www.dr ...

  10. 【WP开发】读写剪贴板

    在WP 8.1中只有Silverlight App支持操作剪贴板的API,Runtime App并不支持.不过,在WP 10中也引入了可以操作剪贴板的API. 顺便说点题外话,有人会说,我8.1的开发 ...

随机推荐

  1. IO 流分类

    更多内容,前往 IT-BLOG 一.File File 类(磁盘操作)可以用于表示文件和目录的信息,但是它不表示文件的内容.递归地列出一个目录下所有文件: 1 public static void l ...

  2. 一次Feign使用的案例

    项目名称 projectName Maven架构 l  ProjectName-项目名称,项目父工程 projectName-api-提供给外部组件使用的接口 common-一些基本共用的类.枚举常量 ...

  3. VUE百度地图API调用(手机端、PC端、微信通用)

    百度地图API-示例中心: https://lbsyun.baidu.com/jsdemo.htm#aCreateMap 1.引入百度地图(此处用到的是V2.0版本) 1> 建立一个js文件,例 ...

  4. vue之头像管理思路

    思路是在vant库中使用插件将上传的头像转码存入数据库中.每个用户存一个,不同用户就有不同的头像了.若数据库中没有头像,那么就给一个默认头像 头像上传后端接口: var express = requi ...

  5. Java中的命名规范

    Java中的命名规范 一. 常规约定 类一般采用大驼峰命名,方法和局部变量使用小驼峰命名,而大写下划线命名通常是常量和枚举中使用. 类型 约束 例 项目名 全部小写,多个单词用中划线分隔'-' spr ...

  6. '林子雨大数据' 实验3 HBase操作与接口编程

    "林子雨大数据" 实验3 HBase操作与接口编程 环境搭建 VM虚拟机和Ubuntu系统的安装 在Windows中使用VirtualBox安装Ubuntu虚拟机(2020年7月版 ...

  7. Java设计模式 —— 享元模式

    14 享元模式 14.1 享元模式概述 Flyweight Pattern: 运用共享技术有效地支持大量细粒度对象的复用. 当系统中存在大量相同或相似的对象时,它通过共享技术实现相同或相似的细粒度对象 ...

  8. Redis(六)集群

    Redis集群 1.1 存在的问题 容量不够Redis如何扩容 并发写操作,Redis如何分摊 当主机或者从机宕机,薪火相传.反客为主等主从模式都会导致ip发生变化,应用程序中的配置需要对应修改主机地 ...

  9. 介绍ServiceSelf项目

    ServiceSelf 做过服务进程功能的同学应该接触过Topshelf这个项目,它在.netframework年代神一搬的存在,我也特别喜欢它.遗憾的是在.netcore时代,这个项目对.netco ...

  10. RDIFramework.NET开发框架编码管理助力业务编码的自动处理

    1.概述 几乎每一个企业应用中不可避免的都会涉及到业务编码规则的问题,比如订单管理中的订单编号,商品管理中的商品编码,项目管理中的项目编码等等,针对这一系列的编码如果直接写在程序中,不仅复杂,代码重复 ...