shellcode

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

题目:

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

C伪代码:

shellcode_第2张图片

理论基础

函数返回步骤 :

  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_第3张图片
THANKS

构造shellcode

用asm(shellcraft())这个方法不行
shellcode_第4张图片
那么
新建一个.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_第5张图片
shellcode_第6张图片
框框里就是shellcode
注意:①ld的时候选择x32还是x64要看这个elf文件
②objdump的地方是写生成的elf文件的文件名

脚本:

shellcode_第7张图片

关于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

你可能感兴趣的:(PWN)