实现Return-to-libc
攻击linux
retaddr+nop+shellcode
,nop+shellcode+retaddr
,缓冲区小就就把shellcode放后边,否则就放前边Return-to-libc
是缓冲区溢出的变体攻击,这种攻击不须要一个栈能够执行,甚至不须要一个shelcode
,取而代之的是咱们让漏洞程序调转到现存的代码(好比已经载入内存的lib库中的system()函数等)来实现咱们的攻击shell
编写一段sellcode,文件保存名20145308shellcode
bash
安装execstack
服务器
设置堆栈可执行,并查询堆栈是否可执行,以便shellcode在堆栈上能够执行
网络
关闭地址随机化,避免每次执行分配的内存地址不一样
函数
采起nop+shellcode+retaddr
方式构造payload
(\x4\x3\x2\x1
将覆盖到堆栈上的返回地址的位置,须要将它改成shellcode的地址)
学习
\x4\x3\x2\x1
处返回地址应该填什么注入攻击buf
操作系统
5308pwn
进程首先要找到5308pwn
进程号,找到5308
的进程号是2906
3d
启动gdb调试进程,设置断点,查看注入buf的内存地址
调试
设置断点后,在另外一个终端按下回车,并寻找返回地址,看到01020304
表示返回地址的位置是0xffffd33c
,shellcode
就紧挨着这个地址,加四字节为0xffffd340
退出gdb,按照anything+retaddr+nops+shellcode
修改input_shellcode
以下
成功
Return-to-libc
攻击sudo apt-get update
sudo apt-get install lib32z1 libc6-dev-i386
sudo apt-get install lib32readline-gplv2-dev
,安装未成功,参照同窗博客,发现安装与否没有太大关系
进入32位linux环境,并使用bash
关闭地址空间随机化
使用另外一个shell程序(zsh)代替/bin/bash
,设置zsh程序
编写retlib.c
编译程序,并设置SET-UID
须要用到一个读取环境变量的程序:getenvaddr.c
编译
编写exploit.c
用刚才的getenvaddr
程序得到BIN_SH
地址,0xffffdf43
gdb
得到system
和exit
地址编译
gdb,获得system
地址0xf7e2eb30
,exit
地址0xf7e227e0
修改exploit.c
文件,填上刚才找到的内存地址
删除刚才调试编译的exploit程序和badfile文件,从新编译修改后的exploit.c
先运行攻击程序exploit,生成了badfile文件,再运行漏洞程序retlib,可见攻击成功,得到了root权限
Return-to-libc
的实验,实现了在栈不可执行的状况下,让漏洞程序调转到现存的代码开始编译exploit程序出错,运行结果是攻击程序和漏洞程序都是运行错误,后来发现本身写代码的时候把fopen
写成了open
致使错误