0%

由于最近忙的多西很多,导致2019西湖论剑CTF忘记报名了,只能用队友的账号上去做了一下,赛题体验良好,题目还是很中规中矩的,虽然依旧是被吊锤(脸红)。
比赛是从上午九点打到晚上九点,时间可以说是很短了,这边由于做pwn调试的时候花费了大量的时间和精力,导致最后没有耐心去看其它题目了(菜!!!),贴一下做出来的题目。

阅读全文 »

简介

2019年国赛线上赛刚刚结束,就我个人来看,这次国赛的题目还算是比较友好的,至少PWN是如此,这边贴一下做出来的题目的思路。

RE1 easyGo

拿到题目扔DIE查一波有没有加壳&编译信息,发现未显示,根据题目提示发现是GO语言写的,扔ida看一波发现符号表被裁

image

找不到main函数无法下手,shift+f12也是没有找到与控制流相关的字符串,头疼,网上搜索了一下往年的go题,发现需要恢复符号,github上找到ida插件idaGolangHelper,选择golang版本号进行恢复 。

阅读全文 »

0x01 RE1-EasyCpp

这题是一道C++逆向,恕我无能,C++符号长到在下看到就想吐,只能用angr跑一跑这样子。。。这题先放着,以后再填坑,orz。。。

0x02 RE2-testRe

拿到题目扔进Ida,shift+f12通过关键字符串找到主要逻辑

阅读全文 »

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等
    阅读全文 »

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了。

阅读全文 »

0x01 angr简介

angr是一个基于python的二进制代码分析工具,能够通过符号执行自动完成对二进制文件的分析。早期的符号执行是静态的,依靠分析程序代码来进行工作,之后引入了动态符号执行,通过模拟指令来运行程序,找出控制流。
符号执行:

阅读全文 »

0x01 介绍

IdaPython是ida内置的一个强大工具,可以自动化处理繁琐的逆向工程任务。之前一直觉得IdaPython太过小众,一直没有去学习相关的操作,最近才有时间了解了个大概,这边做一个小小的总结。

IdaPython和IDC同样都是利用Ida的api进行自动化操作的工具,其中IdaPython基于Python,而IDC是基于C的。

IdaPython在2004年被开发出来,其目的是为了将Python简洁的语法和Ida支持的IDC语言结合起来。

IdaPython由三个独立的模块组成:

阅读全文 »

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)是有差别的

传统的编译器架构

image

阅读全文 »

0x00 代码虚拟化简介

代码虚拟化通过对原生的native指令集代码进行自定义字节码替换,在执行的时候由虚拟机中的解释器来执行,由于是用户自定义的字节码,基于本地native指令集的反汇编器无法进行识别,所以虚拟机保护下的代码相对来说更能延缓攻击者的分析与破解。目前虚拟机技术常用于代码虚拟化、加密壳、沙盒、解释器如JVM等等。

0x01 代码代码虚拟化的混淆

代码虚拟化也可以算作是混淆的一种,能够有效延缓攻击者的分析时间,但是由于解释器是基于native指令,所以通过动态调试可以得到native指令和字节码之间的映射关系,所以说到底代码虚拟化的混淆并不是无解的,常见的代码虚拟化保护有两种,一种是通过给壳进行虚拟化,让程序的解密过程变得复杂,从而让攻击者分析起来有难度,但是这种保护方式对动态调试来说效果不大,因为程序脱下解密壳以后能被dump下来,程序的逻辑也就一清二楚了;第二种是将程序的源代码转化为字节码通过解释器解释,这种保护无论静态还是动态都是有效的。

0x02 如何实现

虚拟机主要有三个部分,字节码、CPU、解析器。
1、首先需要实现一套字节码

阅读全文 »

引子

从入CTF这个大坑以来,读过不少书,要说印象最深刻,非程序员的自我修养这本书莫属。为何非钟情此书,因为这本书真正带我突破瓶颈,步入底层的世界。刚入手的时候发现内容晦涩难以下咽,越往后看越难以理解,但是不得不承认这本书有着神奇的吸引力,让当时的我一次次放下,又一次次拿起,磕磕绊绊之下,对程序的运行原理也算是有个一个大概。下面打算根据自己的理解大概讲讲程序从编写到装载执行的过程

0x01 预处理

源代码编写完交给编译器进行编译时,编译器首先会进行预处理操作,源代码和相关的头文件会被整合到一起,构成一个后缀为.i的文件,其中主要内容有:

  • 删除所有#define并展开所有宏定义
  • 处理include指令,所有被包含的文件将会被插入该指令所在位置
  • 删除所有注释
  • 增加行号信息
    阅读全文 »