網(wǎng)絡(luò)攻防技術(shù)實(shí)驗(yàn),實(shí)驗(yàn)環(huán)境、實(shí)驗(yàn)說明、實(shí)驗(yàn)代碼見 Shellcode Development Lab
Task 1: Writing Shellcode
a: The Entire Process
1)編譯mysh.s得到二進(jìn)制文件
2)執(zhí)行1)中的二進(jìn)制文件,結(jié)果如下圖,我們看到運(yùn)行mysh之前的PID與運(yùn)行mysh之后的PID是不同的,證明我們通過mysh啟動(dòng)了一個(gè)新的shell。
3)獲取機(jī)器碼,以便進(jìn)一步提取shellcode所需要的二進(jìn)制機(jī)器碼,如下圖所示。
4)使用xxd命令打印出二進(jìn)制文件的內(nèi)容,從打印輸出中找到shell的機(jī)器碼,由3)可知機(jī)器碼的起始和結(jié)尾分別為31c0、cd80,因此截取二者之間的內(nèi)容,并將內(nèi)容復(fù)制到convert.py中。
?截取
?替換
5)執(zhí)行convert.py文件,得到shellcode中包含的16進(jìn)制形式的機(jī)器碼,如下:
b: Eliminating Zeros from the Code
1)task里給的操作如下圖。但我們不允許添加額外的,機(jī)器碼中不能出現(xiàn)0,我的理解是,匯編碼里不能出現(xiàn)類似push “”的操作,因此考慮其他構(gòu)造方法。
2)我們參考前文中對0的處理,將”h###”(#為占位符)賦值給ebx,然后左移24bit,右移24bit,讓”h###”變?yōu)椤県%0%0%0”,其他部分原理不變。
?前文中的處理
?修改mysh
3)運(yùn)行并查看機(jī)器碼,發(fā)現(xiàn)更改有效且不存在%0
?運(yùn)行發(fā)現(xiàn)成功
?查看機(jī)器碼
?查看機(jī)器碼,無%0
c: Providing Arguments for System Calls
1)?修改mysh,將/bin/sh -c "ls -la"壓入棧中,通過#占位和左右移位的方式來引入空格。
?修改后的mysh
2)編譯并執(zhí)行mysh-c,并直接在命令行中輸入“l(fā)s -la”,觀察到二者結(jié)果相同。
?執(zhí)行mysh-c
?命令行直接執(zhí)行l(wèi)s -la
3)查看mysh.o的二進(jìn)制機(jī)器碼,發(fā)現(xiàn)沒有0。
?mysh十六進(jìn)制機(jī)器碼
Task 2: Using Code Segment
1)對①-②處的代碼進(jìn)行解釋
?原始代碼
按代碼執(zhí)行順序而非從上至下的順序:
- call one ????????? ?? ???? :將函數(shù)one壓入棧中,再跳轉(zhuǎn)到函數(shù)one
- db ‘xxxx’ ??????? ? ?????? :構(gòu)建由命令、分隔符、占位符構(gòu)成的字符串
- pop ?????????????????????? ? :將棧中最頂層的值(2中字符串)pop出并裝入ebx中
- xor eax, eax ???? ? ??? :通過異或?qū)ax置0
- mov [ebx+7], al ? ??? :把2中字符串的*的位置替換為%0,用于截?cái)?/span>
- mov [ebx+8], ebx ?? :把命令”/bin/sh”的地址賦給占位符AAAA
- mov [ebx+12], eax? :把BBBB賦值為NULL
- Lea ???????????????????????? :把命令”/bin/sh”的地址賦給ecx
- xor edx, edx ?????????? :把edx置為NULL
- mov al 0x0b ???? ? ? ? :把execve系統(tǒng)調(diào)用號作為參數(shù)傳入
- Int 0x80 ??????? ? ? ? ?? :調(diào)用128號中斷
最終,mysh2.s可用c語言總結(jié)為:
????????char?*command[] = {"/bin/sh", NULL};
????????execve(command[0], command, NULL);
2)env用于打印環(huán)境變量,env后加“-”表示參數(shù)選項(xiàng),因此構(gòu)造字符串“/usr/bin/env - a=11 b=22”
?3)構(gòu)造字符串并在mysh2.s基礎(chǔ)上進(jìn)行修改。
思路和mysh2.s一致,先將用%0替代分割位來截?cái)啵賹⒌刂焚x值給占位符,最后對寄存器進(jìn)行處理,構(gòu)造的命令為 /usr/bin/env - a=11 b=11,最終構(gòu)造的字符串為'/usr/bin/env*-*a=11*b=22*AAAABBBBCCCCDDDDEEEE',其中*是分隔符,后續(xù)會(huì)通過mov [esi+x], al操作被賦予0,AAAABBBBCCCCDDDDEEEE是占位符,分別填充四個(gè)子命令的地址和最后一個(gè)傳遞給execve的參數(shù)NULL。
section .text
global _start
_start:
BITS 32
jmp short two
one:
pop esi
xor eax, eax
mov [esi+12], al ; /usr/bin/env%0
mov [esi+14], al ; -%0
mov [esi+19], al ; a=11%0
mov [esi+24], al ; b=22%0
mov [esi+25], esi ; address of /usr/bin/env in AAAA
lea ebx, [esi+13] ; get address of -
mov [esi+29], ebx ; address of - in BBBB
lea ebx, [esi+15] ; get address of a=11
mov [esi+33], ebx ; address of a=11 in CCCC
lea ebx, [esi+20] ; get address of b=22
mov [esi+37], ebx ; address of b=22 in DDDD
mov [esi+41], eax ; put NULL in EEEE
mov al, 0x0b ; pass the execve syscall number as argument
mov ebx, esi
lea ecx, [esi+25] ; /usr/bin/env - a=11 b=22
lea edx, [esi+41] ; NULL
int 0x80 ; execve
two:
call one
db '/usr/bin/env*-*a=11*b=22*AAAABBBBCCCCDDDDEEEE'
?最終,修改后的mysh2.s可用c語言總結(jié)為:
????????char?*command[] = {"/usr/bin/env", "-", "a=11", "b=22" NULL};
????????execve(command[0], command, NULL);
4)編譯并執(zhí)行
?如果忘加--omagic會(huì)出現(xiàn)segmentation fault,--omagic選項(xiàng)使代碼段可寫。
Task 3: Writing 64-bit Shellcode
1)參考b: Eliminating Zeros from the Code中左右移位將占位符替換為%0的操作修改mysh_64,代碼如下:
?2)編譯并運(yùn)行,發(fā)現(xiàn)成功。
參考資料:
Shellcode Development Lab
使用netcat進(jìn)行反彈鏈接的shellcode - xxxxxxxx1x2xxxxxxx - 博客園
用匯編語言構(gòu)造簡單的shellcode(64位&&32位)以及將匯編語言轉(zhuǎn)換成機(jī)器碼的方法 - ZikH26 - 博客園文章來源:http://www.zghlxwxcb.cn/news/detail-412064.html
linux 下env命令介紹 - 墨天輪文章來源地址http://www.zghlxwxcb.cn/news/detail-412064.html
到了這里,關(guān)于網(wǎng)絡(luò)攻防技術(shù)-Lab5-shellcode編寫實(shí)驗(yàn)(SEED Labs – Shellcode Development Lab)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!