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

使用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.

相关推荐
热点推荐
我党官方认定的新中国缔造者只有4位,最难获取的一个讣告评价

我党官方认定的新中国缔造者只有4位,最难获取的一个讣告评价

轮回历史
2024-06-26 08:05:35
葡萄牙爆冷输球,匈牙利因此出局,两队本可能16强对阵

葡萄牙爆冷输球,匈牙利因此出局,两队本可能16强对阵

直播吧
2024-06-27 05:26:12
单价已逼近30万/平,上海即将迎来“暴涨”时刻?

单价已逼近30万/平,上海即将迎来“暴涨”时刻?

地产大爆炸
2024-06-26 21:37:11
情商低成这样,他不红是有原因的!

情商低成这样,他不红是有原因的!

钱小刀娱乐
2024-06-25 23:28:10
OpenAI停用,砸了谁的饭碗?

OpenAI停用,砸了谁的饭碗?

虎嗅APP
2024-06-25 15:53:13
首播将至!王宝强时隔12年再出新剧,质感赶超梁朝伟,熬夜也要追

首播将至!王宝强时隔12年再出新剧,质感赶超梁朝伟,熬夜也要追

简读视觉
2024-06-26 21:30:02
麦穗丰:张子宇击碎所有质疑 好久没见这么“离谱”的中国球员了

麦穗丰:张子宇击碎所有质疑 好久没见这么“离谱”的中国球员了

直播吧
2024-06-26 21:16:55
笑不活了!陈法官又上热搜了,网友隔空喊话人民需要你

笑不活了!陈法官又上热搜了,网友隔空喊话人民需要你

娱乐小可爱蛙
2024-06-26 10:17:16
日本母子苏州遇袭凶手曝光!女英雄力挽大局:对妇幼下手是爱国?

日本母子苏州遇袭凶手曝光!女英雄力挽大局:对妇幼下手是爱国?

大风文字
2024-06-26 10:07:31
觉醒吧!中国需要真实声音,拒绝盲目歌颂!

觉醒吧!中国需要真实声音,拒绝盲目歌颂!

雪莉故事汇
2024-06-24 07:27:47
大陆将“台独”定罪,率先发抖的不是赖清德,而是这个人,不简单

大陆将“台独”定罪,率先发抖的不是赖清德,而是这个人,不简单

DS北风
2024-06-26 09:18:12
欧洲杯16强诞生!5大豪强死亡半区,法国死磕世界第3,英格兰赢家

欧洲杯16强诞生!5大豪强死亡半区,法国死磕世界第3,英格兰赢家

钉钉陌上花开
2024-06-27 05:25:04
巴黎这一天,欧美女星“更大胆了”,却被张馨予“中国范儿”惊艳

巴黎这一天,欧美女星“更大胆了”,却被张馨予“中国范儿”惊艳

嫹笔牂牂
2024-06-25 21:40:55
OpenAI为何突然“翻脸”?上海创业者与微软紧急沟通,商汤也行动起来

OpenAI为何突然“翻脸”?上海创业者与微软紧急沟通,商汤也行动起来

上观新闻
2024-06-26 20:33:25
你见过最主动的女生是什么样的?网友们也太会了!

你见过最主动的女生是什么样的?网友们也太会了!

滑稽斑马呀
2024-06-18 18:38:21
大批澳华人接到电话,不注销户口会影响征信,影响免签往返国内

大批澳华人接到电话,不注销户口会影响征信,影响免签往返国内

土澳的故事
2024-06-26 16:57:36
男人即使不富裕,到了中年也别戴这“4种”首饰,廉价寒酸没品味

男人即使不富裕,到了中年也别戴这“4种”首饰,廉价寒酸没品味

白宸侃片
2024-06-26 23:13:58
火箭探花能拿多少钱?最高签4年4590万美元合同 菜鸟赛季1010万

火箭探花能拿多少钱?最高签4年4590万美元合同 菜鸟赛季1010万

直播吧
2024-06-27 08:49:22
丁丁:更衣室很安静晋级也没人庆祝;我们没什么需要被原谅的

丁丁:更衣室很安静晋级也没人庆祝;我们没什么需要被原谅的

懂球帝
2024-06-27 04:55:28
4年4000万!太阳第一签!再见了,湖人队

4年4000万!太阳第一签!再见了,湖人队

篮球教学论坛
2024-06-26 11:46:35
2024-06-27 09:06:44
蛮犀安全
蛮犀安全
蛮犀,构智慧安全生活
93文章数 0关注度
往期回顾 全部

科技要闻

OpenAI在国内的两条应用之路走不通了?

头条要闻

福建武平中考前遇暴雨 中学泡2米洪水中百余学生被困

头条要闻

福建武平中考前遇暴雨 中学泡2米洪水中百余学生被困

体育要闻

战胜心中的魔鬼,36岁的他上演欧洲杯首秀

娱乐要闻

冯绍峰带儿子看舞台剧,想想更像妈妈

财经要闻

曹远征:不能被"产能过剩"的概念所困惑

汽车要闻

37.99万起坐拥"陆地空客" 翼真L380上市

态度原创

本地
时尚
游戏
旅游
公开课

本地新闻

冷知识:东北雪糕才是最早的网红雪糕

夏季如何根据身材挑选半身裙?

Q版美少女动作游戏《幻象破坏者:战场终极版》2月发售

旅游要闻

7月1日起沙特将成为中国公民出境团队游目的地

公开课

连中三元是哪三元?

无障碍浏览 进入关怀版