【golang】wait,why not safe

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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的一些知識,我想做一個動畫,從視窗的維度再解釋一下。



本文出自 “青客” 部落格,請務必保留此出處http://qingkechina.blog.51cto.com/5552198/1895889

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.