使用 protobuf & AFLplusplus 进行简易 CTF 自动化 fuzz

一、简介

fuzz 的结构感知 时遇到了 protobuf,觉得很有意思,于是尝试使用 protobuf 来进行快速简易的 CTF fuzz。

以下以 TCTF2021-babyheap2021 为例,来简单说明一下自动化步骤。

这里主要用到以下项目:

需要注意的是,该 fuzz 目前处于实验性版本,可能不太稳定,仅作为学习研究使用。

阅读更多...

Epoll 小叙

一、概述

  • epoll 是 Linux 内核为了处理大批量的文件描述符而改进的 poll,是 Linux 下多路复用IO接口select/poll的增强版本。epoll可以显著提高程序在大量并发连接中只有少量活跃的情况下的系统的CPU利用率。

  • 服务器要管理多个客户端的连接,而 recv 函数只能监视单个 socket,因此引入了 select/poll。

    但 select 能监测的文件描述符个数限制在 FD_SETSIZE,通常是1024个。这对于并发量达到上万的服务器来说显然不够。与之相对的是,epoll所支持的fd上限是最大可以打开的数目,具体数字可以cat /proc/sys/fs/file-max查看(本人机器上该值为9223372036854775807)。

  • 当存在部分活跃socket时,传统 select/poll 会线性扫描整个socket集合,这会让效率随着socket数量的增加而线性下降,而这就是限制了 select 最大监视数量的原因,程序被唤醒后不知道是哪个 socket 处于活跃状态,需要遍历。

    而 epoll 是基于每个 fd 上面的 callback 函数实现,因此只会对活跃的 socket 进行处理,效率更高。

  • select、poll、epoll之间的区别

    • select:只知道有I/O事件发生,但不知道是具体哪一个,因此只能无差别遍历所有流。时间复杂度$O(n)$,fd数量限制在 FD_SETSIZWE。
    • poll:大致同上,轮询所有套接字,时间复杂度为 $O(n)$,但fd没有数量限制,因为它使用链表存储fd。
    • epoll: 事件驱动,epoll会把哪个流发生了怎样的IO事件通知给用户。时间复杂度$O(1)$。
  • epoll提供了两种触发方式

    • 一种是传统 select/poll 的水平触发(Level Triggered, LT),缺省工作模式,同时还支持阻塞非阻塞的socket。当某个文件描述符准备就绪后,内核会持续通知用户,直到重新变为未就绪状态。
    • 再一种是边缘触发(Edge Triggered),高速工作模式,只支持非阻塞的socket。当某个文件描述符从未就绪变成就绪时,内核会通过epoll通知用户。注意,只通知一次。通知动作只会在文件描述符从未就绪变成就绪这个时刻触发。如果一个已经就绪的文件描述符迟迟不被处理,即一直位于就绪状态,那么该文件描述符就一直不会触发通知。
阅读更多...

WebServer v1.0 文档

概述

WebServer 1.0 简单实现了一个基础的 多并发网络服务程序 。在该版本中,主要实现了以下重要内容:

  • 线程互斥锁 & 条件变量的封装
  • 线程池的设计,以支持并发
  • 基础网络连接的实现
  • http 协议的简略支持
    • 支持部分常用 HTTP 报文
      • 200 OK
      • 400 Bad Request
      • 500 Internal Server Error
      • 501 Not Implemented
      • 505 HTTP Version Not Supported
    • 支持 HTTP GET 请求
    • 支持 HTTP/1.1 持续连接 特性

1.0 版本的项目代码位于 Kiprey/WebServer CommitID: 4095cc - github

最新版本的项目代码位于 Kiprey/WebServer - github

阅读更多...
  • Copyrights © 2020-2022 Kiprey
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~