由于最近忙的多西很多,导致2019西湖论剑CTF忘记报名了,只能用队友的账号上去做了一下,赛题体验良好,题目还是很中规中矩的,虽然依旧是被吊锤(脸红)。
比赛是从上午九点打到晚上九点,时间可以说是很短了,这边由于做pwn调试的时候花费了大量的时间和精力,导致最后没有耐心去看其它题目了(菜!!!),贴一下做出来的题目。
2019国赛 线上赛 PWN&RE
2019西湖论剑CTF 二
AFL-Fuzz技术初探
0x01 AFL-Fuzz介绍
模糊测试(Fuzzing)技术作为漏洞挖掘最有效的手段之一,近年来一直是众多安全研究员发现漏洞的首选技术。AFL-Fuzz、LibFuzzer、honggFuzz等操作简单友好的工具相继出现,大大降低了漏洞挖掘的门槛。AFL(American Fuzzy Lop)是由安全研究员Michał Zalewski(@lcamtuf)开发的一款基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率,从而调整输入样本以提高覆盖率,增加发现漏洞的概率。AFL-Fuzz通过在相关代码处进行插桩,来对程序内部的执行路径进行探索,挖掘可能存在的漏洞如栈溢出、堆溢出、UAF、DOUBLEFREE等等,由于要对程序进行插桩,所以AFL-Fuzz主要用于对开源软件进行测试,当然配合QEMU等工具也可以对闭源代码进行Fuzzing,不过执行效率会受影响。
组成:
- 编译器wrapper,该部分用于编译目标代码(afl-gcc、afl-clang等)
- Fuzzer:afl-fuzz,fuzzing的主要工具
- afl-cmin、afl-tmin等
Pwnable.tw-orw
0x01 IDA分析
拿到程序不多bb,首先DIE看一波文件类型,发现是gcc编译的32位的文件,没加壳。直接拖进IDA,发现前面有个seccomp函数,并不知道做了什么操作,先不管,继续往下看,发现有个直接往bss上写shellcode,然后执行shellcode的操作。
0x02 SECCOMP
EXP写完后跑了一下发下并没有弹shell,奇怪,进去跟了一下,发现int 80调用execve执行/bin/sh后一条指令报错,怀疑是shellcode的原因,更换了几个shellcode发现仍然不行,这时猜测是SECCOMP的原因,查了一下发现这是个类似黑白名单的东西,把一些危险函数过滤掉,在pwn题中此工具做沙箱保护很常见,通常禁用一部分syscall,比如execve等,这样就没法直接弹shell了。
angr初探 一
IdaPython使用小结
LLVM初探
0x01 LLVM简介
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
LLVM是模块化、可重用的编译器以及工具链的集合,有些人把LLVM当成是一个低层的虚拟机(low level virtual machine),但官方给出的解释是这样的:
The name “LLVM” itself is not an acronym; it is the full name of the project.
也就是说LLVM并不是一个缩写,而是整个项目的全名。
LLVM和传统的编译器(GCC)是有差别的
传统的编译器架构
代码保护技术 一
0x00 代码虚拟化简介
代码虚拟化通过对原生的native指令集代码进行自定义字节码替换,在执行的时候由虚拟机中的解释器来执行,由于是用户自定义的字节码,基于本地native指令集的反汇编器无法进行识别,所以虚拟机保护下的代码相对来说更能延缓攻击者的分析与破解。目前虚拟机技术常用于代码虚拟化、加密壳、沙盒、解释器如JVM等等。
0x01 代码代码虚拟化的混淆
代码虚拟化也可以算作是混淆的一种,能够有效延缓攻击者的分析时间,但是由于解释器是基于native指令,所以通过动态调试可以得到native指令和字节码之间的映射关系,所以说到底代码虚拟化的混淆并不是无解的,常见的代码虚拟化保护有两种,一种是通过给壳进行虚拟化,让程序的解密过程变得复杂,从而让攻击者分析起来有难度,但是这种保护方式对动态调试来说效果不大,因为程序脱下解密壳以后能被dump下来,程序的逻辑也就一清二楚了;第二种是将程序的源代码转化为字节码通过解释器解释,这种保护无论静态还是动态都是有效的。
0x02 如何实现
虚拟机主要有三个部分,字节码、CPU、解析器。
1、首先需要实现一套字节码
程序员自我修养读书笔记
引子
从入CTF这个大坑以来,读过不少书,要说印象最深刻,非程序员的自我修养这本书莫属。为何非钟情此书,因为这本书真正带我突破瓶颈,步入底层的世界。刚入手的时候发现内容晦涩难以下咽,越往后看越难以理解,但是不得不承认这本书有着神奇的吸引力,让当时的我一次次放下,又一次次拿起,磕磕绊绊之下,对程序的运行原理也算是有个一个大概。下面打算根据自己的理解大概讲讲程序从编写到装载执行的过程
0x01 预处理
源代码编写完交给编译器进行编译时,编译器首先会进行预处理操作,源代码和相关的头文件会被整合到一起,构成一个后缀为.i的文件,其中主要内容有:
- 删除所有#define并展开所有宏定义
- 处理include指令,所有被包含的文件将会被插入该指令所在位置
- 删除所有注释
- 增加行号信息