CTFshow-pwn入门-前置基础pwn13-pwn19

news2024/9/26 1:25:20

pwn13

在这里插入图片描述
题目说编译运行这个flag.c文件即可获得flag。那我们先把flag.c文件下载下来,然后托到虚拟机里使用gcc编译一下,运行看看是否能够拿到flag。

gcc -o flag -flag.c
./flag

在这里插入图片描述
ok,果然拿到了flag。flag为:ctfshow{hOw_t0_us3_GCC?}。

pwn14

在这里插入图片描述
本题是让我们阅读flag.c文件的源码,给定key为"CTFshow",编译运行之后即可获得flag。其中呢,给定key为CTFshow是个啥子意思我们现在不是很清楚。那我们就先下载flag.c文件查看一下源码吧!

flag.c文件源码:

// flag.c
#include <stdio.h>
#include <stdlib.h>

#define BUFFER_SIZE 1024

int main() {
    FILE *fp;
    unsigned char buffer[BUFFER_SIZE];
    size_t n;
    fp = fopen("key", "rb");
    if (fp == NULL) {
        perror("Nothing here!");
        return -1;
    }
    char output[BUFFER_SIZE * 9 + 12]; 
    int offset = 0;
    offset += sprintf(output + offset, "ctfshow{");
    while ((n = fread(buffer, sizeof(unsigned char), BUFFER_SIZE, fp)) > 0) {
        for (size_t i = 0; i < n; i++) {
            for (int j = 7; j >= 0; j--) {
                offset += sprintf(output + offset, "%d", (buffer[i] >> j) & 1);
            }
            if (i != n - 1) {
                offset += sprintf(output + offset, "_");
            }
        }
        if (!feof(fp)) {
            offset += sprintf(output + offset, " ");
        }
    }
    offset += sprintf(output + offset, "}");
    printf("%s\n", output);
    fclose(fp);
    return 0;
}

代码的大致逻辑就是读取一个名为"key"的文件,然后根据该文件的内容通过一个while循环再嵌套两个for循环,具体的代码就不分析了,之后就可以输出flag了。

大家注意这个key文件是从我们本地读取的,所以我们在运行之前需要先手动创建一个key文件,根据题目的提示,key文件的内容应该为CTFshow。这样我们再编译运行flag.c文件就可以获得flag了。

echo CTFshow > key # 创建内容为CTFshow的key文件
gcc -o flag ./flag.c # 编译flag.c
./flag #运行flag文件那flag

在这里插入图片描述

pwn15

在这里插入图片描述
本题目是让我们将flag.asm汇编代码编译成可执行文件再运行即可拿到flag。那我们就下载flag.asm文件编译运行呗。

nasm -f elf64 flag.asm # 将flag.asm编译成64为.o文件
ld -s -o flag flag.o # 将flag.o链接成flag可执行文件
./flag # 运行flag可执行文件拿到flag

在这里插入图片描述

pwn16

在这里插入图片描述
本题是让我们使用gcc将flag.s文件编译成可执行文件。那我们就下载flag.s文件将其编译成可执行文件。

gcc -o flag flag.s # 将flag.s编译成flag可执行文件
./flag # 运行flag可执行文件拿到flag

在这里插入图片描述

pwn17

在这里插入图片描述
我们先将这个pwn文件拖进虚拟机,给它加上个可执行的权限。然后再使用checksec命令查看该文件的信息。

chmod +x pwn
checksec ./pwn

在这里插入图片描述
可以看到,pwn文件是一个64为的可执行文件,那我们直接拖进ida64反编译下看一看里边有什么东西。
反编译出的代码:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [rsp+4h] [rbp-1Ch] BYREF
  char dest[4]; // [rsp+Ah] [rbp-16h] BYREF
  char buf[10]; // [rsp+Eh] [rbp-12h] BYREF
  unsigned __int64 v7; // [rsp+18h] [rbp-8h]

  v7 = __readfsqword(0x28u);
  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  puts(asc_D48);
  puts(asc_DC0);
  puts(asc_E40);
  puts(asc_ED0);
  puts(asc_F60);
  puts(asc_FE8);
  puts(asc_1080);
  puts("    * *************************************                           ");
  puts(aClassifyCtfsho);
  puts("    * Type  : Linux_Security_Mechanisms                               ");
  puts("    * Site  : https://ctf.show/                                       ");
  puts("    * Hint  : You should understand the basic command usage of Linux! ");
  puts("    * *************************************                           ");
  *(_DWORD *)dest = 790655852;
  v4 = 0;
  puts("\nHow much do you know about Linux commands? \n");
  while ( 1 )
  {
    menu();
    v4 = 0;
    puts("\nEnter the command you want choose:(1.2.3.4 or 5)\n");
    __isoc99_scanf("%d", &v4);
    switch ( v4 )
    {
      case 1:
        system("id");
        break;
      case 2:
        puts("Which directory?('/','./' or the directiry you want?)");
        read(0, buf, 0xAuLL);
        strcat(dest, buf);
        system(dest);
        puts("Execution succeeded!");
        break;
      case 3:
        sleep(1u);
        puts("$cat /ctfshow_flag");
        sleep(1u);
        puts("ctfshow{");
        sleep(2u);
        puts("... ...");
        sleep(3u);
        puts("Your flag is ...");
        sleep(5u);
        puts("ctfshow{flag is not here!}");
        sleep(0x14u);
        puts("wtf?You haven't left yet?\nOk~ give you flag:\nflag is loading......");
        sleep(0x1BF52u);
        system("cat /ctfshow_flag");
        break;
      case 4:
        sleep(2u);
        puts("su: Authentication failure");
        break;
      case 5:
        puts("See you!");
        exit(-1);
      default:
        puts("command not found!");
        break;
    }
  }
}

我们先来分析一下代码的逻辑,首先是进入一个while循环打印出menu也就是菜单。然后是一个switch-case语句,根据我们输入的选项来执行分支语句。
我们分析源码看到case 3中有一个system(“cat /ctfshow_flag”)的语句,也就是可以读取flag的语句。但是!!!
我们来看!!!
在这里插入图片描述
这条sleep(0x1BF52u)语句是我们读取flag的障碍!因为这条语句它要睡眠0x1BF52秒啊,换算成10进制就是114514秒,那就是31个小时啊!!!这怎么等的了!
所以另求他法。
我们再看case 2:

case 2:
        puts("Which directory?('/','./' or the directiry you want?)");
        read(0, buf, 0xAuLL);
        strcat(dest, buf);
        system(dest);
        puts("Execution succeeded!");
        break;

如果我们选择的case2,首先它是输出一行字符串,然后让我们输入一行长度为0xA的字符串buf,也就是长度为9的字符串。接着把我们输入的字符串buf赋给dest,然后使用system函数将dest作为参数传入进行命令执行。

选项2的功能总的来说就是,将我们输入的字符串当作参数传入system()函数!那我们就可以直接传入cat /ctfshow_flag吗?

那当然不行的,因为代码已经限制了我们输入字符串的长度为9,所以我们得换个命令想办法读取flag。我们知道system(“/bin/sh”);是可以获得Linux的交互式shell的,正好/bin/sh的长度也没有超过9,所以我们就可以传入/bin/sh来获取交互式shell,进而手动执行cat /ctfshow_flag来get flag了!

nc 连接,开干!!!
在这里插入图片描述
输入2 ->输入/bin/sh->执行cat /ctfshow_flag
在这里插入图片描述
OK,成功拿到flag!

pwn18

在这里插入图片描述
首先我们还是下载pwn文件拖进虚拟机加上可执行权限再使用checksec命令查看文件信息。

chmod +x pwn
checksec pwn

在这里插入图片描述
64位的文件,并且题目也提示我们要看源码,那我们就将pwn这个文件拉到ida64反编译下看看源码是什么。

源码:

// main
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [rsp+4h] [rbp-Ch] BYREF
  unsigned __int64 v5; // [rsp+8h] [rbp-8h]

  v5 = __readfsqword(0x28u);
  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  puts(s);
  puts(asc_B10);
  puts(asc_B90);
  puts(asc_C20);
  puts(asc_CB0);
  puts(asc_D38);
  puts(asc_DD0);
  puts("    * *************************************                           ");
  puts(aClassifyCtfsho);
  puts("    * Type  : Linux_Security_Mechanisms                               ");
  puts("    * Site  : https://ctf.show/                                       ");
  puts("    * Hint  : Do you know redirect output ?                           ");
  puts("    * *************************************                           ");
  puts("Which is the real flag?");
  __isoc99_scanf("%d", &v4);
  if ( v4 == 9 )
    fake();
  else
    real();
  system("cat /ctfshow_flag");
  return 0;
}
// fake
int fake()
{
  return system("echo 'flag is here'>>/ctfshow_flag");
}
// real
int real()
{
  return system("echo 'flag is here'>/ctfshow_flag");
}

我们先来分析一下代码逻辑,大概流程就是需要我们输入一个值v4,看这个值v4是否等于9,如果等于9就执行fake()函数,然后再执行system函数打印出flag;如果不等于9就先执行real()函数,然后再执行system函数打印出flag。

查看源码我们可以发现啊,real()函数跟fake()函数里的内容一样,都会执行
echo ‘flag is here’>/ctfshow_flag 这条命令。这条命令的作用就是将"flag is here"这个字符串追加道/ctfshow_flag文件中,这就代表system函数最后输出flag的时候,屁股后面一定会有flag is here这条字符串,之后我们再把这条字符串从输出的flag删掉就是真正的flag了!

nc连接,开干!!!
在这里插入图片描述
OK,成功拿到flag!

pwn19

在这里插入图片描述
OK,我们还是先下载pwn文件托到虚拟机里加上可执行权限再使用checksec命令查看文件信息。

chmod +x pwn
checksec pwn

在这里插入图片描述
pwn文件依旧是64位的,直接拖进ida64看一下源码。

// main
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf[40]; // [rsp+10h] [rbp-30h] BYREF
  unsigned __int64 v5; // [rsp+38h] [rbp-8h]

  v5 = __readfsqword(0x28u);
  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  puts(s);
  puts(asc_BF0);
  puts(asc_C70);
  puts(asc_D00);
  puts(asc_D90);
  puts(asc_E18);
  puts(asc_EB0);
  puts("    * *************************************                           ");
  puts(aClassifyCtfsho);
  puts("    * Type  : Linux_Security_Mechanisms                               ");
  puts("    * Site  : https://ctf.show/                                       ");
  puts("    * Hint  : Turn off output, how to get flag? ");
  puts("    * *************************************                           ");
  if ( fork() )
  {
    wait(0LL);
    sleep(3u);
    printf("flag is not here!");
  }
  else
  {
    puts("give you a shell! now you need to get flag!");
    fclose(_bss_start);
    read(0, buf, 0x20uLL);
    system(buf);
  }
  return 0;
}
// fork
// attributes: thunk
__pid_t fork(void)
{
  return fork();
}

这道题目前还没有想出来办法解决,因为它把输出流给关掉了,也就是我们执行命令得不到回显了,而且ping命令也没有也不能用dns带外,nc命令也没有,也不能反弹到外网服务器!哎,。。。。我再想想办法~ _ ~

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

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

相关文章

前端小练-平台首页介绍+动画

文章目录 前言结构头部外部容器文字 主体小球动画打字机动画特效实现监控 完整代码总结 前言 时间飞逝&#xff0c;快大四了&#xff0c;刚好最近看不下去考研的&#xff0c;而且要准备这个毕设选题了&#xff0c;然后就想着怎么能够把自己所学的东西都用上&#xff0c;一开始…

Vue H5项目如何在PC端时布局居中展示,而不全屏拉伸

目录 1、场景再现&#xff1a;在PC端时 H5项目布局被拉伸2、代码实现3、最终效果图4、疑惑 1、场景再现&#xff1a;在PC端时 H5项目布局被拉伸 2、代码实现 在App.vue中的写入&#xff0c;vue2 的在mounted中写入&#xff0c;vue3的写在onMounted写入。 逻辑讲解&#xff1a…

Android 全局黑白化-模拟颜色空间

概述 平台&#xff1a; RK3568 Android 11在一些特殊的日子&#xff0c;如默哀日、灾难日&#xff0c;纪念日&#xff0c;哀悼日等&#xff0c;许多的APP、网页、海报等都开始使用黑白色主题。Android 的全局黑白实现方案&#xff0c;可以考虑使用模拟颜色空间的方法。 借助硬…

RabbitMQ高阶使用消息推送

目录 1 从打车开始说起1.1 需要解决的问题1.2 消息推送 2 消息推送2.1 什么是消息推送2.2 方案介绍2.2.1 ajax短轮询2.2.2 长轮询2.2.3 WebSocket 2.3 WS实现消息推送2.3.1 架构介绍2.3.2 暂存数据2.3.2.1 什么是MongoDB2.3.2.2 插入数据2.3.2.3 查询数据 2.4.1 轮询任务2.4.1.…

学生党暑假在家赚钱得方法,足不出户轻松赚取买鞋钱

很多学生党都想在暑假期间赚点零花钱&#xff0c;最好是能在家就赚钱。在家里赚零花钱有许多途径&#xff0c;今天我来和大家分享一些方法。 1、问答在各大平台上非常普遍。 我们可以在各大平台上找到各种各样的问答。 如今&#xff0c;问答平台越来越多&#xff0c;提供的奖…

平凯星辰重磅支持 2023 开放原子全球开源峰会,开源数据库分论坛成功召开

2023 年 6 月 11 日至 13 日&#xff0c;以“开源赋能&#xff0c;普惠未来”为主题的 2023 开放原子全球开源峰会开幕式暨高峰论坛在北京成功举办。企业级开源分布式数据库厂商平凯星辰联合创始人兼 CTO 黄东旭受邀出席峰会参与开源论道圆桌&#xff0c;担任开源数据库分论坛出…

吴恩达ChatGPT课爆火

点上方计算机视觉联盟获取更多干货 没想到时至今日&#xff0c;ChatGPT竟还会犯低级错误&#xff1f; 吴恩达大神最新开课就指出来了&#xff1a; ChatGPT不会反转单词&#xff01; 比如让它反转下lollipop这个词&#xff0c;输出是pilollol&#xff0c;完全混乱。 哦豁&#…

C++14中返回类型推导的使用

使用C14中的auto返回类型&#xff0c;编译器将尝试自动推导(deduce)返回类型: namespace {int xx 1; auto f() { return xx; } // return type is int const auto& f3() { return xx; } // return type is const int&auto multiply(int a, int b) { return (a * b); …

【阅读论文】时间序列数据清洗:一项调查

文章目录 摘要一、引言A.问题陈述B.问题挑战C. 组织 二、基于平滑的清洗算法A.移动平均B.自动注册C.卡尔曼滤波模型D.总结和讨论 三、基于约束的混合算法A. 顺序依赖 (OD)B.序列相关性C.速度约束D.总结和讨论 四、基于统计的CLEANING算法A.最大似然B.马尔可夫模型C.二项抽样D.时…

基于51单片机设计的井下瓦斯监控系统

一、项目介绍 井下瓦斯监控系统是煤矿安全生产中非常重要的一部分,防止井下瓦斯爆炸事故的发生,保障煤矿工人的人身安全。由于地下环境特殊,需要特殊的监测系统来实时监测瓦斯浓度等关键指标,并及时报警以便采取措施进行处理。 瓦斯气体,又称沼气,是一种轻质烃类气体,…

基于的滤波器设计

一,带通滤波器设计指标。 1&#xff0c;中心频率。中心频率:通常定义为带通滤波器&#xff08;或带阻滤波器&#xff09;频率的几何平均值&#xff0c;在对数坐标下&#xff0c;即为两个3dB点之间的中点&#xff0c;一般用两个3dB点的算术平均来表示。滤波器通频带中间的频率&…

网工大题题型总结(1)-------网络安全方面考察

&#xff08;1&#xff09;2018年上半年 试题二 &#xff08;3&#xff09;常见的无线网络安全隐患有 IP 地址欺骗、数据泄露、(8)、(9)、双络通信被窃听等; 为保护核心业务数据区域的安全&#xff0c;网络管理员在设备①处部署(10)实现核心业务区域边界 防护;在设备②处部署…

C++11特性之左值引用和右值引用

3.1二者的对比之内置类型 内置类型的无名对象&#xff08;右值&#xff09;为纯右值&#xff0c;其值本身不可改变 int main() {int a10;const int b20;int& raa;//ok,左值引用const int& rbb;//ok&#xff0c;常性左值引用const int& crv30;//ok,也叫万能引用&a…

网络安全竞赛——综合靶机渗透测试ZHCS-2全过程解析教程

任务一:综合靶机渗透测试 任务环境说明: 服务器场景:ZHCS-2(关闭连接)服务器场景操作系统:版本不详扫描目标靶机将靶机开放的所有端口,当作flag提交(例:21,22,23) FLAG:22,80 扫描目标靶机将靶机的http服务版本信息当作flag提交(例:apache 2.3.4) FLAG: ligh…

Vue3 Hooks函数使用及封装思想

目录 一. 什么是hooks函数&#xff1f; 二、如何封装一个hooks函数 三、Hooks 常用 Demo &#xff08;1&#xff09;验证码倒计时 &#xff08;2&#xff09;防抖 &#xff08;3&#xff09;节流 一. 什么是hooks函数&#xff1f; 专业解释&#xff1a;Vue 3中的Hooks函数…

Nucleo-F411RE (STM32F411)LL库体验 8 - PWM的使用

Nucleo-F411RE &#xff08;STM32F411&#xff09;LL库体验 8 - PWM的使用 1、简述 LD2连接PA5&#xff0c;而PA5可以映射TIM2_CH1&#xff0c;配合TIM2&#xff0c;可以输出PWM。 本片文章大量工作是添加了shell命令&#xff0c;可以通过pwm命令开关pwm以及设置pwm的频率&am…

数字图像处理期末考点整理(全)

计算&#xff1a;傅里叶变换&#xff0c;双线性插值&#xff0c;直方图均衡化&#xff0c;灰度共生矩阵&#xff0c;霍夫曼编码&#xff0c;区域增长/合并&#xff0c;中值滤波 简答&#xff1a;窗口/模板处理&#xff0c;BMP文件存储格式&#xff0c;滤波器和平滑算子的特点&…

Servlet (上篇)

哥几个来学 Servlet 啦 ~~ 目录 &#x1f332;一、什么是 Servlet &#x1f333;二、第一个 Servlet 程序 &#x1f347;1. 创建项目 &#x1f348;2. 引入依赖 &#x1f349;3. 创建目录 &#x1f34a;4. 编写代码 &#x1f34b;5. 打包程序 &#x1f96d;6. 部署程序…

client-go的Indexer三部曲之二:性能测试

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《client-go的Indexer》系列的第二篇&#xff0c;在前文咱们通过实例掌握了client-go的Indexer的基本功能&#xff0c;本篇咱们尝试对下面这…

css小兔鲜项目搭建

目录 精灵图 精灵图的使用步骤 背景图片大小 background连写 文字阴影 盒子阴影 过渡 骨架标签 SEO三大标签 版心的介绍 css书写顺序 项目结构搭建 精灵图 场景&#xff1a;项目中将多张小图片&#xff0c;合并成一张大图片&#xff0c;这张大图片称之为精灵图 优点…