SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Português/Portuguese > Lançamentos/Releases

Reply
 
Thread Tools Display Modes
Old 08/08/2012, 01:21 PM   #41
rjjj
Guest
 
Posts: n/a
Default Re: bspikes

Quote:
Originally Posted by ipsBruno View Post
Existe um exploit mesmo, envia um comando de vários caracteres e você congela o servidor. E não é só zcmd não, é com muitos outros sistemas de comandos.

A SA:MP limita a 128 caracteres, mas se você usa algum packet como Rak SAMP faz você facilmente manipula isto. ZCMD é um sistema de comandos obediente, não tem qualquer limitação sobre o que você coloca, tudo o que você colocar ele irá processar, indendente se der latência no servidor ou não

Isto congela seu servidor.
pawn Code:
#pragma dynamic 66849928

//
main() {
    new baby[ 16711425 ] ;
    for(new i ; i != 16711425 ; i++) {
        strcat ( baby,  "\1" ) ;
    }
//
    CallLocalFunction( "OnPlayerCommandText", "ds", 0, baby   );
}

Tá okay, exagerei usando 63 megabytes. Não necessariamente precisa disto, com 1 megabyte você já consegue congelar o servidor por alguns segundos e hoje em dia uma internet comum consegue fazer uploads de grandes 30 megabytes, o que seria suficiente para travar o servidor do coitado em segundos. Imagina, seu servidor fazendo loops enormes a cada segundo de packet enviado (fsockopen e send data você faz um script deste em menos de 30 linhas em php ainda)

_________

Resolução:

Não use strlen para isto, porque strlen processa toda a string inteira, será lento do mesmo jeito. Como "cmdtext" é alocado dinamicamente você tem o tamanho para usar nele

pawn Code:
forward isPacketCMD(cmd[]);
public isPacketCMD(cmd[]) {
    return !!cmd[128];
}

Então antes de qualquer processamento do zcmd faça:

pawn Code:
if(isPacketCMD(cmdtext)) {
   return Kick(playerid);
}

Acredito que deve funcionar, não testei. Se não funcionar faça

PHP Code:
static cmdtmp[130];
format(cmdtmp130cmd);
return !!
cmdtmp[128]; 
- Abração !!

Acha que a equipe SA-MP deixaria os jogadores manipularem desse jeito a quantidade de memória ocupada do servidor ?



Não mesmo. Esse é um dos primeiros cuidados que se aprende a ter ao estudar a linguagem C/C++, com a qual o núcleo do SA-MP foi construído .



O jogador pode colocar quantos caracteres quiser na caixa que aparece quando se tecla T. O cmdtext será limitado a 128 caracteres.



E esse limite não pode ser ultrapassado por um programa do computador do jogador, pois é uma informação do próprio servidor.



Logo, não há como zcmd chegar a processar mais que isso .



Por saberem disso, os desenvolvedores dessa include não precisaram declarar uma variável array para o cmdtext, o que poderia aumentar o tempo de execução dos comandos, tamanho do arquivo binário, etc.



Espero ter ajudado .
  Reply With Quote
Old 08/08/2012, 01:22 PM   #42
BlueX
High-roller
 
BlueX's Avatar
 
Join Date: Jul 2011
Location: Portugal
Posts: 1,952
Reputation: 279
Default Re: bspikes

Quote:
Originally Posted by ipsBruno View Post
Existe um exploit mesmo, envia um comando de vários caracteres e você congela o servidor. E não é só zcmd não, é com muitos outros sistemas de comandos.

A SA:MP limita a 128 caracteres, mas se você usa algum packet como Rak SAMP faz você facilmente manipula isto. ZCMD é um sistema de comandos obediente, não tem qualquer limitação sobre o que você coloca, tudo o que você colocar ele irá processar, indendente se der latência no servidor ou não

Isto congela seu servidor.
pawn Code:
#pragma dynamic 66849928

//
main() {
    new baby[ 16711425 ] ;
    for(new i ; i != 16711425 ; i++) {
        strcat ( baby,  "\1" ) ;
    }
//
    CallLocalFunction( "OnPlayerCommandText", "ds", 0, baby   );
}

Tá okay, exagerei usando 63 megabytes. Não necessariamente precisa disto, com 1 megabyte você já consegue congelar o servidor por alguns segundos e hoje em dia uma internet comum consegue fazer uploads de grandes 30 megabytes, o que seria suficiente para travar o servidor do coitado em segundos. Imagina, seu servidor fazendo loops enormes a cada segundo de packet enviado (fsockopen e send data você faz um script deste em menos de 30 linhas em php ainda)

_________

Resolução:

Não use strlen para isto, porque strlen processa toda a string inteira, será lento do mesmo jeito. Como "cmdtext" é alocado dinamicamente você tem o tamanho para usar nele

pawn Code:
forward isPacketCMD(cmd[]);
public isPacketCMD(cmd[]) {
    return !!cmd[128];
}

Então antes de qualquer processamento do zcmd faça:

pawn Code:
if(isPacketCMD(cmdtext)) {
   return Kick(playerid);
}

Acredito que deve funcionar, não testei. Se não funcionar faça

PHP Code:
static cmdtmp[130];
format(cmdtmp130cmd);
return !!
cmdtmp[128]; 
- Abração !!

Ah to ligado, eu também não tinha pensando nisso, pois não existe limite no comando, eu estarei fazendo isso no meu bcmd e vou atualizar com urgência, obrigado bruno!



Quote:
Originally Posted by rjjj View Post
Acha que a equipe SA-MP deixaria os jogadores manipularem desse jeito a quantidade de memória ocupada do servidor ?



Não mesmo. Esse é um dos primeiros cuidados que se aprende a ter ao estudar a linguagem C/C++, com a qual o núcleo do SA-MP foi construído .



O jogador pode colocar quantos caracteres quiser na caixa que aparece quando se tecla T. O cmdtext será limitado a 128 caracteres.



E esse limite não pode ser ultrapassado por um programa do computador do jogador, pois é uma informação do próprio servidor.



Logo, não há como zcmd chegar a processar mais que isso .



Por saberem disso, os desenvolvedores dessa include não precisaram declarar uma variável array para o cmdtext, o que poderia aumentar o tempo de execução dos comandos, tamanho do arquivo binário, etc.



Espero ter ajudado .
Voce já viu a include zcmd? Não sei se reparou, mas um #define que o zeex criou, chama-se #define MAX_FUNC_NAME (32)

Algo assim, isso significa que o comando podera ter um limite apenas de 32 caracteres.

Agora me diga.

se 32 caracteres é isto, coisa que eu acho que não existiria um comando com esse nome, lembrando que isto não é params, é só o nome do comando:

Code:
qwertyuiopqwertyuiopqwertyuiopqw
Voce acha que alguem ia criar um comando com 128 caracteres? Sem contar que existe uma abreviação, no caso do zcmd é cmd_nomedocomando

agora veja

Code:
cmd_qwertyuiopqwertyuiopqwertyuiopqw();
Acho, que mesmo que exista um limite deveríamos fazer testes, faça um teste com o nome da public para ver se crasha.

32:
Code:
qwertyuiopqwertyuiopqwertyuiopqw
128:
Code:
qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui
Apenas testando para verificar isso e lembrando que ainda teríamos que adicionar + 4 caracteres, ou seja

32 + 4 = 36 | 128 + 4 = 132

@Edit

Criei a public dentro do script e da este aviso

"warning: 200: symbol "qwertyuiopqwertyuiopqwertyuiopq" is truncated to 31 characters"

@Edit²

De facto fiz alguns testes, com e sem for e de facto não aconteceu nada ao servidor.

Estou esperando a vossa opinião.
__________________
Quote:
Originally Posted by Y_Less View Post
What do you enjoy? Make one you want to play or there's no point as you won't be interested in your own server.
A.K.A rebelox
BlueX is offline   Reply With Quote
Old 08/08/2012, 02:31 PM   #43
rjjj
Guest
 
Posts: n/a
Default Re: bspikes

Quote:
Originally Posted by BlueX View Post
Ah to ligado, eu também não tinha pensando nisso, pois não existe limite no comando, eu estarei fazendo isso no meu bcmd e vou atualizar com urgência, obrigado bruno!





Voce já viu a include zcmd? Não sei se reparou, mas um #define que o zeex criou, chama-se #define MAX_FUNC_NAME (32)

Algo assim, isso significa que o comando podera ter um limite apenas de 32 caracteres.

Agora me diga.

se 32 caracteres é isto, coisa que eu acho que não existiria um comando com esse nome, lembrando que isto não é params, é só o nome do comando:

Code:
qwertyuiopqwertyuiopqwertyuiopqw
Voce acha que alguem ia criar um comando com 128 caracteres? Sem contar que existe uma abreviação, no caso do zcmd é cmd_nomedocomando

agora veja

Code:
cmd_qwertyuiopqwertyuiopqwertyuiopqw();
Acho, que mesmo que exista um limite deveríamos fazer testes, faça um teste com o nome da public para ver se crasha.

32:
Code:
qwertyuiopqwertyuiopqwertyuiopqw
128:
Code:
qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui
Apenas testando para verificar isso e lembrando que ainda teríamos que adicionar + 4 caracteres, ou seja

32 + 4 = 36 | 128 + 4 = 132

@Edit

Criei a public dentro do script e da este aviso

"warning: 200: symbol "qwertyuiopqwertyuiopqwertyuiopq" is truncated to 31 characters"

@Edit²

De facto fiz alguns testes, com e sem for e de facto não aconteceu nada ao servidor.

Estou esperando a vossa opinião.

Parece que você não entendeu o assunto da discussão .



Sim, zcmd utiliza uma variável para o nome da função pública a ser executada como comando, mas não faz isso com o cmdtext.



Acontece que em algumas partes de seu código, a include opera diretamente com cmdtext, como esta :


Code:
if (zcmd_g_HasOPCS && !CallLocalFunction("OnPlayerCommandReceived", "is", playerid, cmdtext))
{
    return 1;
}


Drakon disse que o jogador pode fazer o cmdtext ter um tamanho superior a 128 caracteres a ponto de poder aumentar drasticamente a carga de processamento de zcmd.



O fato é que isso não é verdade .



Espero ter ajudado .
  Reply With Quote
Old 08/08/2012, 03:52 PM   #44
ipsBruno
Banned
 
Join Date: Apr 2010
Location: Brazil, Caxias RS
Posts: 6,159
Reputation: 483
Default Re: bspikes

- Gonçalo:
Estou falando dos parâmetros, não do nome do comando.

- rjj:
O packets "imitam" com o jogador faria, exceto pelo fato de serem "bots". Se SA:MP fosse tão segura assim não existiria nem hackings que fingem ser jogadores como bots de ping 65535. E acredite, isto é muito fácil fazer.

Ou vai querer negar o fato que SA:MP nunca teve problemas com isto?
ipsBruno is offline   Reply With Quote
Old 08/08/2012, 04:19 PM   #45
BlueX
High-roller
 
BlueX's Avatar
 
Join Date: Jul 2011
Location: Portugal
Posts: 1,952
Reputation: 279
Default Re: bspikes

Quote:
Originally Posted by ipsBruno View Post
- Gonçalo:
Estou falando dos parâmetros, não do nome do comando.
Já percebi e acho que você tem razão, um simples exemplo com o sscanf

pawn Code:
if(sscanf(params,"ds[128]",playerid,text))
Isto é um exemplo de um comando de /pm

Então seguindo a minha lógica é possível mandar um texto com +128 caracteres, o sa-mp não permite + de 128 caracteres em SendClientMessage, mas em printf e outras cosias permite, então o que o bruno quer dizer esta correcto, pois se quando usamos o sscanf e usamos vários parâmetros é possível ultrapassar os 128 caracteres, pois essa string será executada por uma callback e não pelo SendClientMessage, o facto que pode comprovar é o uso de MySQL, a callback que recebe o erro também tem o query e as vezes existem Querys com +128 caracteres, alias podem chegar a 2000 e isto vem comprovar que o bruno esta correto.
__________________
Quote:
Originally Posted by Y_Less View Post
What do you enjoy? Make one you want to play or there's no point as you won't be interested in your own server.
A.K.A rebelox
BlueX is offline   Reply With Quote
Old 09/08/2012, 06:55 AM   #46
davi54723
Gangsta
 
Join Date: Jul 2012
Posts: 798
Reputation: 10
Default Re: bspikes

Quais são os comandos? caso não haja comando, como coloco o tapete?
davi54723 is offline   Reply With Quote
Old 09/08/2012, 10:58 AM   #47
BlueX
High-roller
 
BlueX's Avatar
 
Join Date: Jul 2011
Location: Portugal
Posts: 1,952
Reputation: 279
Default Re: bspikes

Quote:
Originally Posted by davi54723 View Post
Quais são os comandos? caso não haja comando, como coloco o tapete?
Quote:
Originally Posted by BlueX View Post
[I][FONT="Trebuchet MS"]

Funções Principais
  • IsPlayerInSpike(playerid,bool:engine,bool:fire,max speed,dfiretime)
    • playerid
      • ID do jogador.
    • engine
      • desliga o motor, lembrando que é como quebrasse o motor do veiculo.
    • fire
      • cria fogo nas rodas, lembrando que o fogo só é colocado na roda direita ao lado do motor.
    • maxspeed
      • o máximo de velocidade necessária para criar o fogo e/ou desligar o motor
    • dfiretime
      • o tempo em milisegundos para destruir o objecto do fogo
  • CreateSpike(playerid,playername[])
    • playerid
      • ID do jogador
    • playername
      • Nome do jogador
  • TeleportToSpike(playerid,spikeid)
    • playerid
      • ID do jogador
    • spikeid
      • ID do tapete de pregos
  • DestroySpike(playerid)
    • playerid
      • ID do jogador

Exemplo de uso:

pawn Code:
public OnPlayerConnect(playerid)
{
    SetTimerEx("IsPlayerInSpike",500,true,"ddddd",playerid,fire,engine,velocidade,tempo);
    return 1;
}

//comando
bCMD[criar]-(playerid){
    new name[24];
    GetPlayerName(playerid,name,24);
    CreateSpike(playerid,name);
    SendClientMessage(playerid,-1,"Criando um tapete de pregos.");
    return 1;
}
bCMD[irtapete]-(playerid,params[]){
    if(IsPlayerAdmin(playerid)){
        if(isnull(params))
            return SendClientMessage(playerid,-1,"USE: /irtapete [id]");
        TeleportToSpike(playerid,strval(params));
    }
    return 1;
}

bCMD[destroi]-(playerid){
    return DestroySpike(playerid);
}
Comece a ler os tópicos, esta tudo explicado lá.
__________________
Quote:
Originally Posted by Y_Less View Post
What do you enjoy? Make one you want to play or there's no point as you won't be interested in your own server.
A.K.A rebelox
BlueX is offline   Reply With Quote
Old 15/08/2012, 07:56 PM   #48
Nigel
Banned
 
Join Date: Apr 2006
Posts: 31
Reputation: 1
Lightbulb Re: bspikes

BlueX acho que essa parte pode causar algum tipo de problema. vamos ao raciocínio:
pawn Code:
public OnPlayerConnect(playerid)
{
    SetTimerEx("IsPlayerInSpike",500,true,"ddddd",playerid,fire,engine,velocidade,tempo);
    return 1;
}
~ Player conecta e cria um timer, o mesmo resolve sair.
E outro(ou o mesmo acima) conecta ao servidor novamente.

Efeito:
O servidor criará outro timer, sendo que o criado anteriormente não foi destruído

Espero que me compreenda
Nigel is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off



All times are GMT. The time now is 09:17 PM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.