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

Два вопроса.

Chococream

Старожил форума
Легенда
Регистрация
31.10.2009
Сообщения
347
Реакции
42
Всем привет!

Вообщем два вопроса возникло(запарился):

1)Имеется ASCII значение скажем в буффере.
Я его пихаю в htons(buffer); в следствие чего значение не правильно считывается, как потом из отладчика понял, что требуется hex значение.
Стал курить wsprintf - не помогло. Нашёл где-то алгоритм конвертации из дек в хекс - не помогло(точнее: не доработал сам алгоритм для моей ситуации).

Код:
.data
table db "0123456789ABCDEF", 0
buffer db '1234', 0

.code
 invoke GetProcessHeap
 invoke HeapAlloc,eax,0,ebx;?
 mov edx,eax
 xor ecx,ecx
cykl:
 lea eax,buffer
 mov al,[eax+ecx];?
 mov ah,al
 shr al,4
 and ah,0fh
 lea ebx,table
 xlatb
 xchg ah,al
 xlatb
 mov byte ptr [edx+ecx*2],ah
 mov byte ptr [edx+ecx*2+1],al
 inc ecx
 cmp ecx,sizeof buffer
 jne cykl;edx = result.
Если же просто по дефолту сунуть число htons(1234);(в отладчике 4D2) - работает норм.

2)Мб кто подкинет примеров по backconnect(за*бался изобретать велосипед).
Реализовал cmd backconnect, сейчас ломаю голову над сокс5 бэкконнект(гуглил долго в поисках сырцов).
Как я понял: пишем приложение, которое открывает два порта на компе(один - клиентский, другой - для удалённого приложения), дальше устанавливается коннект удалённого приложения со вторым портом и слушается первый порт(клиентский).
Увидеть бы сорцы в качестве примера.
 
Имеется ASCII значение скажем в буффере. Я его пихаю в htons(buffer); в следствие чего значение не правильно считывается, как потом из отладчика понял, что требуется hex значение.
Ничего вы, батенька, не поняли... Вот открыли бы MSDN и сразу бы всё стало ясно:

Код:
u_short WSAAPI htons(
  __in  u_short hostshort
);

Как видете, входной параметр представляет из себя 16-ти битное беззнаковое. Таким образом у вас htons выгребает байт + ещё какой-то мусор. Разберитесь с тем, что вы передаёте в функцию. А насчёт системы счисления - в данном случае пох в каком виде идёт представление числа в исходнике, хоть в восьмеричном... Система счисления - это абстракция для вас, как для программиста, комп оперирует нулями и единицами.

Мб кто подкинет примеров по backconnect...
Поищи исходники Blacksun Rat от Hellknights Crew (привет пацаны!), посмотри классику бекконнекта - netcat (http://netcat.sourceforge.net/download.php).

Как я понял: пишем приложение, которое открывает два порта на компе...
Всё верно. Есть две части - клиентская и серверная. Серверная часть при возможности подключается к клиенту через какой-то открытый в фаере порт, поддерживает соединение и ждёт команды. Клиентская часть реализует точку доступа к ресурсу, через которую другие приложения могут работать с сервером. Серверная часть обрабатывает данные полученные от клиента, делает необходимые запросы и отдаёт результат клиенту.
 
смотри вот реальное применение
Код:
sockaddr_in dest_addr;
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(80);
/*
dest_addr.sin_addr.s_addr = inet_addr(host);
или 
((unsigned long *)&dest_addr.sin_addr)[0] = ((unsigned long **)hst->h_addr_list)[0][0];
*/
нужна вся эта абстракция чтоб потом использовать 
для функи 
connect(my_sock, (sockaddr *)&dest_addr, sizeof(dest_addr)))
что тебе вообще нужно ?
с wsprintf ты можешь переводить из DWORD в строковые
например
Код:
char buff[256]; 
wsprintf(buff,"%d",123456);  грубо говоря конвертируешь из DWORD в строку

вот функи тебе litoa и latoi
Код:
int latoi (char *str)
{
	int ret = 0;

	while (*str)
	{
  ret = (ret * 10) + ((*str) - '0');
  str++;
	}
	return (ret);
}

void litoa(int nSrc, char *szSrcStr,int nSizeBuffer,int nRadix) 
{
	char *szTemp,*szInernBuff,*szSrc;
	int nChr = 0,nDelta,nFirstDigit = 0,i;

	int nFirstInt;
	nFirstInt = nSrc;

	if (nSizeBuffer == 0 || szSrcStr == NULL || (nSrc<0 &&  nSizeBuffer < 2))
  return;

	if (nRadix != 16 && nRadix != 10)
  return;

	if (nRadix == 16 && nSizeBuffer < 3 || (nRadix == 16 && nSizeBuffer < 4 && nSrc<0))
  return;

	szInernBuff = (char*)LocalAlloc(LMEM_FIXED,nSizeBuffer);
	if (szInernBuff == NULL)
  return;

	szTemp = szInernBuff;
	szSrc = szSrcStr;

	if (nSrc < 0)
	{
  szTemp[nChr++] = '-';
  nFirstDigit =nChr;
  nSrc = - nSrc;
	}

	if (nRadix == 16)
	{
  szTemp[nChr++]  = '0';
  szTemp[nChr++]  = 'x';
  nFirstDigit = nChr;
	}

	do
	{
  nDelta = (nSrc % nRadix);

  if (nDelta > 9)
  	szTemp[nChr++] = nDelta - 10 + 'a';
  else
  	szTemp[nChr++] = '0' + nDelta;

  nSrc = nSrc / nRadix;
	}
	while (nSrc != 0 && nChr < nSizeBuffer - 1);


	szTemp[nChr] = '\0';    

	if (nFirstDigit > 0)
	{
  for (i = 0;i < nFirstDigit;i++)
  	szSrc[i] = szTemp[i];

  szSrc += nFirstDigit;
	}

	do
	{
  nChr--;
  *szSrc++ = szTemp[nChr];
	}
	while (nChr > nFirstDigit);

	LocalFree(szInernBuff);

	*szSrc = '\0';
}
компиль их С/С++ компилером и выдирай асм код олькой

p.s. говорил же тебе еще давно - ставь себе студию харе ассемблерным дрочевом заниматься :D
 
groundhog
В отладчике(если передаю значение из буффера - кстати пробовал тремя разными способами, ни один не пашет):
Код:
PUSH game.0040404F                    ; /NetShort = 40404F;должно быть 4D2
CALL <JMP.&ws2_32.ntohs>            ; \ntohs

Теперь если в функцию вписать 1234:
Код:
PUSH 4D2                                ; /NetShort = 4D2;Это 1234
CALL <JMP.&ws2_32.ntohs>      ; \ntohs

Каким образом я пишу в функцию:
Код:
.data
buffer db "1234", 0;equ значением не писануть, в моём случае по-любому ascii
                          ;должен быть.

.code
invoke func, addr buffer

func proc port3: dword
local saddr: sockaddr_in

push port3
call htons
mov [saddr.sin_port],ax
;...
func proc
karabas-barabas
У меня сейчас нет времени переходить на C++, тем более это займёт времени.

p.s. говорил же тебе еще давно - ставь себе студию харе ассемблерным дрочевом заниматься
Давно уже стоит студия, ты же не думаешь, что я всё на асме делаю :)

Попробую сейчас выдеру из сишного кода.
#define PORT 1234
//...
sockaddrin.sin_port = htons(PORT);
//в отладчике уже 4D2, смысла смотреть нету)

п.с2:вроде траблу решил

Код:
.data
buffer db "1234", 0

.code
invoke func, addr buffer

func proc port3: dword
local saddr: sockaddr_in

invoke  atodw, addr buffer;atodw - рулит.
invoke  htons, eax
mov [saddr.sin_port],ax
;...
func proc

Это для тех, кто в будущем с этим возиться будет:
Код:
;ВХОД: EBP+8
;ВЫХОД: eax
func proc
PUSH EBP
MOV EBP,ESP
PUSH ESI
PUSH EDI
XOR EAX,EAX
MOV ESI,DWORD PTR [EBP+8];сюда пихайте своё значение.
XOR ECX,ECX
XOR EDX,EDX
MOV AL,BYTE PTR [ESI]
INC ESI
CMP AL,2
JNZ check

MOV AL,BYTE PTR [ESI]
NOT EDX
INC ESI
JMP check

checker:
SUB AL,30
LEA ECX,DWORD PTR [ECX+ECX*4]
LEA ECX,DWORD PTR [EAX+ECX*2]
MOV AL,BYTE PTR [ESI]
INC ESI

check:
OR AL,AL
JNZ checker

LEA EAX,DWORD PTR [ECX+EDX]
XOR EAX,EDX
POP EDI
POP ESI
RET
func endp

п.с: может ещё по backconnect примеры есть ?
 


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