【golang】wait,why not safe

slice?俺知道,不就是基于数组的一个视窗嘛!

出个题呗~

好~

package main

func main() {

var arr = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

s := arr[2:6]

modify(s)

}

func modify(tmp []int) {

// 实现该函数,把arr[8]的值修改为200

}



你千万别告诉我是这样实现的:

var point = &tmp[3]

point += 3

*point = 200

这样做你真的可费瞎了心了 :)

因为golang指针不允许运算,像这样会抛invalid operation: point += 3 (mismatched types *int and int)错误~~~



算了吧,还是放着让哥来

浅蓝色的是slice当前的长度,整个蓝色(浅蓝色+深蓝色)是slice的容量

站在从slice的视窗来看当前能看到{2,3,4,5},但如果扩大slice的容量就可以看到{2,3,4,5,6,7,8,9},从slice的意义上来看,由slice可以修改数组的arr[8]。



(1)获取s[3]的地址,即arr[5]的地址

&s[3]

(2)把s[3]的地址转换为不安全的指针

unsafe.Pointer(&s[3])

(3)把s[3]不安全的指针转换为uint地址

uintptr(unsafe.Pointer(&s[3]))

(4)把指针向后移3个元素

var nextElement = uintptr(unsafe.Pointer(&s[3])) + 3 * 8   // 我怎么知道每个int占8个字节,可以用unsafe.Offsetof查看

(5)把目标元素的uint地址转换为不安全的指针

unsafe.Pointer(nextElement )

(6)把目标元素的不安全指针转换为地址

(*int)(unsafe.Pointer(nextElement ))

(7)修改目标元素的值

*(*int)(unsafe.Pointer(nextElement )) = 200

完整的程序如下:

package main

import "fmt"

import "unsafe"

func main() {

var arr = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

s := arr[2:6]

modify(s)

fmt.Println(arr)

}

func modify(tmp []int) {

var src = uintptr(unsafe.Pointer(&tmp[3]))

var dest = (*int)(unsafe.Pointer(src + 3*8))

*dest = 200

}

执行一下结果为:

[0 1 2 3 4 5 6 7 200 9]



所以尽管只是slice了数组的一部分,并且没有扩容,攻击者只是通过对slice的操作,依旧可以攻到底层数组不可见的元素,从安全编码角度来看,这是一个安全隐患 :)



关于slice的一些知识,我想做一个动画,从视窗的维度再解释一下。

时间: 2024-11-07 14:59:43

【golang】wait,why not safe的相关文章

关于【bootstrap】中,【tooltip】的不算bug的bug的个人看法

先说下遇到这个问题的背景吧. 就是在页面中有个div,这个div右上角(或者其他位置)有个 × 的图标(这个图标添加tooltip工具提示),光标移到这个图标时,触发tooltip,提示“点击移除”这样类似的字样,然后点击后,把这个div作remove()这样的删除操作. 然后,问题来了,因为这个div被remove()了,导致生成的tooltip对应的 × 图标也被remove(),因为找不到,所以对应的mouseout(可能是mouseleave事件,参考了一下bootstrap的源码,没找

点滴积累【C#】---验证码,ajax提交

效果: 思路: 借用ashx文件创建四位验证,首先生成四位随机数字.然后创建画布,再将创建好的验证码存入session,然后前台进行button按钮将文本框中的值进行ajax请求到后台,和session中的验证码进行对比,成功返回true,失败返回false. 代码: [前台] 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="verifycodeDemo.aspx.cs"

【Demo】QQ,github,微博第三方社交登录

本文主要讲解 集成 第三方社交账号登录 为什么会有这个需求? 主要是因为目前互联网的网站数量太多,如果在各个站点都注册一个账号 用户非常不容易记住每个账号的用户名和密码,并且非常难保证每个账号的密码足够安全 而目前流行的社交网站 基本上每个用户都有账号,如果通过这类社交网站登录 就能得到如下几点好处 用户不用再注册其他账号 用户只能维护社交账户足够安全就行了,使用此社交账号登录的就是安全的了 常见的第三方社交账号有哪些? QQ 微信 新浪微博 人人网 百度 Github 如何加入第三方登录功能?

【UIKit】UIAlert,UIActionSheet

[Alert] 1.加入协议 <UIAlertViewDelegate,UIActionSheetDelegate> 2. -(IBAction)btnShowAlertView:(id)sender { UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"标题" message:@"对话框的内容" delegate:self cancelButtonTitle:@"关闭" o

【专题】偏序,扫描线

[关键字]偏序,数点,树状数组,线段树,扫描线. 因为涉及多种算法,所以整合到一起. [扫描线] 二维数点,偏序 ★数点问题 ★关于偏序问题的一些总结 一维偏序:排序二分 树状数组 二维偏序:排序扫描线+树状数组(差分)/线段树 三维偏序:排序扫描线+cdq分治+树状数组 排序扫描线+二维数据结构 基本思想是一维扫描线顺序扫描维护差分,一维用数据结构维护区间(线段树维护区间,树状数组差分维护前缀和). [BZOJ3161]布娃娃(扫描线+线段树) BZOJ 4059 Cerc2012 Non-b

【序列化】小结,逐步完善中

网上查了资料,序列化有多种方法,这里我写上自己刚用过的一种生成XML文件的,有需要的朋友可以自己百度一下其他方法. 1.添加引用 "using System.Xml.Serialization;": 2.用"[Serializable]"标记上要序列化的类,如下图 [Serializable] public class LogService { public string strName; public string strImage; public string

【题解】Leyni,罗莉和队列(树状数组)

[题解]Leyni,罗莉和队列(树状数组) HRBUST - 1356 将整个序列reverse一下,现在就变成了从高到低的排队.题目就变成了,定位一个妹子,问这个妹子前面的比这个妹子小的妹子中,下标最小的数是哪个. 所以以年龄为下标,以(原数组)下标为值建立一颗值域线段树,由于我们只要找到在原数组下标最小的哪一个,所以相当于动态维护前缀\(\min\) ,由于我们只要查询比当前定位妹子小的一段前缀,所以拿树状数组代替就是了. 由于这群妹子是神仙(年龄可达1e9),所以要离散化一下. 复杂度\(

【转】双层,多层vpn连接实现及分析

转载自:http://bbs.51cto.com/thread-1099702-1.html 相信很多人之前都看过一篇帖子<WJ是如何找到发帖人>,这篇帖子原来原出处safe121,由核总从乌云分享到自己的个人网站!假如没有看过看过的话,可以从这里去了解一下!<传送门>    也是因为这个帖子的缘由,我和论坛的 @问题好解决 决定做一些简单的实验去验证一下!我们想比较一下,多层vpn与多层跳板这个是否都能实现隐藏的作用!但在实验这期间有很多的失败,最终选择一个简单容易实现的方案去验

【python】-- 列表,元组

本节内容 字符串格式化输出 数据运算 for循环 while循环 列表 元组 [字符串格式化输出] 占位符 %s-string,%d-digital,%f -float # __author__:"ShengXin" #__date__:2017/8/23 name = input("name:") age = int(input("age:")) job = input("job:") salary = input(&quo