网易首页 > 网易号 > 正文 申请入驻

使用SCA逆向VM虚拟机

0
分享至

前言

SCA又称侧信道攻击,核心思想就是通过运行时后各种信息对程序进行攻击。包括简单功耗分析攻击(SimplePower Analysis attacks,SPA)和差分功耗分析攻击(Differential Power Analysis attacks,DPA),与传统密码分析学相比,这种攻击手段攻击效果显著。

VM加密

这里使用的是自己写的一个CrackMe,不使用除了IO的任何系统函数

#include
#include
const char key[] = {104, 100, 107, 125, 108, 118, 100, 99, 96};
int main() {
char input[10] = {0};
scanf("%9s", input);
if (strlen(input) != 9) {
printf("ERROR The length of key is 9 bytes!\n");
return -1;
}
for (int i = 0; i < 9; ++i) {
if (input[i] != (key[9 - i - 1] ^ 5)) {
printf("ERROR The key is incorrect!\n");
return -1;
}
}
printf("OK Thanks to your purchase!\n");
return 0;
}

编译后使用VMProtect对main函数进行VM虚拟机保护

保护后使用IDA查看代码被替换了只剩下VM入口,代码是不可被直接阅读的

push xxx

call xxx

Block数量分析

这里使用的是angr对加密后的二进制文件模拟执行

def main():
ql = Qiling([rf"{ROOTFS}/bin/main_vmp"], ROOTFS, stdin=pipe.SimpleInStream(sys.stdin.fileno()),stdout=pipe.SimpleOutStream(sys.stdout.fileno()))

对程序运行block进行hook,codeNum用来存放此次key所执行的block数

0x401010 - 0x504bB6 是VMP区段,我们仅仅记录该区段的block。

ql.hook_block(trace)
...
def trace(ql, addr, size):
global codeNum
if addr - ql.loader.images[0].base in range(0x401010, 0x504bB6):
codeNum += 1

密钥的生成

该程序的密钥由9个字节组成,字节的范围是0~2^16-1

这里已知该程序的密钥组成是a-z,所以使用a-z进行攻击

用a-z对每一位进行攻击直到block数量增多

src = string.ascii_letters
codeNum = 0
codeNum1 = 0
indexs = [0] * 9
cur = 0
key = ['a'] * 9
...
def start(_ql: Qiling):
global data
global key
//前一个block数量
global codeNum
//当前block数量
global codeNum1
global cur
//当前block > 前一个block
if codeNum > codeNum1:
codeNum1 = codeNum
//前一个block > 当前block
elif codeNum1 > codeNum:
//该位正确
indexs[cur] -=2
//回溯
key[cur] = src[indexs[cur]]
//移动到下一位
cur = cur + 1
//新的一轮猜想
codeNum = 0
data = _ql.save()
key[cur] = src[indexs[cur]]
indexs[cur] +=1
key1 = "".join(key).encode()

函数开始与结尾

为了提升程序运行效率,这里使用angr对VM头时的Context进行保存,拦截put函数对结果进行判断

def start(_ql: Qiling):
...
//存放当前的Context
data = _ql.save()
//写入猜想的key
_ql.os.stdin.write(key1)
def end(_ql: Qiling):
global codeNum
//从edi寄存器取结果字符串
read = str(_ql.mem.read(_ql.reg.rdi, 30))
if "ERROR" in read:
//包含ERROR则还原环境进行下一次攻击
global data
data = _ql.restore(data)
else:
cur = cur + 1
global key
print("密钥:", "".join(key[0:cur]).encode())

运行结果

等待了几十秒密钥便攻击出来了

放到crackme中

完整代码

#!/usr/bin/env python3
import sys
from qiling.extensions import pipe
import string
from qiling import Qiling


ROOTFS = r"/home/mrack/qiling/examples/rootfs/x8664_linux"
src = string.ascii_letters
global data
global key
global codeNum
global codeNum1
global isFirst
codeNum = 0
codeNum1 = 0
indexs = [0] * 9
cur = 0
key = ['a'] * 9
def start(_ql: Qiling):
global data
global key
global codeNum
global codeNum1
global cur
if codeNum > codeNum1:
codeNum1 = codeNum
elif codeNum1 > codeNum:
indexs[cur] -= 2
key[cur] = src[indexs[cur]]
cur = cur + 1


codeNum = 0
data = _ql.save()
key[cur] = src[indexs[cur]]
indexs[cur] += 1
key1 = "".join(key).encode()
_ql.os.stdin.write(key1)
def end(_ql: Qiling):
global cur
global codeNum
read = str(_ql.mem.read(_ql.reg.rdi, 30))
print(codeNum)
if "ERROR" in read:
global data
data = _ql.restore(data)
else:
cur = cur + 1
global key
print("密钥:", "".join(key[0:cur]).encode())
def trace(ql, addr, size):
global codeNum
if addr - ql.loader.images[0].base in range(0x401010, 0x504bB6):
codeNum += 1
def main():
ql = Qiling([rf"{ROOTFS}/bin/main_vmp"], ROOTFS, stdin=pipe.SimpleInStream(sys.stdin.fileno()),
stdout=pipe.SimpleOutStream(sys.stdout.fileno()))
ba = ql.loader.images[0].base
ql.hook_address(start, ba + 0x504168)
ql.hook_address(end, ba + 0x05E0)
ql.hook_block(trace)
ql.run()
if __name__ == "__main__":
main()

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
扎哈罗娃:俄方要求美国从欧洲撤出全部核武器

扎哈罗娃:俄方要求美国从欧洲撤出全部核武器

界面新闻
2024-06-19 19:44:32
带枪却没敢开火,被海警缴枪的菲特种兵,为何连肢体反抗都不敢?

带枪却没敢开火,被海警缴枪的菲特种兵,为何连肢体反抗都不敢?

看度时政观望
2024-06-19 16:39:43
吴谨言同学聚会晒合照,个个气质型靓丽高颜值,丝毫不输女明星

吴谨言同学聚会晒合照,个个气质型靓丽高颜值,丝毫不输女明星

番茄说史聊
2024-06-19 21:06:54
这设计没谁了!华为Mate70 Pro外观首曝,高端设计还得看华为

这设计没谁了!华为Mate70 Pro外观首曝,高端设计还得看华为

最潮家居评
2024-06-19 17:34:46
上海市民叫苦:有些地方确实很坑!被吐槽的“长实线”到底该不该设,如何设?记者多方调查→

上海市民叫苦:有些地方确实很坑!被吐槽的“长实线”到底该不该设,如何设?记者多方调查→

上观新闻
2024-06-19 11:06:58
“中国首次将核弹头置于高度战备状态”

“中国首次将核弹头置于高度战备状态”

枢密院十号
2024-06-17 23:44:53
前国足主帅施拉普纳:很震惊国足平泰国平新加坡,毫无雄心和抱负

前国足主帅施拉普纳:很震惊国足平泰国平新加坡,毫无雄心和抱负

直播吧
2024-06-19 10:58:11
大范围暴雨北上,蓝色大雨区进入河南山东!分析:全面对准特旱区

大范围暴雨北上,蓝色大雨区进入河南山东!分析:全面对准特旱区

中国气象爱好者
2024-06-19 14:51:46
15时,林高远陈幸同官宣喜讯,刘国梁破例,马龙送祝福

15时,林高远陈幸同官宣喜讯,刘国梁破例,马龙送祝福

东球弟
2024-06-19 10:57:10
老一辈为啥看不上现在的高级食材?网友:你猜以前牛油果给谁吃的

老一辈为啥看不上现在的高级食材?网友:你猜以前牛油果给谁吃的

吃货的分享
2024-06-18 22:11:00
尴不尴尬?众多科学家追踪17年的外星信号,竟被一个实习生破案了

尴不尴尬?众多科学家追踪17年的外星信号,竟被一个实习生破案了

莫将离
2024-06-18 22:31:54
美国为何死撑着不降息,将面临比08年次贷危机,还可怕金融危机

美国为何死撑着不降息,将面临比08年次贷危机,还可怕金融危机

浩然观点
2024-06-19 10:23:37
证监会决心“壮士断腕”!6月19日,A股走势或已成定局?

证监会决心“壮士断腕”!6月19日,A股走势或已成定局?

风口招财猪
2024-06-19 20:36:19
连砸31跌停,波及超27万股东!这家A股公司,退市!今天停牌

连砸31跌停,波及超27万股东!这家A股公司,退市!今天停牌

证券时报e公司
2024-06-19 08:38:01
笑不活了,玫瑰的故事林更新和刘亦菲微博互动,笑死在他的评论区

笑不活了,玫瑰的故事林更新和刘亦菲微博互动,笑死在他的评论区

开玩笑的水母
2024-06-18 18:46:33
小米汽车叫小米,为什么华为汽车叫问界?网友:出事方便甩锅

小米汽车叫小米,为什么华为汽车叫问界?网友:出事方便甩锅

三言四拍
2024-06-19 07:23:13
深圳一学区房,三年前14万元/平方米,现在4万元/平方米!

深圳一学区房,三年前14万元/平方米,现在4万元/平方米!

每日经济新闻
2024-06-18 00:16:07
哀悼!211大学教授,多家A股公司独董,因病去世,享年60岁

哀悼!211大学教授,多家A股公司独董,因病去世,享年60岁

双一流高校
2024-06-19 16:50:00
首战吞3弹,乌克兰迁怒FIFA:归化英超27岁队长遭拒!舍瓦崩溃!

首战吞3弹,乌克兰迁怒FIFA:归化英超27岁队长遭拒!舍瓦崩溃!

风过乡
2024-06-19 12:32:24
他是广东省委原书记,1957年被撤职,毛主席:他对党是有功的

他是广东省委原书记,1957年被撤职,毛主席:他对党是有功的

娱乐的宅急便
2024-06-19 18:37:07
2024-06-19 22:58:44
蛮犀安全
蛮犀安全
蛮犀,构智慧安全生活
93文章数 0关注度
往期回顾 全部

科技要闻

618观察:谁为高强度的低价竞争买单?

头条要闻

广东梅州多地因洪水成"孤岛" 救援人员徒步六小时抵达

头条要闻

广东梅州多地因洪水成"孤岛" 救援人员徒步六小时抵达

体育要闻

欧洲杯最大的混子,非他莫属

娱乐要闻

黄一鸣“杀疯了” 直播间卖大葱养孩子

财经要闻

深化科创板改革 证监会发布八条措施

汽车要闻

双肾格栅变化大/内饰焕新 新一代宝马X3官图发布

态度原创

时尚
房产
旅游
教育
家居

《玫瑰的故事》:4种风格50套穿搭,照着穿就很美

房产要闻

17.9亿!终于,有民企在三亚大手笔拿地了!周边房价10万+!

旅游要闻

遭遇极端高温天气导致希腊多名游客死亡

教育要闻

高考生苦练意大利斜体,作文像医生处方,阅卷老师给0分就老实了

家居要闻

自然开放 实现灵动可变空间

无障碍浏览 进入关怀版