(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权限

Linux (x86) Exploit 开发系列教程之二(整数溢出)的更多相关文章

  1. Linux (x86) Exploit 开发系列教程之六(绕过ASLR - 第一部分)

    转:https://bbs.pediy.com/thread-217390.htm 前提条件: 经典的基于堆栈的缓冲区溢出 虚拟机安装:Ubuntu 12.04(x86) 在以前的帖子中,我们看到了攻 ...

  2. Linux (x86) Exploit 开发系列教程之七 绕过 ASLR -- 第二部分

    (1)原理: 使用爆破技巧,来绕过共享库地址随机化.爆破:攻击者选择特定的 Libc 基址,并持续攻击程序直到成功.这个技巧是用于绕过 ASLR 的最简单的技巧. (2)漏洞代码 //vuln.c # ...

  3. Linux (x86) Exploit 开发系列教程之三(Off-By-One 漏洞 (基于栈))

    off by one(栈)? 将源字符串复制到目标缓冲区可能会导致off by one 1.源字符串长度等于目标缓冲区长度. 当源字符串长度等于目标缓冲区长度时,单个NULL字节将被复制到目标缓冲区上 ...

  4. Linux (x86) Exploit 开发系列教程之一(典型的基于堆栈的缓冲区溢出)

    (1)漏洞代码 //vuln.c #include <stdio.h> #include <string.h> int main(int argc, char* argv[]) ...

  5. Linux (x86) Exploit 开发系列教程之四(使用return-to-libc绕过NX bit)

    (1)原理: “NX Bit”的漏洞缓解:使某些内存区域不可执行,并使可执行区域不可写.示例:使数据,堆栈和堆段不可执行,而代码段不可写. 在NX bit打开的情况下,基于堆栈的缓冲区溢出的经典方法将 ...

  6. 微信程序开发系列教程(二)使用JavaScript给微信用户发送消息

    我之前的文章 微信程序开发系列教程(一)开发环境搭建 介绍了微信开发环境的搭建,这篇文章我们就来一步步开发一些具体的功能. 功能需求:当有微信用户关注了您的公众号之后,您用JavaScript发送一个 ...

  7. 高德地图 JavaScript API 开发系列教程(二)

    上节简单介绍高德地图JavaScript API及网页中基本地图展示.有了地图后我们可以用来做什么?有人说离我最近的超市在哪里,我怎么去?别急,这些功能我们后面都会慢慢实现.今天为大家详细讲解如何在地 ...

  8. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  9. EcShop二次开发系列教程–总纲

    EcShop作为老牌的B2C独立网店系统,功能非常全名,强大的文件.数据库缓存机制,保证前后台系统执行速度更快.系统平稳运行.但是过多的功能也或多或少的会影响到系统的整个效率,所有在使用EcShop搭 ...

随机推荐

  1. 小程序web-view的使用,跳转到外部链接~

    先说一下需求,要点击榜单,跳到我们的移动web的项目的榜单页,这个不是小程序的哦,就是网页版的. 榜单的html代码: <view class="nav" hover-cla ...

  2. DES算法实现

    概述(团队项目) DES是一个分组加密算法,它以64位为分组对数据加密.同时DES也是一个对称算法:加密和解密用的是同一个算法.DES是一个包含16个阶段的"替换–置换"的分组加密 ...

  3. ES6展开运算符数组合并,函数传参

    定义: .展开运算符允许一个表达式在某处展开. 使用场景 1.展开函数在多个参数的地方使用 .意指用于函数传参 2.多个元素的地方使用,意指用于数组字面量 3.多个边框的地方使用,意指用于解构赋值 函 ...

  4. LEFT JOIN 关键字语法

    SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. LEFT JOIN 关键 ...

  5. Greenwich.SR2版本的Spring Cloud Feign实例

    前面我们了解了Spring Cloud Ribbon和Hystrix,在使用上它们基本上会成队出现,那么是不是可以把它们组合起来使用?而且我们发现,在服务消费方a-beautiful-client里通 ...

  6. shell脚本安装python、pip--交互式的

    首先把pip-.tgz 安装包放在 /usr/local 下面,按照顺序先安装pip,再安装python.不要先安装或只安装python,否则很容易出错, [root@bogon ~]# cat pi ...

  7. 关于新小米盒子的Recovery模式如何进入

    26日下的盒子订单,经过几经波折,终于在昨天来到了我的面前,新东西到手,难免少不了一些折腾:升级系统,安装软件等.一顿折腾之后,想完全恢复到出厂设置,给盒子清一下,想进入盒子的Recovery模式,按 ...

  8. iOS算法题

    1兔子算法题 兔子可以跳一步2步或者3步,问跳到100有多少种跳法? // 兔子可以跳一步2步或者3步 // 问跳到100有几种跳法 /* 分析1 两个变量,X*2+Y*3=100. X最大为50,X ...

  9. EasyNetQ使用(十)【用EasyNetQ.Hosepipe重新提交错误信息】

    EasyNetQ.Hosepipe是EasyNetQ队列管理工具.用来取回队列中的消息并重新发布这些消息.还可以用它来检测错误队列,并重试发布消息. 用法 EasyNetQ.Hosepipe.exe ...

  10. 【web 安全测试Tools】BurpSuite 1.7.32及注册机【无后门版】

    BurpSuite 1.7.32 原版+注册机 下载 链接:https://pan.baidu.com/s/1LFpXn2ulTLlcYZHG5jEjyw 密码:mie3 注意无后门版文件完整性: b ...