ROP-Ret2Shellcode-64位实例

/usr/include/x86_64-linux-gnu/asm/unisted_64.h

[PWN][进阶篇]ROP-Ret2Shellcode-64位实例_linux[PWN][进阶篇]ROP-Ret2Shellcode-64位实例_全局变量_02编写64位shellcode,思路和32位是一样的

(1)想办法调用execve("/bin/sh",null,null)

(2)借助栈来传入字符串/bin/sh

(3)系统调用execve

rax = 0x3b(64bit)

rdi = bin_sh_addr

rsi = 0

rdx = 0

[PWN][进阶篇]ROP-Ret2Shellcode-64位实例_可执行_03

实例代码如下:

[PWN][进阶篇]ROP-Ret2Shellcode-64位实例_可执行_04

setvbuf函数的作用是优化io流,在服务器上时,或者是比赛时,一般都会有这个函数。

我们还发现了最重要的切入点 get()

我的大刀已经饥渴难耐了

实例开始

step1 检查保护

[PWN][进阶篇]ROP-Ret2Shellcode-64位实例_可执行_05step2 查看buf2

[PWN][进阶篇]ROP-Ret2Shellcode-64位实例_全局变量_06

[PWN][进阶篇]ROP-Ret2Shellcode-64位实例_可执行_07

step3 查601080的段是否可执行

[PWN][进阶篇]ROP-Ret2Shellcode-64位实例_pwn_08我们利用vmmap看看601080

[PWN][进阶篇]ROP-Ret2Shellcode-64位实例_可执行_09rwxp权限,可以执行

step4 计算偏移

cyclic 300

cyclic -l +异常地址

但是pwndbg只能读四字节的

[PWN][进阶篇]ROP-Ret2Shellcode-64位实例_全局变量_10

所以我们读6161616b

[PWN][进阶篇]ROP-Ret2Shellcode-64位实例_可执行_11

偏移量是40,起飞

step5 exp搞起

整体思路:

一个全局变量一个main函数一个局部变量

两个get

第一个get把他覆盖到输入,栈的返回值覆盖到全局变量的入口处,第二个get输入我们的shellcode

注意选用全局变量存放shellcode,就要考虑是否有权限

[PWN][进阶篇]ROP-Ret2Shellcode-64位实例_全局变量_12[PWN][进阶篇]ROP-Ret2Shellcode-64位实例_pwn_13

exp理解:

程序是64位的,os是linux的,所以我们要告诉电脑

offset是40,我们上面cyclic求的

shellcode是自动生成的

grep可以找到buf2,这里我们用其他的方式来找ELF()+symbols[]

一个get的payload使我们指向buf2

第二个get利用shellcode来getshell

因为程序有交互,p.recvuntil(’: '),的意思就是直到程序输出的内容含有:+空格再继续向下发送信息

希望大家可以有所收获!!!