shellcode
程序员文章站
2022-07-15 14:30:22
...
构造一段shellcode的作用就是为了在缓冲区溢出时将shellcode的地址覆盖掉正常的返回地址。
题目:
1Ch=16+12=28,+esp=32:偏移量是32
能溢出:100-0x1c-4=68字节
C伪代码:
理论基础
函数返回步骤 :
- 保存返回值:函数返回值保存在EAX寄存器
- 弹出当前栈帧,恢复上一个栈帧
a) ESP + 当前栈帧大小:堆栈平衡基础上,降低栈顶,回收当前栈帧空间
b) POP EBP:前栈帧EBP弹给EBP,恢复上一个栈帧
c) POP EIP:函数返回地址弹给EIP - 跳转:按EIP的值返回母函数继续执行
由函数调用过程可知,一般情况下,ESP中地址总是指向系统栈且不会被溢出的数据破坏。函数返回时,ESP所指的位置是淹没的返回地址的下一位(子函数平衡栈ret n时,ESP将指向下n位)。
可用”jmp esp”作为跳板动态定位shellcode
- 用内存中任意一个”jmp esp”的地址覆盖返回地址
- 函数返回后被重定向去执行内存中jmp esp指令
- 由于函数返回后ESP指向返回地址后,jmp esp执行后,CPU将到栈区函数返回地址之后的地方取指令执行
- shellcode的布置。缓冲区前面一段用任意数据填充,把shellcode放在函数返回地址后面。jmp esp执行完就执行shellcode。
构造shellcode
用asm(shellcraft())这个方法不行
那么
新建一个.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
注意:①ld的时候选择x32还是x64要看这个elf文件
②objdump的地方是写生成的elf文件的文件名
脚本:
关于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
上一篇: Photographer-writeup
下一篇: Mybatis同时传入对象与普通参数