This example doesn't use C at all, and it should be able to print anything. Including binary data
format PE console 4.0
include 'WIN32AX.INC'
entry main
CR EQU 0x0D
LF EQU 0x0A
section '.data' data readable writeable
hSock dd ?
hStdout dd ?
wsaData WSADATA
saddr sockaddr_in
sizeof.saddr = $ - saddr
saddrlen dd sizeof.sockaddr_in
szIP db "128.30.52.37", 0
send_http_request db "GET / HTTP/1.1",CR,LF,"Host: www.w3.org",CR,LF,"Connection: close",CR,LF,CR,LF
sizeof.send_http_request = $ - send_http_request
cbuf rb 1024
section '.text' code readable executable
proc main
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov [hStdout], eax
invoke WSAStartup, 0202h, wsaData
invoke socket, AF_INET, SOCK_STREAM, 0
mov [hSock], eax
mov [saddr.sin_family], AF_INET
invoke inet_addr, szIP
mov [saddr.sin_addr], eax
invoke htons, 80
mov [saddr.sin_port], ax
invoke connect, [hSock], saddr, sizeof.sockaddr_in
invoke send, [hSock], send_http_request, sizeof.send_http_request, 0
recv_loop:
invoke recv, [hSock], cbuf, 1024, 0
cmp eax, 0
jle end_recv_loop
invoke WriteConsoleA, [hStdout], cbuf, eax, 0, 0
jmp recv_loop
end_recv_loop:
invoke closesocket, [hSock]
invoke CloseHandle, [hStdout]
invoke WSACleanup
invoke ExitProcess, 0
endp
section '.idata' import data readable
library kernel32,'kernel32.dll',\
ws2_32,'ws2_32.dll',\
msvcrt,'msvcrt.dll'
include 'API\KERNEL32.INC'
import ws2_32, WSAStartup, 'WSAStartup',\
WSACleanup, 'WSACleanup',\
socket, 'socket',\
htons, 'htons',\
recv, 'recv',\
closesocket, 'closesocket',\
inet_addr,'inet_addr',\
connect,'connect',\
send,'send'
section '.reloc' fixups data discardable