• XSS.stack #1 – первый литературный журнал от юзеров форума

Не могу получить весь дамп файла через сокеты

Tverskoy

floppy-диск
Пользователь
Регистрация
15.12.2010
Сообщения
2
Реакции
0
Вот кусок кода на MASM
Суть в том, чтобы получить в буфер весь HTML код страницы.
Размер буфера выделен с лихвой, но загрузка происходит всегда не полностью - размер выходного файла каждый раз разный и всегда кратен MTU. В чем может быть загвоздка?

Код:
.486
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\ws2_32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\ws2_32.lib

include        \masm32\include\masm32.inc
includelib     \masm32\lib\masm32.lib

.data

szHostName     db "www.wasm.ru",0



FileszHeaders      db "POST /index.php HTTP/1.1",13,10
        db "Host: www.wasm.ru",13,10
        db "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)",13,10
             db "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",13,10
        db "Accept-Language: en-us,en;q=0.7,de-de;q=0.3",13,10
        db "Accept-Charset: windows-1250,utf-8;q=0.7,*;q=0.7",13,10
        db "Keep-Alive: 115",13,10
        db "Connection: keep-alive",13,10
        db "Cookie:%s",13,10
             db "Content-Type: application/x-www-form-urlencoded",13,10
        db "Referer: http://www.wasm.ru/forum",13,10
        db "Content-Length: 16",13,10,13,10
             db "form_sent=1",0

outputFileName    db 'file.htm', 0


.data?

hFile         dd ?
writed        dd ?


url_file_string    db 512 dup (?)
f_startpos    dd ?
f_endpos    dd ?
f_lenstr    dd ?
startpos    dd ?
endpos        dd ?
lenstr        dd ?
podstroka3     db 255 dup (?)
Ans_Buff    db 100000 dup (?)
Ans_Buff2    db 100000 dup (?)
;Ans_Buff2    dd ? 
Req_Buff    db 1048 dup (?)
Req_Buff2    db 1048 dup (?)
cookies_str    db 7500 dup (?)
mHandle     dd ? 
sizetoread     dd ?
.code


;========================================================================
filelink_Get_con proc
    LOCAL WSAData          : WSADATA
    LOCAL saServer         : sockaddr_in
    LOCAL pSocket          : DWORD
    LOCAL dwLen            : DWORD

   ; Init WSA
    invoke  WSAStartup, 101h, addr WSAData
    test    eax, eax
    jnz     die

   ; Convert if IP
    invoke  inet_addr, addr szHostName
    cmp     eax, INADDR_NONE
    jne     ok

   ; Resolve if host
    invoke  gethostbyname, addr szHostName
    test    eax, eax
    jz      die

    mov     eax, [eax+0Ch]
    mov     eax, [eax]
    mov     eax, [eax]

    ok:
   ; Fill struct
    mov     saServer.sin_addr, eax
    invoke  htons, 80d
    mov     saServer.sin_port, ax
    mov     saServer.sin_family, AF_INET

   ; Создаем socket
    invoke  socket, AF_INET, SOCK_STREAM, 0
    test    eax, eax
    js      die
    mov     pSocket, eax

   ; Пробуем подсоедениться
    invoke  connect, pSocket, addr saServer, sizeof saServer
    test    eax, eax
    jnz     die

   ; Создаем запрос серверу
    invoke  wsprintf, addr Req_Buff2, addr FileszHeaders, addr cookies_str

   ; отправляем запрос
    invoke  send, pSocket, addr Req_Buff2, eax, 0
    test    eax, eax
    js      die
    jz      die

   ; получаем ответ


    invoke  recv, pSocket, addr Ans_Buff2, sizeof Ans_Buff2, 0

    test    eax, eax
    js      die
    jz      die
    push    eax
    invoke  closesocket, pSocket
    invoke  WSACleanup
ret
die:
invoke  WSACleanup
invoke  ExitProcess, 0
filelink_Get_con endp
;========================================================================


;========================================================================

Main proc

call filelink_Get_con

    invoke    CreateFile, addr outputFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
    mov    hFile,eax
    invoke    lstrlen, addr Ans_Buff2
    invoke    WriteFile, hFile, addr Ans_Buff2, eax, addr writed, 0
    invoke    CloseHandle, hFile

invoke  MessageBox,0, addr Ans_Buff2, 0, MB_OK

invoke  ExitProcess, 0
Main endp
end Main
 
Код:
BOOL sockread(SOCKET s, char* Buff, int buff_size_)
{
 int bytes;
 int buff_size = buff_size_; 
 while(buff_size > 0) 
    { bytes = recv(s, Buff, buff_size, 0);
       if((bytes == 0)||(bytes == SOCKET_ERROR)) return 0;
       buff_size -= bytes; 
       Buff += bytes;
    } 
return 1;
 }
вот С аналог, сделай для asm аналогично
 
А, все, врубился, я понял тихий и чрезжопный метод завершения если че не так, беспалева тухнем даже не говоря о наличии ошибки.
А еще я доглядел багес, из-за него то вся муть.
Довайте розбераццо.
А почему Вы, многоуважаемый Tverskoy , вдруг решили, что вы не все вычитываете из сокета? Да, буфер фиксированного размера, это плохо, но раз уж он заведомо большего размера, чем размер странички, то зачем переживать?
А фекалька в том, что вычитываете вы всё , только обламывает вам всю малину функция lstrlen. Она определяет длину строки, завершающейся нулем. А в коде страничек нулей могёт быть сколь угодно. Поэтому советую писать в файл столько байт, сколько вернула функция recv, и тогда все ОК. А вот на функцию MessageBox тоже полагаться не стоит, она тоже с нулями и разными спецсимволами дружить не обязана. Меняйте подход и все ОК. Если не получицца, пишите сюда. Будут бабки - высылайте. Салом и гвоздями тоже принимаем. С увожением, общество негритянских гастробайтеров(нигеродебуггеров).
P.S. Помниться у Оперы был баг, после нульбайта код не отображался, можно было после </body> дописать 0x00 и после этого кодес(нопремер ифрейм ненулевого размера), который браузером не отображался, но парсился и выполнялся.
 
Размер буфера выделен с лихвой, но загрузка происходит всегда не полностью - размер выходного файла каждый раз разный и всегда кратен MTU. В чем может быть загвоздка?
в твоем вопросе и ответ на него
 
The flags parameter can be used to influence the behavior of the function invocation beyond the options specified for the associated socket. The semantics of this function are determined by the socket options and the flags parameter. The possible value of flags parameter is constructed by using the bitwise OR operator with any of the following values.Value Meaning
MSG_PEEK Peeks at the incoming data. The data is copied into the buffer, but is not removed from the input queue. The function subsequently returns the amount of data that can be read in a single call to the recv (or recvfrom) function, which may not be the same as the total amount of data queued on the socket. The amount of data that can actually be read in a single call to the recv (or recvfrom) function is limited to the data size written in the send or sendto function call.
впринципе в мсдне все есть по этому поводу и пример кода

// Receive until the peer closes the connection
do {

iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if ( iResult > 0 )
printf("Bytes received: %d\n", iResult);
else if ( iResult == 0 )
printf("Connection closed\n");
else
printf("recv failed: %d\n", WSAGetLastError());

} while( iResult > 0 );
единственный момент , который там не расписан это последний параметр - 0, то есть юзается дефолтный флаг ,а дефолтный флаг как я понимаю MSG_PEEK
 
Жестоко конечно код написан, но что поделаешь...

Ты хотя бы хип выделял для временной работы
+
создай отдельную константу для рез-та фу-ции recv, чтобы её использовать потом для WriteFile(также не забудь убрать вызов lstrlen, как тебе уже подсказали).

If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.

Для того, чтобы считать всю страницу:
1)Используй либо вышеприведённый кодес.
2)Парсь заголовок, пришедший от сервера и судя по нему определяй размер получаемой страницы.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх