iT邦幫忙

2022 iThome 鐵人賽

DAY 27
1
DevOps

Golang X DevOps系列 第 27

Day 27 - Introduce to Golang Fuzzing (3)

  • 分享至 

  • xImage
  •  
  • 在昨天我們看到了以下錯誤
go test fuzz v1
string("ᓿ")

導致錯誤的原因

  • 在 Go 中,String 其實就是幾段唯讀Byte組成的,而 Byte 的格式都是長這樣
\xNN  #而NN的範圍從十六進位的00到FF都被包括在裡面
  • 而我們目前的 reverse 函式目前都是 一個一個 Byte 去 reverse 的,這樣會產生甚麼問題ㄋ?
  • 我們的 Seed Corpus 裡面的字元都是 Single Byte,而在編碼當中,一個符號或是字元是可以擁有多個 byte 的
\0xfc\0x13\0xc3 #這樣可能是一個字元
  • 所以代表說我們 reverse byte by byte 的話,會造成有多個 byte 的字元變成無效字元
  • 所以這時候要把儲存 String 的方法改掉

Runes

  • 在 Go 中,除了 String 以外,還有個咚咚叫做 Runes
  • runes的作用,就是把我們前面的 Byte by Byte 變成是有效的字符會弄在一起
  • 用說的太複雜,看一下下面的 code
func main() {
	example := "鐵人"
	fmt.Println([]rune(example))
	fmt.Println([]byte(example))
}
----------------------------------
Output:
[37941 20154]
[233 144 181 228 186 186]
  • 我們可以很清楚的看到說,rune 會把這個字當作一個完整的 UTF-8 來翻 而不是 byte 一個一個字節去翻
  • 所以我們需要的就是在 reverse 的時候把 string 改成 rune 的型態
  • 所以我們把 Reverse() 的參數 StringRunes 去接起來換掉變成下面這個樣子
func Reverse(s string) string {
    r := []rune(s)
    for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
        r[i], r[j] = r[j], r[i]
    }
    return string(r)
}
  • 那我們再 run 一次 go test 就會看到結果不同啦

上一篇
Day26 - Introduce to Golang Fuzzing (2)
下一篇
Day 28 - Debugger and Fuzzing to Success
系列文
Golang X DevOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言