We moved to a new home.
http://hackingbits.github.io/
See you there.
sexta-feira, 23 de outubro de 2015
segunda-feira, 18 de maio de 2015
How to find out the current (in use) XServer DISPLAY number!
Well, just the hack of the day.
$ ps u | awk -v tty=$(cat /sys/class/tty/tty0/active) '$0 ~ tty { print $2 }' | while read pid && [[ "$display" == "" ]]; do display="$(awk -v RS='\0' -F= '$1=="DISPLAY" { print $2 }' /proc/$pid/environ)"; if [ "$display" != "" ]; then echo "$display"; fi; done 2>/dev/null
:0
Can you improve it? So tell me how. o/
The discussion about the theme on Quora and Linkedin.
Edited with improvement:
http://www.commandlinefu.com/commands/view/14259/find-out-the-active-xorg-server-display-number-from-outside
$ for p in $(pgrep -t $(cat /sys/class/tty/tty0/active)); do d=$(awk -v RS='0' -F= '$1=="DISPLAY" { print $2 }' /proc/$p/environ 2>/dev/null); [[ -n $d ]] && break; done; echo $d
The discussion about the theme on Quora and Linkedin.
__________________________
Edited with improvement:
http://www.commandlinefu.com/commands/view/14259/find-out-the-active-xorg-server-display-number-from-outside
$ for p in $(pgrep -t $(cat /sys/class/tty/tty0/active)); do d=$(awk -v RS='0' -F= '$1=="DISPLAY" { print $2 }' /proc/$p/environ 2>/dev/null); [[ -n $d ]] && break; done; echo $d
quinta-feira, 18 de setembro de 2014
A book to study C, or NOT!
As promised I'm back to talk about the Programming in C (4th Edition) book. Well, I'll paste my amazon's review, to be short.
"When I started this reading soon I became absorbed by the formation of the writer's words. Unfortunately that feeling did not persist throughout the work. I still read until functions chapter, but the book is not renewed in style. There's much prolonged talk for bit subjects... For me a boring approach. The author uses many almost useless, in day-to-day, mathematical examples. A beginner will give up of C language or seek another book that is more aimed.
I still prefer the Expert C Programming: Deep C Secrets by Peter van der Linden that invites you to understand language with real facts about C, and The C Programming Language by the creators of the Language that despite being old and summarized, informs the reader about the language accurately."
It's yours choice.
Cheers.
terça-feira, 26 de agosto de 2014
A book to study C
I received my copy of Programming in C (4th Edition) (Developer's Library) from Pearson today.
The book is dense with 548 pages and, at first glance, a great resource for beginners and advanced C coders. I'll let you know more about my reading. Just wait.
The book is dense with 548 pages and, at first glance, a great resource for beginners and advanced C coders. I'll let you know more about my reading. Just wait.
sexta-feira, 15 de agosto de 2014
Odd ways to zeroing some x86_64 registers
Hi there! Here are some ways (retrocompatible instructions [1-2] and xmm) to fill registers with zero (NULL) bytes without have any zero bytes in bytecode.
400093: 58 pop %rax
400094: ff c8 dec %eax
Zeroing (1) %RAX at 5 bytes cost (very known indeed).
40008b: 97 xchg %eax,%edi
40008c: 48 c1 c8 20 ror $0x20,%rax
400090: 97 xchg %eax,%edi
Zeroing (1) %RDI at 6 bytes cost.
40008b: 92 xchg %eax,%edx
40008c: 48 99 cqto
Zeroing (1) %RDX at 3 bytes cost.
40008b: 92 xchg %eax,%edx
40008c: 48 99 cqto
40008e: 52 push %rdx
40008f: 58 pop %rax
Zeroing (2) %RDX e %RAX at 5 bytes cost.
40008b: 48 31 ff xor %rdi,%rdi
40008e: 48 f7 e7 mul %rdi
Zeroing (3) %RAX, %RDX e %RDI at 6 bytes cost (however, widely known).
40008b: 97 xchg %eax,%edi
40008c: 48 c1 c8 20 ror $0x20,%rax
400090: f7 e7 mul %edi
400092: 50 push %rax
400093: 5f pop %rdi
Zeroing (3) %RAX, %RDX e %RDI at 9 bytes cost.
400090: c5 fc 77 vzeroall
400093: 66 48 0f 7e c2 movq %xmm0,%rdx
Zeroing (1) general-purpose reg %RDX and (all) YMM at 8 bytes cost.
400090: 66 0f df c0 pandn %xmm0,%xmm0
400094: 66 48 0f 7e c2 movq %xmm0,%rdx
Zeroing (1) general-purpose reg %RDX and (1) %XMM0 at 9 bytes cost.
400090: 50 push %rax
400091: 5a pop %rdx
400092: 48 f7 d2 not %rdx
400095: 48 21 d0 and %rdx,%rax
Zeroing (1) %RAX at 8 bytes cost.
400097: 52 push %rdx
400098: 58 pop %rax
400099: f7 d0 not %eax
40009b: 21 c2 and %eax,%edx
Zeroing (1) %RDX at 6 bytes cost.
Use them at will.
[1] - How NOP nearly became a non-NOP on AMD64
[2] - x86oddities
sexta-feira, 25 de julho de 2014
Você Fiscal!!! Eleições...
Temos a oportunidade de sermos fiscais de verdade nas próximas eleições. Para isso, o mínimo que podemos fazer, neste momento, é contribuir com o Projeto Você Fiscal (Diego Aranha) e divulgá-lo o máximo possível.
Eu, no momento, não acredito na discussão política atual; antes, ao meu ver, teríamos que discutir o homem em si, para só depois adentrarmos na sua política. Contudo, a iniciativa do Diego Aranha é fantástica, pois nos permite acompanhar de perto esse processo até então obscuro.
Compartilhem!!!
segunda-feira, 26 de maio de 2014
Uzumaki.el - a simple Emacs buffers cycler
I always complained about the buffer switching procedures in Emacs. So I decided to create my own method to do that, and it rocks (to me ;D ).
Check it: https://github.com/geyslan/uzumaki/
And it's also available through MELPA archive: http://melpa.milkbox.net/#/uzumaki
If you do like it, or don't, feel free to do pull requests on git.
segunda-feira, 28 de abril de 2014
Returning Slowly - config (dot) files and kernel study
Hello all! しばらくですね。
After a long time I came back to studies and, before that, I improved my config files to make the coding easier.
Emacs is rocking to my needs, check it: https://github.com/geyslan/configs/blob/master/home/.emacs.d/init.el
And why not to study (slowly) about OSDev (kernel)? So: https://github.com/radix-kernel/radix
See you.
quinta-feira, 6 de fevereiro de 2014
Moedas Criptográficas: Elétrons como Força de Trabalho
MOEDAS
CRIPTOGRÁFICAS:
ELÉTRONS COMO
FORÇA DE TRABALHO
BEM, Geyslan
Gregório
RESUMO
Breve explanação
do conceito moeda criptográfica e sua implicação na mudança de
paradigma da atribuição de valor e prova de trabalho comumente
aceitos. Tece sobre visões econômicas e o uso do modelo da demanda
e oferta nesse commodity.
Expõe métodos de obtenção e comercialização de moedas e
possibilita uma discussão sobre a viabilidade da criação de uma
nova/própria moeda.
ABSTRACT
Brief reasoning
of the cryptographic currency concept and its implication in the
paradigm change of the attribution of values and work-of-proof
commonly accepted. It discusses economic views and the use of the
model of supply and demand in this commodity. Exposes methods of
obtaining and trading currencies and provides a discussion of the
feasibility of creating a new/own currency.
Keywords:
Cryptocurrency, Cryptocoin, Work-of-proof, Mining, Economics,
Fiat-money, Paradigm breakthrough.
1. INTRODUÇÃO
“Economists,
and especially monetarists, tend to overestimate the purely economic,
narrow and technical functions of money and have placed insufficient
emphasis on its wider social, institutional and psychological
aspects. However,
money originated very largely from non-economic causes:
from tribute as well as trade, from blood-money and bride-money as
well as from barter, from ceremonial and religious rites as well as
from commerce, from ostentatious ornamentation as well as from acting
as the common drudge between economic men.” Roy
Davies
[1]
2. MOEDA
Uma vez que a
domesticação de animais nas culturas tende a preceder às
colheitas, o gado foi, provavelmente [1], a primeira forma de
dinheiro utilizada, por volta de 9.000 a 6.000 Antes
da Era Comum.
Tais animais eram, e ainda são em alguns lugares do planeta, meio
para transações de objetos. Dentre outros, os produtos da colheita,
os minerais preciosos, e os citados animais, foram os mais utilizados
por todo o período subsequente, até 687 AEC, quando a primeira
moeda bruta foi cunhada em Lídia [2-3], na Ásia Menor.
Fonte:
http://www.cngcoins.com/Coin.aspx?CoinID=57383
Dos primórdios do
dinheiro até hoje muito mudou, no entanto, sua propriedade básica
persevera: o valor
atribuído.
Com essa atribuição, o homem é capaz de facilmente se desfazer de
uma posse, material ou virtual, em troca de algum outro produto
social, também material ou virtual, por conta da valoração [4] e
consequente precificação das posses envolvidas.
A função por
excelência da moeda é a de intermediária
de trocas.
Para desempenhar esse papel ela não precisa ter nenhum valor
intrínseco
ou, como outrora, ser lastreada em metal precioso. Frise-se que a
moeda é um bem que possui confiança e aceitação geral pelos
agentes econômicos, estes sendo todos os indivíduos e instituições que, através das suas ações,
intervêm num sistema econômico. A medida de valor [5] também é função da moeda quando esta é precificada. E, por fim, ela
serve como reserva de valor, para indivíduos que não precisam gastá-la imediatamente, transformando-a em ativo financeiro.
2.1. DEMANDA POR
MOEDA
A teoria clássica
[5] diz que a moeda é demandada com a finalidade de se efetuarem
pagamentos originados por transações de compra e venda de bens e
serviços. Nesse pensamento, a demanda de moeda está diretamente
ligada a duas variáveis: volume de transações e velocidade da
moeda, esta última que representa o número de vezes que a moeda
gira para efetuar pagamentos (quanto maior a velocidade, menor a
necessidade de moeda).
Já John Maynard
Keynes, economista britânico, afirmou que a demanda de moeda é
originada por três motivos: transação, precaução e especulação.
A precaução
faz com que as pessoas demandem moeda para cobrir despesas em caso de
emergências, na vez que, por meio da especulação,
as pessoas preferem manter sua riqueza na forma de moeda (preferência
pela liquidez) garantindo maior taxa de juros em posterior aplicação.
2.2. CRIAÇÃO
(INJEÇÃO) DE MOEDA
Atualmente, a moeda
é criada tanto por meio de débitos e empréstimos, quanto por
medidas políticas como a Quantitative
easing [6]
ou
por simples impressão de mais papel moeda. Contudo, não deixa de
ser lastreada na riqueza real produzida pela economia num todo, pois
se houver injeção de moeda acima desse critério, o seu valor
decresce ocasionando a [7] inflação. Mesmo a moeda tendo um
contra-balanço, em princípio, para sua quantidade em circulação,
ela, em verdade, demonstra caráter ilimitado. É salutar se ater ao
fato de que a moeda é apenas uma representação intermediária de
valor, não havendo um objeto, material ou imaterial, ao qual se
possa identificar vínculo direto ao seu valor atribuído. Em suma,
moeda, como entendido nos dias de hoje, não é um bem escasso; é um
artifício controlador da economia de determinado Estado, criado, por
vezes, como uma renovação do ciclo de débito, haja vista a demanda
crescente por crédito.
3. MOEDA
CRIPTOGRÁFICA
Figura 2 - Imagens
ilustrativas das moedas criptográficas mais comuns (Litecoin e
Bitcoin, respectivamente)
Fonte:
http://arranrice.com/2013/12/26/trading-crypto-currencies/
Tudo se inicia
quando o pseudônimo Satoshi Nakamoto (pessoa ou grupo supostamente
detentor(a), hoje, de quase um milhão de bitcoins [8])
desenvolve o que foi chamado de “Bitcoin: A Peer-to-Peer Electronic
Cash System” no paper [9] de mesmo título. A ideia de se criar uma
moeda virtual já havia sido discutida por Steven Levy [10], e a
custo computacional por Wei Dai [11], entretanto, foi após o advento
da rede bitcoin que o conceito de moeda criptográfica veio à tona.
É importante
relevar que essa nova “moeda” virtual em si não é uma moeda
como as que foram anteriormente citadas [12-16], ela carece, para a
terminologia econômica, de alguns aspectos como aceitação geral.
Porém, essa carência tende a se extinguir com o tempo, como pode
ser acompanhado pelo site coinmap.org
e pela adesão crescente [17-18] noticiada pela mídia.
3.1.
WORK-OF-PROOF
A moeda que o homem
recebe pela sua labuta diária (seja ela prestada fisicamente ou
intelectualmente) é uma mera contraprestação pecuniária. Em
resumo, o resultado de seu esforço é sua prova de trabalho, seu
work-of-proof. Na febre do ouro [19], o homem buscou obter resultados
futuros com a mineração desse metal maleável; tal anseio se
repetiu com a chegada das moedas criptográficas.
Um dos grandes
questionamentos contrários a essa nova moeda é o de que se está a
fazer dinheiro do nada. O que se esquece é que tais moedas virtuais
são escassas, finitas, contrariamente à moeda estatal que pode ser
criada facilmente. Frise-se, mais uma vez, que as “moedas”
virtuais são objetos valorados pela sua oferta e procura, dessa
forma se encaixando, perfeitamente, dentre as [20] commodities.
Ao se minerar a
moeda virtual diretamente pela rede peer-to-peer, o paradigma da
prova de trabalho é quebrado, pois esta não está mais atrelada ao
esforço físico ou intelectual, e sim à aceitação da própria
moeda depreendida pelo poder computacional empregado na sua mineração
(lastreio em bits [21]):
“They vote with
their CPU power, expressing their acceptance of valid blocks by
working on extending them and rejecting invalid blocks by refusing to
work on them.” [9]
Os
softwares específicos para a mineração (minerd, cgminer, cudaminer
etc) coletam as transações da rede, validam-nas evitando as
conflituosas, inserem-nas em grandes blocos, e processam os hashes
criptográficos inúmeras vezes, até encontrar um bom o bastante
para uso. Após isso submetem o bloco para a rede, adicionando-o à
cadeia de bloco [22]. Os mineradores estão, em suma, automatizando o processo de segurança
da rede e recebendo uma recompensa em troca.
Mesmo que sejam
contra esse novo tipo de moeda, as políticas estatais [23] não têm
o poder para recusarem sua circulação entre seus detentores. Além
das várias propriedades que tais moedas oferecem, sejam algumas
delas a descentralização, transações anônimas (se tomados os
cuidados necessários), segurança criptográfica, e custos
transacionais reduzidos a centavos (comparados às taxas exorbitantes
de cartões de crédito), há moedas paralelas à estatal [24-25] que
circulam livremente em várias sociedades e são forte exemplo de
fomentação de riquezas.
3.2. MANEIRAS DE
SE OBTER MOEDA CRIPTOGRÁFICA
No
Brasil há possibilidade de se comercializar (converter em/de moeda
estatal) duas moedas virtuais: bitcoin e litecoin. Através de
cadastro no site mercadobitcoin.com.br,
o usuário pode efetuar compras e vendas a um custo percentual
(intermediação). Essa empresa é uma sociedade limitada e está
registrada na Receita Federal com a atividade econômica secundária
descrita como “Atividades de intermediação e agenciamento de
serviços e negócios em geral, exceto imobiliários”. Há ainda
outros bons sites no exterior, já conhecidos dos investidores, nos
quais se pode transacionar outras coins: MtGox (mtgox.com),
e BTC-E (btc-e.com).
Outro
método, e mais empolgante, é o de mineração da moeda diretamente
pela rede peer-to-peer. Para tanto, o interessado deve dispor de
poder computacional para o processamento de hashes que comprovam sua
participação na construção da cadeia de blocos [26]. Transformar
elétrons em moeda é um pouco confuso quando não se tem em mente a
já discutida quebra de paradigma e aspectos sobre o funcionamento da
própria moeda em questão; como exemplo temos a sua própria
segurança que é fortalecida [27] a cada novo minerador de confiança
que se conecta à rede.
Figura 3 - Mineração
através do software cgminer.
Fonte: Rig do autor.
3.3. VIABILIDADE
DE MINERAÇÃO
A mineração
através de GPUs (2ª geração) ainda é possível para moedas
alternativas e ou novas, a maioria baseada no algoritmo Scrypt
[28], como a litecoin, todavia, quando se trata de mineração de
bitcoin, ou seja, moedas que usam o algoritmo sha-256
[29], o retorno financeiro só é alcançado com o uso de ASIC
[30] (Application-specific integrated circuit) (3ª geração), haja
vista o seu baixo consumo de energia e alto poder de processamento,
comparado às GPUs.
Isso se dá mais
pela dificuldade [31-32] que tais moedas apresentam. Logo as moedas
scrypt atingirão um nível de dificuldade tão alto que suas
minerações só se darão através de ASICs também. Trata-se
literalmente de uma “corrida do ouro”; quem conseguir “extrair”
mais moedas o mais breve possível, com o mínimo de consumo
energético e o máximo poder de processamento, terá, possivelmente,
maior prospecção de lucro.
Figura 4 - Evolução
da dificuldade de mineração da Litecoin de 05/2013 a 01/2014
Fonte:
http://bitcoinwisdom.com/litecoin/difficulty
Figura 5 - Evolução
da dificuldade de mineração da Bitcoin de 05/2013 a 01/2014
Fonte:
http://bitcoinwisdom.com/bitcoin/difficulty
Evidencia-se, pela
análise dos gráficos acima, que quanto maior a taxa de hash, maior
a dificuldade. Em poucas palavras, quanto maior o interesse no
minério de tal moeda, maior a dificuldade de mineração e,
consequentemente, maior poder de processamento necessário.
Rigs (equipamentos)
são comumente usados com o objetivo comum de minerar o máximo
possível com o mínimo de energia. Seu efetivo funcionamento depende
do conhecimento do interessado e da disponibilidade de partes (GPUs,
Placas mãe, ASICs) no mercado.
Alguns mineradores
são apenas hobbistas radicais [33] com pouco interesse no lucro da
moeda. Sua satisfação está em montar o rig e vê-lo funcionando.
Essa adesão se dá de forma similar a de hackers que participam de
meios open sources com o interesse apenas de contribuir. Contudo,
esse tipo de minerador faz parte de um ínfimo grupo, até por que o
intuito da grande maioria é deveras a obtenção de lucro.
Figura 6 - Minerador
com 6 (seis) GPUs (2 placas-mãe)
Fonte:
https://bitcointalk.org/index.php?topic=7216.2220
Figura 7 - Minerador
com 4 (quatro) GPUs
Fonte:
https://bitcointalk.org/index.php?topic=7216.2220
O maior problema dos
ASICs é sua indisponibilidade imediata. Os fabricantes tendem a
demorar de dois a três meses para fechar lotes de pré-compra. Em
suma, o interessado paga o produto (ou parte dele), aguarda o período
da fabricação e entrega (para o Brasil, ainda deve-se somar o custo
de 60% do imposto de importação mais ICMS). Tal demora encarece o
produto e aumenta sua inviabilidade, lembrando que a dificuldade da
mineração tende a aumentar constantemente: o minerador ASIC que
mineraria n
moedas no ato da compra, após todo o ínterim, ao ser recebido,
minerará sempre menos moedas.
Figura 8 - Vários
mineradores ASIC
Fonte:
http://www.indiegogo.com/projects/bitcoin-mining-hardware
Através
dos fatores analisados (custo e disponibilidade de hardware, consumo
de energia, facilidade de troca em moeda estatal, alta dificuldade de
mineração de bitcoins), e, ainda, usando-se GPUs, a litecoin
se destaca como a moeda em voga para mineração e rentabilidade
quase certa nos dias de hoje, demonstrando estabilidade e alavancagem
futura.
3.4. CRIANDO-SE A
PRÓPRIA MOEDA
Dar origem a uma
moeda ao bel prazer soa muito como uma utopia retirada de um conto
fantasioso. Defendendo o lado anti-cryptocoin,
o economista Paul Krugman no seu post Bitcoin
is Evil
[34] cita o posicionamento do escritor de sci-fi Charlie Stross [35]:
“To
editorialize briefly, BitCoin looks like it was designed as a weapon
intended to damage central banking and money issuing banks, with a
Libertarian political agenda in mind—to damage states ability to
collect tax and monitor their citizens financial transactions.
Which is fine if you're a Libertarian, but I tend to take the stance
that Libertarianism is like Leninism: a fascinating, internally
consistent political theory with some good underlying points that,
regrettably, makes prescriptions about how to run human society that
can only work if we replace real messy human beings with frictionless
spherical humanoids of uniform density (because it relies on
simplifying assumptions about human behaviour which are unfortunately
wrong).”
Krugman afirma,
corroborando com Stross, que o intento da bitcoin parece ser o de
destruir o controle estatal e bancário, assemelhando-se a uma
política libertarista. Ambos, propositalmente ou não, extrapolam a
questão ao deixar de analisar as nuances econômicas e atacando
diretamente um posicionamento político. A própria justificativa
inicial de Stross é sobre a proibição da troca local de bitcoins
na China; ora se vê o embasamento de ambos referenciando a atitude
de um país de política aquém da democrática, esta que não se
sobressai ao já esperado. Atente-se, ademais, para o fato de o
residente chinês não ter sido impossibilitado de negociar bitcoins
através da rede peer-to-peer diretamente com outros usuários ou
exchanges
no exterior.
Bitcoin é open
source
[36], ou seja, seus criadores não pretenderam torná-la uma [37-38]
“moeda criptográfica única”. Após seu surgimento, várias
altcoins
(alternative coins) foram criadas, baseadas no seu código aberto,
como por exemplo a litecoin, a peercoin, e a recente e famosa
dogecoin. Haja vista nem todos os aspectos de uma moeda criptográfica
agradarem seus usuários/mineradores, modificações a respeito de
volume de moedas, algoritmo utilizado para construção do bloco em
cadeia, tempo de liberação de novos blocos, dentre outras, são
feitas com o intento de se atingir um determinado público. Programar
na linguagem C é o mínimo que o aspirante à “cunhagem” deve
saber, além de deter conhecimento sobre criptografia, e, dependendo
das mudanças pleiteadas, sobre redes peer-to-peer.
De toda sorte, é
meritório ressaltar que algumas moedas criptográficas já foram
criadas e tiveram uma curta vida, isso devido à pequena aceitação
do público ou falta de divulgação necessária. Para se evitar uma
morte prematura, o interessado deve pesquisar bastante sobre as
principais características econômicas e tecnológicas envolvidas.
Ironicamente, o viés social, por vezes imprevisível, pode
transformar uma brincadeira como a dogecoin e seus memes [39-40] em
um negócio, até o momento, bastante promissor.
REFERÊNCIAS
[1]
DAVIES, Roy. A Comparative Chronology of Money - Monetary
History from Ancient Times to the Present Day. Disponível
em: <http://projects.exeter.ac.uk/RDavies/arian/amser/chrono.html>.
Acessado em: jan de 2014.
[2]
WIKIPEDIA. Lydia - First coinage. Disponível em:
<http://en.wikipedia.org/wiki/Lydia#First_coinage>. Acessado
em: jan de 2014.
[3]
ASIA MINOR COINS. Kings of Lydia - Asia Minor Coins - Photo
Gallery. Disponível em:
<http://www.asiaminorcoins.com/gallery/thumbnails.php?album=431>.
Acessado em: jan de 2014.
[4]
ALMEIDA, Fábio. A diferença entre preço e valor. O
Pequeno Investidor, 2014. Disponível em:
<http://www.opequenoinvestidor.com.br/2010/12/a-diferenca-entre-preco-e-valor/>.
Acessado em: jan de 2014.
[5]
VICECONTI, Paulo E. V.; DAS NEVES, Silvério. Introdução à
Economia. 5ª ed. 2002. 267 p.
[6]
WIKIPEDIA. Money Creation. Disponível em:
<http://en.wikipedia.org/wiki/Money_creation>. Acessado em: jan
de 2014.
[7]
WIKIPEDIA. Inflation. Disponível em:
<http://en.wikipedia.org/wiki/Inflation>. Acessado em: jan de
2014.
[8]
JEFFRIES, Adrianne. Four years and $100 million later,
Bitcoin’s mysterious creator remains anonymous - We still don't
know who invented Bitcoin. But we do know he's rich. 06/05/2013.
Disponível em:
<http://www.theverge.com/2013/5/6/4295028/report-satoshi-nakamoto>.
Acessado em: jan de 2014.
[9]
NAKAMOTO, Satoshi. Bitcoin: A Peer-to-Peer Electronic Cash
System. 24/05/2009. Disponível em:
<http://bitcoin.org/bitcoin.pdf>. Acessado em: jan de 2014.
[10]
LEVY, Steven. E-Money (That’s what I want). 12/1994.
Disponível em:
<http://www.wired.com/wired/archive/2.12/emoney.html>. Acessado
em: jan de 2014.
[11]
DAI, Wei. b-money, a scheme for a group of untraceable
digital pseudonyms to pay each other with money and to enforce
contracts amongst themselves without outside help. Disponível
em: <http://www.weidai.com/bmoney.txt>. 1998. Acessado em: jan
de 2014.
[12]
TERRA ECONOMIA. Moeda virtual, cada Bitcoin chega a valer R$
268 em negócios. 03/06/2013. Disponível em:
<http://economia.terra.com.br/operacoes-cambiais/operacoes-empresariais/moeda-virtual-cada-bitcoin-chega-a-valer-r-268-em-negocios,3a1dac07bfafe310VgnVCM10000098cceb0aRCRD.html>.
Acessado em: jan de 2014.
[13]
O'BRIEN, Matthew. Bitcoin Is No Longer a Currency - It's the
ultimate dotcom stock. 11/04/2013. Disponível em:
<http://www.theatlantic.com/business/archive/2013/04/bitcoin-is-no-longer-a-currency/274859/>.
Acessado em: jan de 2014.
[14]
FORBES, Steve. Bitcoin: Whatever It Is, It's Not
Money! 16/04/2013. Disponível em:
<http://www.forbes.com/sites/steveforbes/2013/04/16/bitcoin-whatever-it-is-its-not-money/>.
Acessado em: jan de 2014.
[15]
BRADBURY, Danny. Bitcoin Could be Regulated as a Commodity,
Senate Banking Hearing Advised. 19/11/2013. Disponível em:
<http://www.coindesk.com/bitcoin-regulated-commodity-banking-hearing-advised/>.
Acessado em: jan de 2014.
[16]
WILLIAMS-GRUT, Oscar. GoldMoney Group adds Bitcoin to
commodity vault. 13/01/2014. Disponível em:
<http://www.independent.co.uk/news/business/news/goldmoney-group-adds-bitcoin-to-commodity-vault-9055414.html>.
Acessado em: jan de 2014.
[17]
HENRIK, Rodrigo. CoinMap. Número de locais físicos que
aceitam Bitcoin aumenta 81%. 02/12/2013. Disponível em:
<http://bestbitcoin.com.br/coinmap-numero-de-locais-fisicos-que-aceitam-bitcoin-aumenta-81-por-cento/>.
Acessado em: jan de 2014.
[18]
COMPUTERWORLD. Bitcoin pode ser usado para transações
privadas, diz governo alemão. 19/08/2013. Disponível em:
<http://www.computerworld.com.pt/2013/08/19/bitcoin-pode-ser-usado-para-transacoes-privadas-diz-governo-alemao/>.
Acessado em: jan de 2014.
[19]
WIKIPEDIA. Febre do ouro. Disponível em:
<http://pt.wikipedia.org/wiki/Febre_do_ouro>. Acessado em: jan
de 2014.
[20]
WIKIPEDIA. Commodity. Disponível em:
<http://pt.wikipedia.org/wiki/Commodity>. Acessado em: jan de
2014.
[21]
RESENDE, Daniel; AGUSTINI, Gabriela. Moeda digital com lastro
em bits já circula fora da internet. 28/03/2013. Disponível em:
<http://www.comparacaodefundos.com/blog/moeda-digital-com-lastro-em-bits-ja-circula-fora-da-internet/>.
Acessado em: jan de 2014.
[22]
EMANSIPATER. What exactly is Mining? Stack Exchange,
Bitcoin. 08/09/2011. Disponível em:
<http://bitcoin.stackexchange.com/questions/148/what-exactly-is-mining>.
Acessado em: jan de 2014.
[23]
DENG, Chao. China proíbe compra de bitcoins e derruba preço
da moeda virtual. 19/12/2013. Disponível em:
<http://online.wsj.com/news/articles/SB10001424052702304866904579266710645195076>.
Acessado em: jan de 2014.
[24]
DUARTE, Hélter. Bairro de Fortaleza cria moeda própria e
enriquece. 21/03/2009. Disponível em:
<http://g1.globo.com/globoreporter/0,,MUL1052010-16619,00-BAIRRO+DE+FORTALEZA+CRIA+MOEDA+PROPRIA+E+ENRIQUECE.html>.
Acessado em: jan de 2014.
[25]
WIKIPEDIA. Local Currency. Disponível em:
<http://en.wikipedia.org/wiki/Local_currency>. Acessado em: jan
de 2014.
[26]
CLARK, Chris. Bitcoin Internals: A Technical Guide to
Bitcoin. 22/11/2013. Amazon Digital Services.
[27]
ROIO, Denis. Bitcoin, the end of the Taboo on Money.
Versão 1.0, 06/04/2013. Disponível em:
<https://files.dyne.org/.xsend.php?file=readers/Bitcoin_end_of_taboo_on_money.pdf>
Acessado em: jan de 2014.
[28]
WIKIPEDIA. Scrypt. Disponível em:
<http://en.wikipedia.org/wiki/Scrypt>. Acessado em: jan de
2014.
[29]
WIKIPEDIA. Secure Hash Algorithm. Disponível em:
<http://en.wikipedia.org/wiki/Secure_Hash_Algorithm>. Acessado
em: jan de 2014.
[30]
WIKIPEDIA. Application-specific integrated
circuit. Disponível em:
<http://en.wikipedia.org/wiki/Application-specific_integrated_circuit>.
Acessado em: jan de 2014.
[31]
BITCOIN WIKI. Bitcoin Difficulty. Disponível em:
<https://en.bitcoin.it/wiki/Difficulty>. Acessado em: jan de
2014.
[32]
LITECOIN WIKI. Litecoin Difficulty. Disponível em:
<https://litecoin.info/Difficulty>. Acessado em: jan de 2014.
[33]
TAYLOR, Michael Bedford. Bitcoin and The Age of Bespoke
Silicon. Disponível em:
<http://cseweb.ucsd.edu/~mbtaylor/papers/bitcoin_taylor_cases_2013.pdf>.
Acessado em: jan de 2014.
[34]
KRUGMAN, Paul. Bitcoin is Evil. 28/12/2013. Disponível
em: <http://krugman.blogs.nytimes.com/2013/12/28/bitcoin-is-evil/>.
Acessado em: jan de 2014.
[35]
STROSS, Charlie. Why I want Bitcoin to die in a
fire. 18/12/2013. Disponível em:
<http://www.antipope.org/charlie/blog-static/2013/12/why-i-want-bitcoin-to-die-in-a.html>.
Acessado em: jan de 2014.
[36]
GITHUB. Bitcoin Source Code in Github. Disponível
em: <https://github.com/bitcoin/bitcoin>. Acessado em: jan de
2014.
[37]
HERN, Alex. Bitcoin me: How to make your own digital
currency. 07/01/2014. Disponível em:
<http://www.theguardian.com/technology/2014/jan/07/bitcoin-me-how-to-make-your-own-digital-currency>.
Acessado em: jan de 2014.
[38]
COHEN, Reuven. Bitcoin Mania: How To Create Your Very Own
Crypto-Currency, For Free. 29/11/2013. Disponível em:
<http://www.forbes.com/sites/reuvencohen/2013/11/29/bitcoin-mania-how-to-create-your-very-own-crypto-currency-for-free/>.
Acessado em: jan de 2014.
[39]
SILVA, Juliana. Dogecoin supera Bitcoin e se torna a moeda
virtual com mais transações - InfoMoney. 17/01/2014. Disponível
em:
<http://www.infomoney.com.br/minhas-financas/gadgets/noticia/3150198/dogecoin-supera-bitcoin-torna-moeda-virtual-com-mais-transacoes>.
Acessado em: jan de 2014.
[40]
WEISENTHAL, Joe. The 'Joke' Digital Currency Dogecoin Is
Actually A Really Big Deal. 27/12/2013. Disponível em:
<http://www.businessinsider.com/dogecoin-is-a-big-deal-2013-12>.
Acessado em: jan de 2014.
Mining cryptocoins (Minerando moedas criptográficas) - Será?
o/
terça-feira, 7 de janeiro de 2014
[AnchisesLandia] Mais de 500 Profissionais de Segurança no Twitter
Compartilho com vocês uma bela lista, elaborada pelo colega Anchises, com os profissionais e afins da área de Segurança (estende-se a várias especialidades). E aproveito para agradecer a esse grande hacker pela inclusão de meu nome (fato que só percebi hoje - /o\ shame), mesmo eu sendo apenas um curioso a respeito de computadores. :-)
Mais de 500 Profissionais de Segurança no Twitter
o/
segunda-feira, 28 de outubro de 2013
"It works" mantra
Hi there,
I would like to share with you this Coverity post (Andy) that, somehow, I have instigated through discussion in lkml. Andy's argument corroborates with mine, which concerns the deceptive "it works" mantra.
Code isn't only a piece that makes things happen. It's really a piece of art that demands clarity for whomever read it.
o/
sexta-feira, 7 de junho de 2013
(Un)building Software - English Version
“Reverse engineering is the process of extracting the knowledge or design blueprints from anything man-made. Software is one of the most complex and intriguing technologies around us nowadays, and software reverse engineering is about opening up a program’s 'box' and looking inside. Of course, we won’t need any screwdrivers on this journey. Just like software engineering, software reverse engineering is a purely virtual process, involving only a CPU, and the human mind” Reversing – Secrets of Reverse Engineering – Eldad Eilam
Before we get involved with reversing itself it's important to learn how the binary software assembling really works.
For its construction, it is necessary (unless you are masochistic and want to build machine code directly) a programming language. This translates as a standardized method to inform instruction to a processor. Each language has its own standardization as well as their level of abstraction (low, medium and high).
Following, are highlighted the procedures demanded for the transformation of the written code in a block of statements "understandable" by the computer.
Software assembling
The construction or compilation is a multistage process that involves various tools. In our case, the tools used will be the front-end of gcc (GNU Compiler), the cc1 (C Compiler), the as (GNU Assembler), the collect2 (ld wrapper), and ld (GNU Linker). The complete set of tools used in the process of compilation is called toolchain, which is already installed on GNU / Linux most of time. The creation of specific toolchains are essential for cross-compiling but this subject is for a future post.
While invoking GCC the sequence of commands executed obey the following stages:
- compilation (source code to assembly language)
- assembler (assembly language into machine code)
- linking (creating the final binary)
# mkdir construindo; cd construindo
# echo -e "#include <stdio.h>\nint main() { printf(\"Hello World\\\n\"); return 0;}" > programa1.c
To this compilation we will use gcc.
# gcc programa1.c -o programa1
While running gcc the preprocessing, compilation, assembly and linking steps are performed one after another in a transparent manner until the ELF binary 'programa1' is finally created.
# ./programa1
Hello World
Then, for better understanding, we will cover each phase manually.
Preprocessing and Compilation
PreprocessingIn past versions of gcc, preprocessing was done as a separate stage through cpp (C preprocessor):
# cpp programa1.c -o programa1.i
The output was a file with expanded macros and declared header files included. The preprocessor, in fact, translate the average abstraction of C language (that we programmed) to another one to be recognizable by the next stage of the build.
# 1 "programa1.c"
# 1 "<command-line>"
# 1 "programa1.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 28 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
...
...
extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__$
# 940 "/usr/include/stdio.h" 3 4
# 2 "programa1.c" 2
int main(void) { printf("Hello World\n"); return 0;}
This first stage is currently embedded by cc1 compiler when used with default options, ie, it is usually omitted.
# gcc programa1.c -o programa1 -v
...
/usr/lib/gcc/x86_64-linux-gnu/4.7/cc1
-quiet -v -imultiarch x86_64-linux-gnu programa1.c -quiet -dumpbase
programa1.c -mtune=generic -march=x86-64 -auxbase programa1 -version
-fstack-protector -o /tmp/ccZvPRPS.s
...
As can be seen in verbose mode the cc1 performs preprocessing and compilation generating the assembly file directly. We can make the cc1 be invoked twice, with the use of -no-integrated-cpp option primarily for preprocessing, generating the expanded file (*. I) and then to compile, generating mounting file (*. s). This proceeding is useful when you want to use a preprocessor alternative.
# gcc programa1.c -o programa1 -v -no-integrated-cpp
...
/usr/lib/gcc/x86_64-linux-gnu/4.7/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu programa1.c -mtune=generic -march=x86-64 -fstack-protector -o /tmp/ccjNwBsL.i
...
/usr/lib/gcc/x86_64-linux-gnu/4.7/cc1
-fpreprocessed /tmp/ccjNwBsL.i -quiet -dumpbase programa1.c
-mtune=generic -march=x86-64 -auxbase programa1 -version
-fstack-protector -o /tmp/cc0B4fmf.s
...
...
We may also interrupt the process of gcc, invoking cc1 only once with the intention of you generate the file (*. I) preprocessed.
# gcc programa1.c -o programa1.i -v -E
...
/usr/lib/gcc/x86_64-linux-gnu/4.7/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu programa1.c -o programa1.i -mtune=generic -march=x86-64 -fstack-protector
...
To do this we use the option '-E'.
Compilation
The main purpose of using cc1 through the expanded file or not (programa1.i) is generate its respective assembly code, low-level language.
# gcc programa1.i -o programa1.s -v -S
...
/usr/lib/gcc/x86_64-linux-gnu/4.7/cc1 -fpreprocessed programa1.i -quiet -dumpbase programa1.i -mtune=generic -march=x86-64 -auxbase-strip programa1.s -version -o programa1.s -fstack-protector
...
...
/usr/lib/gcc/x86_64-linux-gnu/4.7/cc1 -quiet -v -imultiarch x86_64-linux-gnu programa1.c -quiet -dumpbase programa1.c -mtune=generic -march=x86-64 -auxbase-strip programa1.s -version -o programa1.s -fstack-protector
...
The option '-S' instructs gcc to only convert the C code, preprocessed or not, to assembly language (programa1.s).
.file "programa1.c"
.section .rodata
.LC0:
.string "Hello World"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
call puts
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2"
.section .note.GNU-stack,"",@progbits
Attention! The assembly code generated may be different on your computer. This discrepancy may have been caused by several reasons: gcc version; architecture used; compilation flags.
To generate the corresponding code in 32-bit, just use the-m32.
# gcc programa1.i -S -m32
or
# gcc programa1.c -S -m32
See the difference:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
movl $.LC0, (%esp)call puts
movl $0, %eax
leave
.cfi_restore 5
cfi_def_cfa 4, 4ret
.cfi_endproc
Assembler
In assembly the code is converted into their related instructions into machine code. The result is an object file (object file).
# gcc programa1.s -o programa1.o -v -c
...
as -v --64 -o programa1.o programa1.s
...
...
# gcc -c programa1.s -o programa1.o -v -m32 -c
...
as -v --32 -o programa1.o programa1.s
...
...
The '-c' option tell the gcc to compile only or just mount the source file, skipping the linking process.
As seen above, the "as" assembles the binary using the assembly file(programa1.s). When we run the file against the constructed object-file we can see the ELF structure.
As seen above, the "as" assembles the binary using the assembly file(programa1.s). When we run the file against the constructed object-file we can see the ELF structure.
# file programa1.o
programa1.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
programa1.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
However as the build process has not been finished, when we try to run it we get the message that it is impossible to run the binary file. By using ltrace (analysis tool called the libraries) we get the message "./programa1.o is not an ELF executable nor shared library". The assembler built a block of binary instructions for the architecture but not defined the addresses related to the external functions and consequently not relocated the binary to the correct execution.
Linking
Until then the object file assembled do not know where to look (the address of the functions necessary for the correct functioning). The Linking is, in this case, the process of agglutination of the object files, symbol resolution and relocation of the sections and their addresses in binary once generated.
Let's see.
Let's see.
# gcc programa1.o -o programa1 -v
...
/usr/lib/gcc/x86_64-linux-gnu/4.7/collect2
--sysroot=/ --build-id --no-add-needed --as-needed --eh-frame-hdr -m
elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2
-z relro -o programa1
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o
/usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o
-L/usr/lib/gcc/x86_64-linux-gnu/4.7
-L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu
-L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib
-L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu
-L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../.. programa1.o
-lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s
--no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.7/crtend.o
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crtn.o
...
or
# gcc programa1.o -o programa1 -v -m32
...
/usr/lib/gcc/x86_64-linux-gnu/4.7/collect2
--sysroot=/ --build-id --no-add-needed --as-needed --eh-frame-hdr -m
elf_i386 --hash-style=gnu -dynamic-linker /lib/ld-linux.so.2 -z relro -o
programa1 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib32/crt1.o
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib32/crti.o
/usr/lib/gcc/x86_64-linux-gnu/4.7/32/crtbegin.o
-L/usr/lib/gcc/x86_64-linux-gnu/4.7/32
-L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../i386-linux-gnu
-L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib32
-L/lib/i386-linux-gnu -L/lib/../lib32 -L/usr/lib/i386-linux-gnu
-L/usr/lib/../lib32 -L/usr/lib/gcc/x86_64-linux-gnu/4.7
-L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../i386-linux-gnu
-L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../.. -L/lib/i386-linux-gnu
-L/usr/lib/i386-linux-gnu programa1.o -lgcc --as-needed
-lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed
/usr/lib/gcc/x86_64-linux-gnu/4.7/32/crtend.o
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib32/crtn.o
...
What gcc actually does is invoke collect2 (wrapper for the ld (binutils)) stating all the object files to be linked.
It is true that ld can be used directly, of all sorts, the gcc/collect2 now informs all libs needed for linking, which makes it much easier.
After the process is finished, you can verify that the executable is properly linked.
It is true that ld can be used directly, of all sorts, the gcc/collect2 now informs all libs needed for linking, which makes it much easier.
After the process is finished, you can verify that the executable is properly linked.
# file programa1
programa1: ELF 32-bit LSB executable,
Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs),
for GNU/Linux 2.6.24, BuildID[sha1]=0xa0c...bf73, not stripped
programa1: ELF 64-bit LSB executable,
x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for
GNU/Linux 2.6.24, BuildID[sha1]=0xe07...8df3, not stripped
And finally run it.
# ./programa1
Hello World
Conclusion
We were able, in this post, to follow briefly the process of building an ELF executable, exemplifying their procedures in GNU / Linux using GCC. Next, we will begin a practical approach of reverse engineering that will enable an understanding of the ELF structure as well as the method and tools used in reversing.
See you there!
Translated by: Pedro Fausto
See you there!
Translated by: Pedro Fausto
More Information
Reversing – Secrets of Reverse Engineering – Eldad EilamReverse Engineering
A Introduction to GCC – Brian Gough
Compiler, Assembler, Linker and Loader: A Brief Story
Basics of GCC compilation process
GNU C Compiler Internals/GNU C Compiler Architecture
GCC front-end Whitepaper - Andi Hellmund
Programming language
List of programming languages by type
C (programming language)
Low-level programming language
Assembly Language
Machine code
Assinar:
Comentários (Atom)







