sbuf=0x80它是将哪一个位置为0x0044dc951

单片机控制的DC-DC变换器设计 摘 要 本設计通过查阅资料了解DC-DC变换器的发展和应用现状,以及在生产应用方面的不足开关电源有其自身存在的缺点第一个就是使用高频变压器作为传输能量的器件.开关电源通常工作在几百KHz以上,因而会产生电磁干扰所以会影响自身或其它系统正常工作;此外,开关电源也存在着输出电压纹波较大的问题针对其在应用方面的不足设计出一款新型的基于单片机控制的DC-DC变换器。在系统实现上单片机由于具有電子计算机的基本组成部分和功能,同时又具备体积小电路简单、故障率低、可靠性高和成本低廉等优点,而被应用于DC-DC开关变换器控制嘚系统实现该系统以单片机通过输出PWM信号控制开关三极管的通断,从而达到控制输出电压的目的而ADC则对输出信号进行转换并反馈给单爿机分析处理,形成闭环系统本设计分模块详细阐述了降压型DC-DC开关电源及其控制、反馈电路的设计,并分为DC—DC变换、单片机控制输出电壓、单片机闭环参与控制DC—DC的输出三个阶段说明此变换器的实现原理。可实现如同20~30V输入5~10V输出开/闭环控制误差范围控制在很小以内。

}

原标题:看雪.纽盾 KCTF 2019 Q3 | 第九题点评及解题思路

从诞生之日起就被预言为将重新一统大周帝国的王者,从小就展现的惊人天分和气魄也让所有人对他充满期待人人都臣服他,惧怕他养成了他高傲自大,肆意无忌的脾气

他对神神秘秘的黑衣御医徐福的实验室产生了兴趣。那是芈月太后绝对禁止他涉足的地方布满奇奇怪怪机关仪器的房间暗无天日,像极了无边的黑夜

一伙陌生人的侵入成为改变的契机。芈月太后的左膀右臂徐福被驱逐絀王宫。自那之后第十年嬴政终于真正执掌秦国。阳光明亮得令人炫目照耀着他。

[题目说明]Android程序仿照一个Android勒索软件,屏蔽了加密文件的逻辑保留了加密算法。

本题共有989人围观最终只有1支团队攻破成功。A2战队在比赛即将结束的前两个小时成功破解此题。

这道题差┅点成为本届Q3的神题那么它究竟有多么难攻破呢?就让我们一起来揭开它神秘的面纱吧

本题是这次比赛中唯一一道安卓题。本题使用叻大量的安卓加固技术包括:多种反调试、ollvm混淆、native函数多次动态注册、简单的dex vmp虚拟机(advmp)、java层字符混淆、java部分函数插花指令、so字符串加密、java字符串加密,极大增加了分析的难度让破解难上加难。

本题出题战队ech0

该战队只有卓桐一名成员这道题却难倒众人,究竟是何方鉮圣呢下面是相关简介:

仿照一个Android勒索软件,屏蔽了加密文件的逻辑保留了加密算法。一般恶意软件都会做一些反逆向的工作所以加入了反jadx、jeb等反编译工具(原本是Q2 6月准备的题目,可能工具更新后现在效果不行了),加入了混淆、简单的花指令、反调试等更进一步把加密算法抽取出来使用自定义的解释器执行。

虽然有混淆和字符串加密但是字符串加密很简单。根据界面上的Decrypt按钮定位到Button控件

继续往丅追,根据解密后的字符串知道输入值就是flag而且如果输入格式是falg{...}格式,只取中间的字符串

之后调用的函数就是反jeb的函数,可以发现jeb无法解析但是可以看smali代码。

分析该函数应该在libmydvp.so中这个so有混淆、花指令、反调试,patch花指令、反调试后或者动态调试追到这个函数的实现。

追到注册函数的地方或者hook系统函数得到地址。

分析native函数发现:

有200多个分支,从解析的ssspbahh.so数据结构中取2个字节的数据根据数据不同,進入不同的分支

进而得到指令的对应关系,可以把得到的dalvik指令填会dex或者调试完整个函数的指令,分析出是个变形的sm4算法

实现sm4的解密函数,解密:

解密后的数据使用base64解码后得到:请本本载不不载请+软不不软卸微请要

根据代码分析 “请本本载不不载请+”= ,“ 软不不软卸微请要 ”=

挨个取16进制做为索引得到字符。

(自动生成的flag限制的是15个字符,但是开始后发现多了2个字符17个。最简单、最容易得到的flag为:

夲题解题思路由看雪论坛oooAooo提供:

本来已经放弃了感谢kanxue、作者卓桐、小编的鼓励。使得能够在快结束时提交答案

本题使用了一些android加固技術,包括:

3)native函数多次动态注册

6) java部分函数插花指令

7)so 字符串加密(应该是ollvm实现的)

8)java字符串加密

1、java混淆使用0 O o之类的字符使得分析java源码非瑺费劲。

2、在so中加入了很多反调试功能尤其是vmp引擎函数的部分指令码中也加入了,过掉这些反调试虽然简单但是比较繁琐。

3、程序中使用了大量的ollvm混淆其中dexvmp引擎就有26K多,程序只提供arm指令so库由于angr反混淆对arm支持的不够友好,没时间利用符号执行去掉ollvm.稍微分析下程序可嘚到部分垃圾指令,将其去掉后使用F5反汇编这个函数,花费了6个小时才完成当然这需要更改ida配置使得max_funsition size由64k 改为1024K或者更多。即使不F5直接汾析汇编代码,IDA动态调试时其自动分析功能也需要大概15到20分钟(此时单步调试会非常卡顿需要等IDA分析完成后才混顺畅)。也就是是说分析一个虚拟机引擎从程序开始启动到15分钟后才能流畅的跟踪。

4、将VMP大部分指令识别后还原出加解密代码,发现输入竟然是随机的因為其java层将输入的flag通过一些查表变换后使用了base64进行加密,但是这个base64加密的基准字符使用了一个random随机生成的。当再次加密时这个基准又重新隨机生成所以2次输入相同的sn,base64的结果是不样的。此时整个人都不好了以为掉了一个坑里面,这个vmp引擎是假的再次分析程序,包括另外嘚一个libmyqtest.so,也没发现端倪果断放弃。

5、作者在群里提示说 random的随机种子是固定的我理解的是“对于正确的sn无论输入多少次,结果都应该是正確的“看来作者的意图是第一次输入正确就算通过。再次开始分析这里是造成多解的一个原因:第一次可以不正确,后面几次是可能囸确的

6、由于base64的基准是随机生成的,难免会有重复的一般base64的基准字符是不重复的, 这样加密和解密才能对应但是随机生成的基准字苻有重复的造成加密和解密的结果是不一致的,因此对于重复的字符需要进行分别尝试这也是可能造成多解的一个原因。

7、在java层对输入嘚flag使用了多种编码格式的转换使得反推flag的时候花费了点时间。

(一)java部分代码分析

反编译后可以看到大部分字符串都是加密的加密函數为:OooOO0OOli.d,为了快速定位到检测SN入口需要将所有加密的字符串进行解密。使用C对dex文件中的加密字符串进行解密如下:

2)后面的流程就比较複杂而且字符混淆非常严重,可以从输入提示入手即 "Key error!", 可以检测函数在类android.support.v4.app.O000000o中如下:

1)分析输入的sn是否是flag{xxx}格式的如果是就截取xxx。

2)调鼡OO0o0.O0000O0o(flag)函数该函数实际上就是用输入的sn索引下面的表,然后转换成一个long型的字符串。

3)再次使用long型的字符串进行chartobyte后索引一个常量表:

并且当时9嘚倍数是使用'+'字符代替并且将原始的9个字符串拷贝到之后。

这个函数实际上是个变形的base64但是其基准字符是随机生成的,随机种子固定部分代码如下:

对应第一次的生成的基准如下:

其中最后一个字符为站位字符其数值为0x74,这里注意的是再次调用次base64函数后这个基准数徝将发生变化,重新随机生成

以一个随机产生的字符串(无用的),以及base64结果作为参数调用函数 OO0o0.O000000o其返回如果为true则flag正确。

函数开始是进荇了编码转换后执行如下语句

其是一个native函数原型如下:

这个native函数输入的是一个base64加密后的结果。将其返回的结果进行bytetochar转换后与上面的标定芓符串比较相等即为正确因此后续核心分析转为native函数 OO0OOOO。首先要定位到此函数

前面的几个函数都是解密字符串的,其中包括对native函数 OO0OOOO原型嘚解密

由于此函数使用ollvm混淆,并且加入了一些垃圾代码使得F5失效简单写个脚本去掉相关垃圾代码,F5即可成功如下:

F5之后的代码也很哆,将近2000行只说下核心代码:

2. 然后剩下的将近1800多行就是个tracepid反调试。

3. 如果tracepid的值不为0 则执行如下代码:

如果在调试状态下 全局变量g_antiDebug_Global(E3550)将被设置为文件句柄值,在 antidebugThread1会访问在这个值实际上其应该是一个类似于jvm,env的指针被设置成文件句柄后,会使程序访问其时发生异常崩溃知道这些后过掉次函数反调试就比较容易了。(后面会有一个过掉所有反调试的脚步)

这个函数看上去依然很大(2000多行),起始代码也很簡单贴一下核心代码。

2)如果不为0而是之前反调试的结果为文件句柄,将发生异常程序退出

3)如果不为0,而是一个合法的值执行如下玳码:

1)创建线程sub_1D404(后面分析)

1)fork一个子进程

4)父进程流程比较简单,直接函数返回了

5)父进程的线程 sub_1D404为读取管道,代码如下:

了解了鉯上反调试功能后:

首先可以直接将父进程的线程 sub_1D404杀掉让其直接返回。然后nop掉fork指令并使其结果r0=0就可以。

至此初始化函数就分析完了。

这个函数代码量相对较小贴出来吧:

貌似有个 时间反调试,为了方便直接修改clock函数返回值即可。

看出是一个native注册函数其又调用152C0进荇真正的nativeregister,其部分代码如下:

其实这个函数是个虚假的native函数这里就不分析了。

创建一个结构体 bin进行初始化:

整个这部分代码的功能就昰分析apk中的assetsssspbahh.so文件。这个文件实际上是个变形的dex文件其格式如下:

再次吐槽下这个函数的混淆。之前的反调试已经可以了没必要再在虚擬机里面加反调试了,只是徒增工作量而已这里增加了2中新的反跳检测:

TCP端口和 /proc/pid/wchan文件检测。下面的脚本是过掉所有反调试的

用 途:根据模块名获得模块起始地址

备 注:此函数在SHT被破坏时将不起作用

用 途:根据段名获得段的起始地址

用 途:向模块地址写入指定shellcode

用 途:给模块指定偏移下断点

用 途:删除模块指定偏移的断点

用 途:给指定模块函数重命名

用 途:给指定模块地址下注释

用 途:dump 指定大小的内存数据

用 途:通过窗口dump内存数据

用 途:从内存中读取一个int

用 途:从内存中读取一个int

用 途:从内存中读取一个short

用 途:从内存中读取一个char

用 途:从内存Φ读取一个uint

用 途:从内存中读取一个ushort

用 途:从内存中读取一个uchar

用 途:拷贝内存到另外一个区域r

用 途:从指定位置为0x0044dc95查找指定字节的数据

备 紸:返回第一个找到的位置为0x0044dc95

用 途:从指定位置为0x0044dc95查找指定字节的数据

备 注:返回第一个找到的位置为0x0044dc95

在调试器开始时只执行一次

1) 在程序载入时,执行一次脚本会在 linker调用so的初始化函数位置为0x0044dc95设置断点,这个是米8的不同机型修改C_Linker_InitAddr=0x1892E这个值即可。

2)当断在初始化位置为0x0044dc95时再次执行脚本,会bypss所有反调试同时bypass掉部分垃圾指令,使得F5可以成功

3) 然后就虚拟机入口设置断点。

分析dex的vmp虚拟机核心是找到不同opcode的处悝分支这个分支在data段off_E0B20位置为0x0044dc95具体如下:

找到这个分支就好办了,直接在每个分支上设置断点分析各个opcode的具体功能就可以恢复了。

真个變形的smali大概有40多个指令具体如下:(可能有部分不准确,不过不影响分析):

分析到这里一种是直接将还原smali但是其实能够还原也表示看懂了算法了,直接还原算法就可以了

程序前部分代码是生成一个long型的数组。

然后开始对输入的sn进行加密算法如下:

执行上述代码得箌如下数据:

当java调用native函数是传入上述数据,将会提示sn正确

'{'};中的一个。虽然能限制部分多解但是由于base64本身每次加密的基准字符不同,而苴基准字符还存在重合的现象所有不可避免会出现多解。

1. 对于第一次输入base64解码后得到一个字符串“ 请本本不不载请微+不卸请要 ”;

2. 再佽逆推,得到一个long型字符串“ 85746 ”

进阶安全圈不得不读的一本书

}

我要回帖

更多关于 位置为0x0044dc95 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信