Day 0
参加的第一个夏令营吧,之前的腾讯的NextOne没到前六十,差了四名没机会去,这次参加了这个,为拓展视野。
西电的校园还是很大的,他们的网络安全学院楼看起来不错。上午听了听大牛们的讲座,讲的主要还是情怀。想说的还是西电的网络安全学院副院长的讲话。他们的企业和学校联合的模式是强力的推动剂,以及学院本身对学科的重视,对师资和人才的重视让我感触颇多。回想我们的学校,没有师资也不重视,表面工作一套一套,想让马儿跑还叫马儿不吃草,可能么。
晚上的小测试。汇编和二进制真是不会,明显看出来都是基础题,但。。。只能做做网络的,毕竟还是网络做的久一点。
下大雨,淋坏了,明天继续。
Day 1
惨痛的一天,更下博客平静一下。
先梳理一下上午的课,上午相对还能接受。先是汇编码与机器码的转换,主要是查表。
下午主要讲了base64的汇编代码和ZCTFre500的一道题目。
晚上收获到主要是两位博士的分享,分别是pintools的py封装,和自动漏洞扫描和利用程序angr。
以下是收获:
1. 一些工具。fasm(汇编编译器,可以把汇编代码编译成机器码)。010editor(16进制编辑器,查看hex码用,与winhex功能相似)。pintools(程序动态分析工具,可以动态插桩,动态加载分析代码)。angr(二进制漏洞自动化扫描与利用程序)。
2. base64程序的汇编代码
.DATA
base64_alphabet db "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",0
;**************************************************************************************************
;进行base64编码的函数
;参数:_lpszInput 指向输入缓冲区 _lpszOtput 指向输出缓冲区 _dwInputLen 想要加密的长度
;返回值:成功返回0 失败返回 -1
;作者:zklhp Email:zklhp@sina.com
;时间:2008.8.9
;版权所有 转载请保持完整
;**************************************************************************************************
.CODE
_base64 proc uses ebx esi edi _lpszInput:DWORD,_dwInputLen:DWORD,_lpszOtput:DWORD
;错误处理
.if (_lpszInput==NULL)||(_lpszOtput==NULL)||(_dwInputLen==0)
xor eax,eax
dec eax
ret
.endif
mov eax,_dwInputLen
xor edx,edx
mov ecx,3
div ecx ;div 无符号除法
push eax
.if eax > 0
dec eax
.if eax > 0
push eax
push ebp
mov esi,_lpszInput
mov edi,_lpszOtput
mov ebp,eax
lea edi,[edi+ebp*4] ;目标地址传输
neg ebp
align 4 ;对齐伪指令
;ALIGN Num
;其中:Num必须是2的幂,如:2、4、8和16等。
;指令的作用是:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被Num整除的地址开始分配。
@@: ;@@ 标号
mov ebx,DWORD ptr [esi] ; ptr应该就是pointer ,说明地址指针类型。当两个操作数类型均不明确时,必须用byte ptr(字节属性)或Word ptr(字属性)将一个存储器操作数定义为字节或字类型。DWORD双字节
bswap ebx ;交换字节,字节前后reverse
mov ecx,ebx
mov edx,ebx
mov eax,ebx
shr ecx,14;0 ;逻辑右移,对ecx右移14位
shr edx,8;1
shr eax,26
and ecx,3Fh ;取后6位
shr ebx,20
and edx,3Fh
and eax,3Fh
movzx ecx, BYTE PTR [base64_alphabet+ecx] ;是将源操作数的内容拷贝到目的操作数,并将该值用0扩展至16位或者32位。 将较小的值拷到较大的值中。
and ebx,3Fh
mov ch , BYTE PTR [base64_alphabet+edx]
movzx eax, BYTE PTR [base64_alphabet+eax]
shl ecx,16 ;逻辑左移。
mov ah,BYTE PTR [base64_alphabet+ebx]
add esi,3
or ecx,eax ;???
mov [edi+ebp*4],ecx
add ebp,1
jnz @B ;跳到上一个@@
pop ebp
pop eax ;eax想要加密的长度
mov ecx,eax
mov ebx,3
mul ebx ;mul乘 ecx*ebx放在ecx里
add _lpszInput,eax
shl ecx,2
add _lpszOtput,ecx
.endif
mov esi,_lpszInput
mov edi,_lpszOtput
mov ebx,DWORD ptr [esi]
bswap ebx
mov ecx,ebx
mov edx,ebx
mov eax,ebx
shr ecx,14
shr edx,8
shr eax,26
and ecx,3Fh
shr ebx,20
and edx,3Fh
and eax,3Fh
movzx ecx, BYTE PTR [base64_alphabet+ecx]
and ebx,3Fh
mov ch , BYTE PTR [base64_alphabet+edx]
movzx eax, BYTE PTR [base64_alphabet+eax]
shl ecx,16
mov ah,BYTE PTR [base64_alphabet+ebx]
or ecx,eax
mov [edi],ecx
add _lpszInput,3
add _lpszOtput,4
.endif
pop eax
mov ecx,3
mul ecx
neg eax
add eax,_dwInputLen
;int 3h
.if eax == 1
; 用来补充==
mov esi,_lpszInput
mov edi,_lpszOtput
movzx ecx,BYTE ptr [esi]
mov ebx,ecx
mov edx,ecx
shr ecx,2
movzx ecx,BYTE ptr [base64_alphabet+ecx]
shl edx,4
and edx,03fh
movzx edx,[base64_alphabet+edx]
shl edx,8
or ecx,edx
xor ebx,ebx
mov bl,'='
mov bh,'='
shl ebx,16
or ecx,ebx
mov [edi],ecx
.elseif eax == 2
push eax
mov esi,_lpszInput
mov edi,_lpszOtput
movzx ecx,BYTE ptr [esi]
shr ecx,2
movzx ecx,BYTE ptr [base64_alphabet+ecx]
movzx eax,BYTE ptr [esi+1]
shr eax,4
movzx ebx,BYTE ptr [esi]
shl ebx,4
or ebx,eax
and ebx,03fh
movzx ebx,BYTE ptr [base64_alphabet+ebx]
movzx eax,BYTE ptr [esi+1]
shl eax,2
and eax,03fh
movzx eax,BYTE ptr [base64_alphabet+eax]
xor edx,edx
mov dh,'='
shl edx,16
or ecx,edx
shl ebx,8
or ecx,ebx
shl eax,16
or ecx,eax
mov [edi],ecx
pop eax
.endif
xor eax,eax
ret
_base64 endp
- patch可以在漏洞处jmp再jmp回来,在无关的地方可以把代码替代为补丁,如异常处理之类。关于patch的一些需要注意的地方:
原则:
1. 不影响正常功能
2. 不使用通用防御
patch流程:
1. 梳理正常程序功能,推测check程序检查点
2. 确定补丁逻辑
3. 编译生成机器码
4. 插入机器码 - 关于re500。明显现在不在我的能力范围之内。大量的jmp时,用到了pintools来提取代码,然后自己实现程序。
- 《Windows环境下32位汇编语言程序设计》,认真值得看,第17章尤为重要。
- 《汇编语言》相关指令集及《操作系统》需踏踏实实打好基础。
累,也干货满满。
Day 2
重点基本都在PPT上,回去把PPT补上来。
给的虚拟机还可以,基本渗透流程都有了,回去分享一下。
Day 3
上课的大致内容:
1. 用msfvenom生成shellcode。
2. rtf文件,cve2010-3333漏洞分析与调试与利用。
3. 栈溢出基本知识。
4. 堆溢出基本知识(在有unlike保护机制下)。实例的调试。
5. C3的实验。
msfvenom生成shellcode实验
基本是最简单的,命令如下:
msfvenom -a x86 --platform windows -p windows/messagebox TITLE=Ree TEXT="you are attacked" -f c
参数解释:
-a 指定payload的目标架构
--plerform 平台
-p 指定需要的目标载荷
-f 指定输出格式
全部的参数详解:
-p, --payload <payload> 指定需要使用的payload(攻击荷载)。如果需要使用自定义的payload,请使用'-'或者stdin指定
-l, --list [module_type] 列出指定模块的所有可用资源. 模块类型包括: payloads, encoders, nops, all
-n, --nopsled <length> 为payload预先指定一个NOP滑动长度
-f, --format <format> 指定输出格式 (使用 --help-formats 来获取msf支持的输出格式列表)
-e, --encoder [encoder] 指定需要使用的encoder(编码器)
-a, --arch <architecture> 指定payload的目标架构
--platform <platform> 指定payload的目标平台
-s, --space <length> 设定有效攻击荷载的最大长度
-b, --bad-chars <list> 设定规避字符集,比如: '\x00\xff'
-i, --iterations <count> 指定payload的编码次数
-c, --add-code <path> 指定一个附加的win32 shellcode文件
-x, --template <path> 指定一个自定义的可执行文件作为模板
-k, --keep 保护模板程序的动作,注入的payload作为一个新的进程运行
--payload-options 列举payload的标准选项
-o, --out <path> 保存payload
-v, --var-name <name> 指定一个自定义的变量,以确定输出格式
--shellest 最小化生成payload
-h, --help 查看帮助选项
--help-formats 查看msf支持的输出格式列表
弹框效果:
cve-2010-3333栈溢出
原理也是栈溢出,但是windows里存在SEH保护和js保护,实验是复现漏洞并且