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

使用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-11-23 06:58:12
证监会停止降温股市!11月23日,今日凌晨的三大消息全面发酵!

证监会停止降温股市!11月23日,今日凌晨的三大消息全面发酵!

风口招财猪
2024-11-23 01:21:36
拜登想最后扶泽连斯基一把,但可能更快送走他

拜登想最后扶泽连斯基一把,但可能更快送走他

观察者网
2024-11-22 15:53:21
0冠噩梦!C罗凌乱1夜:生涯911球+斩MVP 利雅得胜利恐落后榜首9分

0冠噩梦!C罗凌乱1夜:生涯911球+斩MVP 利雅得胜利恐落后榜首9分

风过乡
2024-11-23 06:44:55
被遣返的20万美籍华人,失去中国籍又被剥夺美籍,他们将何去何从

被遣返的20万美籍华人,失去中国籍又被剥夺美籍,他们将何去何从

南城无双
2024-11-22 16:38:11
WTT总决赛!11月23日赛程出炉:诞生2项冠军,林诗栋再战张本智和

WTT总决赛!11月23日赛程出炉:诞生2项冠军,林诗栋再战张本智和

知轩体育
2024-11-22 23:32:26
农夫山泉被举报

农夫山泉被举报

鲁中晨报
2024-11-23 07:24:08
炸裂!山西一女老师出轨学生:经过曝光,誓言情深,老师照片扒出

炸裂!山西一女老师出轨学生:经过曝光,誓言情深,老师照片扒出

娜乌和西卡
2024-11-22 21:26:30
A股:黑天鹅来袭,中国资产集体大跌,内外联合砸盘,触发恐慌盘

A股:黑天鹅来袭,中国资产集体大跌,内外联合砸盘,触发恐慌盘

云姐财说
2024-11-23 00:09:50
“带96岁母亲酒店养老遭拉黑”男子最新发声:母亲已去世,将起诉维权

“带96岁母亲酒店养老遭拉黑”男子最新发声:母亲已去世,将起诉维权

极目新闻
2024-11-23 07:58:56
急速拉升!离岸人民币汇率突破7.26关口

急速拉升!离岸人民币汇率突破7.26关口

每日经济新闻
2024-11-22 20:10:10
我们把“乱港分子”四十多人判刑之后,德国媒体非常愤怒!

我们把“乱港分子”四十多人判刑之后,德国媒体非常愤怒!

星辰故事屋
2024-11-22 20:32:46
外省民警进浙江把企业家带走勒索!谁能忍得了?直接公诸于众

外省民警进浙江把企业家带走勒索!谁能忍得了?直接公诸于众

大风文字
2024-11-22 10:03:23
旺旺集团凌晨回应“牛奶中疑现异物”

旺旺集团凌晨回应“牛奶中疑现异物”

界面新闻
2024-11-23 08:19:30
南航拟出售10架波音787-8型飞机

南航拟出售10架波音787-8型飞机

每日经济新闻
2024-11-22 10:31:14
前体操运动员下海做擦边!管晨辰评论区手撕,对方回应不耻反荣

前体操运动员下海做擦边!管晨辰评论区手撕,对方回应不耻反荣

小咪侃娱圈
2024-11-22 14:27:59
港独分子梁颂恒:叫嚣“香港不是中国的”,马化腾要求其滚出中国

港独分子梁颂恒:叫嚣“香港不是中国的”,马化腾要求其滚出中国

一娱三分地
2024-11-22 21:30:47
张劲松、王毅,被开除党籍

张劲松、王毅,被开除党籍

鲁中晨报
2024-11-22 23:24:19
浙大一贫困生晒国内外多地旅游照引热议 该生家乡民政局回应:贫困证明没问题

浙大一贫困生晒国内外多地旅游照引热议 该生家乡民政局回应:贫困证明没问题

封面新闻
2024-11-22 18:15:12
兰州交大一对情侣走红,堪称“赤壁之战”,大学生跟风打卡惹争议

兰州交大一对情侣走红,堪称“赤壁之战”,大学生跟风打卡惹争议

妍妍教育日记
2024-11-22 18:18:10
2024-11-23 08:27:00
蛮犀安全
蛮犀安全
蛮犀,构智慧安全生活
99文章数 0关注度
往期回顾 全部

科技要闻

能者归来,蒋凡重回阿里电商权力中心

头条要闻

俄军首次向乌发射"无法拦截"导弹 美媒:打不到美国

头条要闻

俄军首次向乌发射"无法拦截"导弹 美媒:打不到美国

体育要闻

1年半夺2冠!迈阿密主帅马蒂诺因私人原因辞职

娱乐要闻

受王宝强资助孩子父亲发声

财经要闻

祝宝良:增量政策可使明年GDP增长5%左右

汽车要闻

对话张纯伟:80万!捷途立了一个新Flag

态度原创

旅游
艺术
时尚
教育
数码

旅游要闻

莲花山滑雪场向摄影界、新闻界免费开放!

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

明年开年这个盛会,含金量还在上涨!

教育要闻

动点杠上系列,新定义问题怕不怕?

数码要闻

2024新一代人工智能(深圳)创业创新大赛

无障碍浏览 进入关怀版