xman夏令营学习简记

day1

讲了ctf的历史以及其发展,然后按流程走讲了一下网络安全法
基本没学什么,主要是熟悉华为的环境,面基,破冰


day2 逆向教学:

1.符号执行
接触了angr的用法,简单的自动逆向方法,只适用于简单的加密过程,可小学一波用于日后做题取巧
https://github.com/a7vinx/angr-doc-zh_CN
https://www.anquanke.com/post/id/85039
http://www.freebuf.com/sectool/143056.html
https://www.cnblogs.com/fancystar/p/7851736.html

2.动态解密:第一次见识到有需要解密源二进制的操作,就是代码经过顺序执行后导致后面的某些关键代码被破坏,需要通过解密来恢复原来的二进制结构,从而能正确的分析程序的意图

3.IDA-Python :同样也是第一次见识到IDA中还能操作py脚本,大概是通过py脚本,获得、修改二进制文件中的地址,函数等,通过骚操作,可以实现直接执行动态解密,直接在ida内运行py,输出我们所需要的东西
https://www.hex-rays.com/products/ida/support/idapython_docs/
http://drops.xmd5.com/static/drops/tips-11849.html
https://cartermgj.github.io/2017/10/10/ida-python/

4.无法反编译的情况:
今天见识到的有两种情况:
①是因为有动态加密,导致的后面的代码不完整,因此报错无法反编译
②是一种比较比较玄学的情况,根据其报错,找到相应的位置,对一些栈操作的指令(如pop,mov等)进行修改,快捷键alt+k,修改为IDA所提示的值,即可修复成功进而反编译


5.做题前的信息收集:
遇到几千个函数的二进制文件,有可能能在网上搜索到原码,github,google
binwalk、string、file、有可能一个二进制里面藏了另一个二进制,需要注意混合了misc的情况


day3

upx脱壳,dd命令方法
隐藏代码,
xtea加密
在IDA中修改调用约定,解决某些函数反编译失败的情况
通过一大堆的格式化字符串变相得表达一个c语言程序
也就是用一堆的格式化字符串表达底层汇编的mov指令等,组合成一个汇编语言

pwn题 漏洞挖掘:
缓存区溢出:堆、栈溢出,bss溢出,data溢出
wellpwn、ALICTF 2016

整数溢出:
无符号和有符号的转换,整数加减乘除,
malloc(size2)可以通过巧妙构造size导致size2为0

格式化字符串:
MMACTF 2016 greeting
HCTF2016 fheap

UAF:
double-free
defcon 2014 qualifier shitsco

逻辑漏洞:
访问控制,协议漏洞,多线程竞争条件等

漏洞挖掘中的逆向技巧
理清楚:数据结构,接口,类,
进行程序控制流的分析,数据流分析
对目标文件小的文件进行全面的逆向分析
对目标文件大的文件的关键点进行重点分析,比如用户交互的地方
在IDA中学会标注结构体和把反编译代码标注成最简洁的样子

day4 安卓逆向学习:

安卓系统大致分四层结构
linux kernel层
硬件抽象层
….

安卓利用分配UID来区分应用程序

常用工具与环境:
santoku
基于linux的Android取证、逆向、开发平台

Android studio
Android 应用开发
apk分析、性能分析

jeb
Android逆向工具
支持无原码调试
提供ARM、MIPS、intelx86、x64反编译支持

fadx 开源的dex文件反编译工具

smali、baksmail、apktool

apk
本质上是一个压缩包
常见的文件:
manifest.xml
META-INF目录
classes.dex:java代码编译后生成的可执行文件
res目录
assests目录
lib目录:存放c、c++代码编译后的so文件

反编译
dex文件:
Android可执行文件,java代码编译而来的,包含dalvik指令集

dex文件的结构:


header
string_ida
type_ids
….

classes

data


smali代码:由字节码反汇编得到的可阅读代码
每个smali文件代表一个类(普通类、抽象类)
开头
.field字段
.method方法定义

JNI
java和Native沟通的桥梁
JNI的注册
JNI_OnLoad:在加载so的文件的时候被执行

安卓提供的动态加载方法
DexClassLoader:apk、jar、dex,可以在SD卡加载

动态调试:
Android debug bridge

JDWP(java调试线协议)

动态调试的条件:
Android:debuggable=”true”
android os
ro.debuggable=1
boot.img->default.prop
模拟器 或者 userdebug编译
mprop、BDOpner(Xposed模块)

无源码动态调试(Java层)
smalidea
IDA Pro
JEB
Native代码调试
IDA Pro

方法跟踪:
method tracing
DDMS
CPU Profile
可以记录函数调用、CPU耗时信息
原理:instrumentation listeners

脱壳技术
dex文件加载
类加载
方法执行

针对内存加密壳的脱壳技术
暴力内存搜索
关键函数断点
DexHunter
APPSpear

dex加载流程

生成dex时

关键函数脱壳点

反混淆:
simplify
动态执行去初花指令

名称混淆
根据类型信息重命名
Demo 360 renameByType


day5 pwn之栈溢出教学

IDA–options–general—勾上line prefixes(graph)
可以在流程图中显示出地址,方便操作复制地址

https://github.com/Escapingbug/ancypwn
大佬自己写的集成了各种工具的docker,orz

gef操作:

下断点: b 【函数名】、b *【地址】
显示所有的断点: info b
hb 软件断点
d 删除断点

r 完整地重头启动

在等待输入的时候按下ctrl +c可以在当前位置断点

c 继续执行
s 单步执行(进入函数)

n 单步执行,跳过函数内部

gdb-python:
查询常见命令:gdb cheatsheet

GDB可以有符号,编译的时候记得带-g参数可以让编译带一个debug信息

libc source

context(os=””,arch=”i386”,log_level=”debug”)

cyclic pattern(cyclic(), cyclic_find() )
查看字符串的溢出

fmtstr_payload()

%m$x (m是一个十进制整数,表示第几个参数)
以16进制读出第m个参数

printf_chk 可以防御,加强了%m$x和%n(直接禁止使用)
但是无法防御读取

canary最后一个字节一般是0,用来截断
操作系统负责生成canary,放在一个不可读的寄存器上面

ret2dlresolve
适用情况:没有libc地址,需要调用外部函数,控制了已知地址内容

elf文件源代码:
https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/elf.h
glibc源代码:
https://code.woboq.org/userspace/glibc/libio/libioP.h.html#_IO_jump_t

将libc源码加载如gdb中进行调试:
先将libc源码下到本地
$ git clone git://sourceware.org/git/glibc.git
$ cd glibc
$ git checkout –track -b local_glibc-2.23 origin/release/2.23/master

然后调试的时候 用dir命令:dir 后加你glibce文件的地址


day6 pwn之堆教学;

fast bi attack
关键点是控制fd指针
单链表只有一个fd指针

UAF:
Double free:fast bin dup
检查:size检查
溢出改写:GOT、top_chunk、hook

unsorted bin attack
控制bk指针
通常改写global_max_fast
最终达到效果:addr=mian_arena+0x58

small bin attack
伪造fake chunk 让fake chunk的fd指向victim
改写victim的bk为fake chunk
就可以把fake chunk放入对应的small bin
下次malloc 就可以分配到fake chunk的地方

large bin attack
出现在从unsorted bin 放入 large bin的过程中

改got表一般用atoi和free
free_hook改为system
malloc_hook改为onegadget
利用malloc_Printerer实现one_gadget

利用misalignment伪造size
利用fast bin attack 在main arena 写size
利用fast bin attack 改写top chunk ptr


DAY7 PWN 之 IO FILE

HITCON CTF 2016
pwnable,tw seethefile
WCTF 2017

fread()
fwrite()
fopen()

网上教程:
https://xz.aliyun.com/t/1767
https://www.slideshare.net/AngelBoy1/play-with-file-structure-yet-another-binary-exploit-technique
https://www.cnblogs.com/elvirangel/p/7843842.html
https://www.anquanke.com/post/id/87194
https://www.jianshu.com/p/2e00afb01606

额外学习一波python沙箱逃逸:
https://www.anquanke.com/post/id/85571
https://xz.aliyun.com/t/52#toc-10

小记一波提权 操作:https://xz.aliyun.com/t/2512


DAY 8 WINDOWS PWN

工具:
winDBG
x64 DBG
Mona

PE文件结构:
header
import address table
export address table
section tabel
…..

基础dll:
NTDLL.DLL
KERNEL32.DLL
USER32.DLL
MSVCTXXX.DLL

SEH结构:
Prev
hander

seh:
https://www.52pojie.cn/thread-630505-1-1.html
https://blackperl-security.gitlab.io/categories/windows-pwn/

win syscall table
https://j00ru.vexillium.org/syscalls/nt/32/

win shell
system(“/bin/sh”)
system(“cmd.exe”)—>msvcrxxx.dll
CreateProcessW–》kenal
ntdll

Awesome Windows Exploitation
https://github.com/enddo/awesome-windows-exploitation

今天顺带的完成了一道pwn题,知识点是有关canary的:
日后有时间一定要系统地总结一波,现在先贴一些做题的时候找到的资料吧
https://0x48.pw/2017/03/14/0x2d/
https://hardenedlinux.github.io/2016/11/27/canary.html
https://veritas501.space/2017/04/28/%E8%AE%BAcanary%E7%9A%84%E5%87%A0%E7%A7%8D%E7%8E%A9%E6%B3%95/
http://html.rhhz.net/buptjournal/html/2017s127.htm


DAY 9——— 漏洞挖掘

0x01数据流分析

https://firmianay.gitbooks.io/ctf-all-in-one/content/doc/5.4_dataflow_analysis.html

0x02 符号执行

0x03 Angr
https://stfpeak.github.io/2017/11/08/use_angr_for_ctf/

0x04 Pin

https://blog.csdn.net/qq_33438733/article/details/81108186

0x05 Fuzzing

基本原理:
一般用于输入非预期的的数据监控输出异常
用于模糊测试来发现故障

https://github.com/shellphish/fuzzer

0x06 etc

ipython写脚本自动化挖洞

https://github.com/ChrisTheCoolHut/Zeratool

0x07 lazy IDA

https://github.com/L4ys/LazyIDA

DAY10 打个人排位赛

被自己菜哭,最后排名75,main那题没做出来有点伤,如果做出来了就能排进前30了,可惜没如果。然而比赛结束后就搞出来了orz。。。唉还是自己太菜了


DAY11 交流与总结的一天

主要是大佬们上去给我们讲讲他们做题的思路
然后就是讲讲赏金猎人开始了,要准备挖洞了,然而我一点都没有接触过这玩意,很慌orz
然后讲了一下接下来的行程安排,说明天放假一天,然而菜鸡如我是不可能放假的,还得好好总结一下这十天来的所学

有关FRC漏洞的一些网址:
https://www.cnblogs.com/SecurityKid/p/7751802.html
http://www.freebuf.com/articles/web/111139.html
http://blkstone.github.io/2017/05/28/finding-src-vuls/
https://wizardforcel.gitbooks.io/ctf-field-guide/content/7.html


DAY 12

休息日,无事,学习总结


DAY 13 安卓应用常见漏洞挖掘

文件存储

  • 内部存储
  • 外部存储
  • 外置存储
  • 私有/共有存储

应用的私有目录:
/data/data/appname/

  • database :数据库
  • cache 缓存数据
  • files 自己控制 的文件

应用沙箱:

  • 在安装阶段,Android自动给每个应用分配UID,关联GID
  • 应用执行的时候以该UID运行
    • 每个应用只有他可以进行读写的专用数据目录
  • root用户的UID为0
    • 系统服务的UID从1000开始,system用户的UID为1000,应用程序从10000–19999
  • 同签名应用程序可以用使用同一个UID安装,从而共享文件

权限:

  • 安装的时候申请的,之后不能改变,除非动态申请
  • 应用通过在AndroidManifest.xml文件内添加标签来申请权限
  • 通过来添加

权限保护级别:

  • Normal级别
  • Dangerous级别
  • Signature级别
  • signatureOrSystem权限

四大组件:

  • Activity:
    • 在AndroidManifest.xml中声明
  • Service
    • 与Activity相似,一直在后台运行,没有用户界面
  • Content Provider
    • 不同app之间交换数据的标准API
  • Broadcast
    • 跨进程的消息收发机制

讲了很多工具的使用,懒得提及了,都是暂时用不到的,没有安卓的底子,根本看不懂挖洞的操作。。。

我还是老老实实自己偷偷学pwn吧


DAY 14

参观华为各个地方,华为各种介绍吹水招聘的内容

无事


DAY 15 无线电安全

来自360的讲师讲了一下无线电

介绍了很多发射接收的硬件
演示了很多骚操作,追踪飞机,逆向遥控信号,见识了很多
攻击闸站,太秀了

软件:universal rasio

硬件:电视棒,HACKRF,BladeRF,

GPS劫持demo:GPS导航欺骗手机,欺骗汽车,无人机

伪造基站

操作太多太秀了,而且搞不好很容易就进去了。。。。还是老老实实搞pwn吧

硬件底层的hacking操作:
不存在的,就是讲了一下午低配版的电子电路。。。。。

然后讲了一波的无线测向,也就是高配版的定向越野、、、、


DAY16

硬件安全

破解自动贩卖机,柜子锁,汽车车门,各种终端机
伪造GPS,劫持流量,伪基站
无线部分内容跟昨天的差不多

接着后面介绍了一些生物特征的,如指纹,虹膜等加密过程,以及绕过验证

都是讲座型天秀课程,听听就完事了

安卓nativelib、kernel、fuzz、调试和利用

今天下午是来自腾讯玄武实验室讲师进行饶舌

安卓nativeleib和kernel的简介和攻击面

  • 安卓底层的安全架构简介
  • 安卓完整系统原码

常见的fuzz技术

  • AFL
  • Syzkailer

漏洞的调试和利用

  • bluebome
  • dirtycow

安卓常见fuzz方法和搭建
AFL

  • 暴力 fuzzer
    syzkaller

DAY 17 无线网络的攻与防

启动和配置网卡:
iwconfig
arimon-ng start 【wlan0】
airmon-ng check kill 关掉影响网卡的进程

kali下暴力破解wifi


DAY 18、19 转移阵地

去东莞松山湖

这两天是咸鱼的两天,学的东西比较少,也趁机颓废放松了一波
过几天就打结营赛了,还是线下赛的形式,真让人害怕。。。。