欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

shellcode

程序员文章站 2022-07-15 14:30:22
...

构造一段shellcode的作用就是为了在缓冲区溢出时将shellcode的地址覆盖掉正常的返回地址。

题目:

shellcode
1Ch=16+12=28,+esp=32:偏移量是32
能溢出:100-0x1c-4=68字节

C伪代码:

shellcode

理论基础

函数返回步骤 :

  1. 保存返回值:函数返回值保存在EAX寄存器
  2. 弹出当前栈帧,恢复上一个栈帧
    a) ESP + 当前栈帧大小:堆栈平衡基础上,降低栈顶,回收当前栈帧空间
    b) POP EBP:前栈帧EBP弹给EBP,恢复上一个栈帧
    c) POP EIP:函数返回地址弹给EIP
  3. 跳转:按EIP的值返回母函数继续执行

由函数调用过程可知,一般情况下,ESP中地址总是指向系统栈且不会被溢出的数据破坏。函数返回时,ESP所指的位置是淹没的返回地址的下一位(子函数平衡栈ret n时,ESP将指向下n位)。
可用”jmp esp”作为跳板动态定位shellcode

  1. 用内存中任意一个”jmp esp”的地址覆盖返回地址
  2. 函数返回后被重定向去执行内存中jmp esp指令
  3. 由于函数返回后ESP指向返回地址后,jmp esp执行后,CPU将到栈区函数返回地址之后的地方取指令执行
  4. shellcode的布置。缓冲区前面一段用任意数据填充,把shellcode放在函数返回地址后面。jmp esp执行完就执行shellcode。

shellcode
THANKS

构造shellcode

用asm(shellcraft())这个方法不行
shellcode
那么
新建一个.asm文件放汇编代码:

global _start
_start:
    xor eax,eax        ;
    push eax           ;
    push 0x68732f2f    ;
    push 0x6e69622f    ;
    mov ebx,esp        ;
    push eax           ;
    push ebx           ;
    mov ecx,esp        ;
    xor edx,edx        ;
    mov al,0xb         ;
    int 0x80

进行下图步骤就会生成:
shellcode
shellcode
框框里就是shellcode
注意:①ld的时候选择x32还是x64要看这个elf文件
②objdump的地方是写生成的elf文件的文件名

脚本:

shellcode

关于shellcode

shellcode 修改返回地址使其指向溢出数据中的一段指令

ROP 是使其指向内存中已有的一段指令

ASLR 地址随机化(libc就是绕过这个的机制)

系统调用 linux中系统提供的核心函数,可以方便的实现各种功能。
查看系统调用表: /usr/include/asm-i386/unistd.h 内容:

#define_NR_exit 1
#define_NR_execve 11

\x00 截断符 shellcode中出现\x00就会从中截断,所以构造shellcode的时候要避免\x00

为什么是/bin//sh 需要分割成两个4 byte 的部分 /bin和/sh 但是/sh只有3 byte 所以会自动填充一个NULL

references:
11111
2222222