[英]How does XOR prevent NULL bytes in shellcode
我一直在嘗試按照本教程( https://paraschetal.in/writing-your-own-shellcode )來編寫自己的shellcode。 99%的代碼對我來說很有意義,但是我心中只有兩個揮之不去的疑問-這與編寫shellcode有關
首先,我想我理解為什么我們要避免空字節,但是使用以下內容如何避免空字節?
xor eax, eax
eax
現在不完全包含空字節嗎? 還是包含0? 當我們對自身進行異或運算時,它返回False,對嗎?
其次,本教程說:
最后,我們將系統調用號(11或0xb)加載到eax寄存器中。 但是,如果我們在指令中使用eax,則生成的shellcode將包含一些NULL(\\ x00)字節,我們不希望這樣。 我們的eax寄存器已經為NULL。 因此,我們將系統調用號加載到al寄存器中,而不是整個eax寄存器中。
mov byte al, 0x0b
現在,我知道這里發生了什么,數字11(對於execve
)正在加載到eax
寄存器的前8位(即al
)中。 但是eax
的其余部分仍然包含空字節,那么這里到底能實現什么呢?
請注意,在花了大部分時間試圖了解這一點之后,我才來這里作為最后的選擇,所以請放心:)
漏洞通常會攻擊C代碼,因此shell代碼通常需要以NUL終止的字符串形式交付。 如果Shell代碼包含NUL字節,則被利用的C代碼可能會忽略並丟棄從第一個零字節開始的其余代碼。
這僅涉及機器代碼 。 如果您需要使用數字0xb調用系統調用,那么自然地您需要能夠在EAX寄存器中生成數字0xb,但是您只能使用機器代碼本身中不包含零字節的那些形式的機器代碼。 。
xor eax, eax
將反轉eax
中的所有1 位 ,即將其清零 。 它在功能上等同於
mov eax, 0
不同之處在於后者將在機器代碼的0編碼為零字節。
機器代碼
xor eax, eax
mov byte al, 0x0b
是
31 c0 b0 0b
如您所見,其中沒有嵌入的零字節。 機器代碼
mov eax, 0xb
是
b8 0b 00 00 00
這兩個程序在功能上等效,因為它們將EAX寄存器的值設置為0xb。
如果后一個外殼程序代碼由C程序作為一個以空終止的字符串處理,則b8 0b 00
之后的其余部分可能會被程序丟棄,並由內存中的其他字節替換,這實際上使外殼程序代碼無法工作。
指令mov eax, 0
匯編為
b8 00 00 00 00
包含NUL個字節。 但是,指令xor eax, eax
匯編為
31 c0
它沒有NUL字節,因此適用於Shell代碼。
同樣,適用於mov al, 0x0b
。 如果執行mov eax, 0x0b
,則編碼為
b8 0b 00 00 00
包含NUL個字節。 但是, mov al, 0x0b
編碼為
b0 0b
避免NUL字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.