SaiKe夏令营记(更)

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
  1. patch可以在漏洞处jmp再jmp回来,在无关的地方可以把代码替代为补丁,如异常处理之类。关于patch的一些需要注意的地方:
    原则:
    1. 不影响正常功能
    2. 不使用通用防御
    patch流程:
    1. 梳理正常程序功能,推测check程序检查点
    2. 确定补丁逻辑
    3. 编译生成机器码
    4. 插入机器码
  2. 关于re500。明显现在不在我的能力范围之内。大量的jmp时,用到了pintools来提取代码,然后自己实现程序。
  3. 《Windows环境下32位汇编语言程序设计》,认真值得看,第17章尤为重要。
  4. 《汇编语言》相关指令集及《操作系统》需踏踏实实打好基础。

累,也干货满满。

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,请使用&#039;-&#039;或者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>          设定规避字符集,比如: &#039;\x00\xff&#039;
    -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支持的输出格式列表

详解参考文章,使用简介
使用example

shellcode

弹框效果:

效果

cve-2010-3333栈溢出

原理也是栈溢出,但是windows里存在SEH保护和js保护,实验是复现漏洞并且

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值