<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-2209090923956459095</atom:id><lastBuildDate>Thu, 24 Sep 2026 04:58:30 +0000</lastBuildDate><category>analysis</category><category>communication</category><category>encryption</category><category>ransomware</category><category>.NET</category><category>Mono</category><category>Sandrorat</category><category>WhatsApp</category><category>Z3Core</category><category>cryptography</category><category>kitkat</category><category>malware</category><category>AndroidManifest</category><category>FUD</category><category>FinFisher</category><category>FinSpy</category><category>KLM</category><category>Koler</category><category>Mastercard</category><category>Monty Python</category><category>NFC</category><category>OBAD</category><category>OWASP</category><category>PornDroid</category><category>PornLocker</category><category>SmsSecure</category><category>Visa</category><category>cicio</category><category>cipher</category><category>cloudatlas</category><category>crystalline</category><category>droidjack</category><category>ebanking</category><category>firmware</category><category>hardware</category><category>iBanking</category><category>mobile payments</category><category>not-security</category><category>prepaid</category><category>sms</category><category>synthetic</category><category>thoughtcrime</category><category>tool</category><title>(Not only) Android malware analysis</title><description>&lt;a href=&quot;http://twitter.com/maldr0id&quot;&gt;@maldr0id&lt;/a&gt;&#39;s blog</description><link>http://maldr0id.blogspot.com/</link><managingEditor>noreply@blogger.com (Unknown)</managingEditor><generator>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-795235708438602544</guid><pubDate>Fri, 07 Aug 2020 17:00:00 +0000</pubDate><atom:updated>2020-08-07T17:59:02.150+01:00</atom:updated><title>Mathematics, objective truth and why 2+2=4 and not 2+2=5</title><description>There&#39;s a discussion on Twitter about the result of the arithmetic operation 2+2. It all started with James Lindsay who made a snarky remark to illustrate the point that there&#39;s &lt;b&gt;The Objective Truth&lt;/b&gt; which is not a societal construct:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;2+2=4: A perspective in white, Western mathematics that marginalizes other possible values.&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Twitter users don&#39;t seem to be a fan of James Lindsay and wanted to prove him wrong by finding a way to &quot;prove&quot; that 2+2=5 and that everything is a societal construct. You can read &lt;a href=&quot;https://newdiscourses.com/2020/08/2-plus-2-never-equals-5/&quot;&gt;Lindsay summary of the issue here&lt;/a&gt;, but first stay with me for a while. Full disclosure: I did not know who James Lindsay was until this whole Twitter storm.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This Twitter discussion, when you remove the facade of sarcasm, anger and spite, goes to the very core of mathematics - something I&#39;m familiar with and very passionate about. So let me take you on a journey through crumbling foundations of mathematics and how they were rebuilt (or rather plastered together so they don&#39;t look like they are crumbling). I promise I will only talk science and I won&#39;t talk about politics and society until the very last section.&lt;/div&gt;&lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Do numbers exist?&lt;/h4&gt;&lt;div&gt;When I was studying mathematics I had a class which started with the professor asking me this:&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;- Do you believe that real numbers exist?&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;/i&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I thought about it for a while and answered &lt;i&gt;no&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;i&gt;- Good, this means that you&#39;re a sensible person. Do you believe that rational numbers exist?&lt;/i&gt;&lt;br /&gt;&lt;i&gt;- Not really, no.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;- Great. Do integers exist?&lt;/i&gt;&lt;br /&gt;&lt;i&gt;- No...&lt;/i&gt;&lt;br /&gt;&lt;i&gt;- Do natural numbers exist?&lt;/i&gt;&lt;br /&gt;&lt;i&gt;- Oh, yes, for sure.&lt;/i&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;- ... and I thought you were a sensible person. Maybe you&#39;ll come round one day.&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The professor knew very well that I love discussing foundations of mathematics and I knew that he liked to ask questions which sounded simple, but were in fact very complex.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This tongue-in-cheek discussion may seem odd on the surface, but it does sum up most of the 20th century advances in the foundations of mathematics and goes very deep into the understanding of the inner workings of science. Let&#39;s talk about that.&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;The barbers&lt;/h4&gt;&lt;div&gt;The very first observation which shattered the foundations of mathematics was Russel&#39;s paradox. At the beginning of the 20th century it was generally assumed that you can construct a set out of every statement with one free variable, e.g. &quot;set of all giraffes&quot; (i.e. set of all &lt;span style=&quot;font-family: courier;&quot;&gt;x&lt;/span&gt; for which &lt;span style=&quot;font-family: courier;&quot;&gt;x is a giraffe&lt;/span&gt;) is a good definition of a set.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Russel&#39;s paradox is a set &lt;span style=&quot;font-family: courier;&quot;&gt;R&lt;/span&gt; that contains all the sets which are not members of themselves. Does the set &lt;span style=&quot;font-family: courier;&quot;&gt;R&lt;/span&gt; contain itself? If set &lt;span style=&quot;font-family: courier;&quot;&gt;R&lt;/span&gt; contained itself it wouldn&#39;t be a member of &lt;span style=&quot;font-family: courier;&quot;&gt;R&lt;/span&gt;. If the set &lt;span style=&quot;font-family: courier;&quot;&gt;R&lt;/span&gt; does not contain itself it&#39;s a member of &lt;span style=&quot;font-family: courier;&quot;&gt;R&lt;/span&gt; and thus contains itself. So the set &lt;span style=&quot;font-family: courier;&quot;&gt;R&lt;/span&gt; cannot exist. Hence, not every statement with one free variable defines a set and there have to be some rules on what defines a set and what doesn&#39;t.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This fairly simple explanation had a very profound implications for mathematics: if we cannot get the idea of a set right how can we talk about numbers and arithmetic and algebra and topology and... you get the picture. It has even wider implications for logic itself: not every statement can (and should) have a logical value. You can rephrase the Russel&#39;s paradox as:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;A barber cuts hair of people only if they don&#39;t cut their own hair. Does this barber cut their own hair?&lt;/i&gt;&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;The axiomatic theory&lt;/h4&gt;&lt;div&gt;This gave raise to the axiomatic set theory (and type theory, but I&#39;ll save that for another time). Even earlier than that Peano introduced a set of axioms that govern the number theory. So clearly the solution to the naive, intuitive approach to mathematics was to have a clearly defined, non-controversial set of statements which will be considered explicitly true (i.e. axioms) and rules by which we derive other true statements from these axioms (i.e. mathematical logic).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Peano proposed the following axioms (&quot;successor&quot; in this context mean simply &quot;the next natural number&quot; - although that has to actually be proven from the axioms):&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;0 is a natural number.&lt;/li&gt;&lt;li&gt;Every natural number has a successor which is also a natural number.&lt;/li&gt;&lt;li&gt;0 is not the successor of any natural number.&lt;/li&gt;&lt;li&gt;If the successor of x equals the successor of y, then x equals y.&lt;/li&gt;&lt;li&gt;The axiom of induction: If a statement is true of 0, and if the truth of that statement for a number implies its truth for the successor of that number, then the statement is true for every natural number.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Some of the axioms are indeed non-controversial (2,3 and 4). However, the very first one proves to be somewhat controversial to this day. Even Peano, in the very first edition of his work, had an axiom that stated &quot;1 is a natural number&quot;, which he later changed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I did &lt;a href=&quot;https://twitter.com/maldr0id/status/1291393731514576897&quot;&gt;a poll to see whether people on Twitter&lt;/a&gt; think about the first axiom (should it be 0 or 1) and my followers seem to have very strong opinions on that subject.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In general it doesn&#39;t really matter for Peano axioms (apart from cosmetics) whether we will include 0 or not. The resulting model of natural numbers stays the same (of course, you have to exclude 0 in one of the resulting models to show that they are the same). 0 or 1 is just a token, a graphical sign for the first natural number. However, it does show that even the simplest axioms are not non-controversial and are not &quot;objectively, intuitively true&quot;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I didn&#39;t say anything about the axiom number 5 - in my opinion the most controversial of all of them. It refers to &quot;a statement&quot; and the truth of that statement. This leads us to the solution of the barber paradox and the meaning of truth in mathematics.&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;The orders of logic&lt;/h4&gt;&lt;div&gt;The statement about the barbers doesn&#39;t have a logical value - it cannot be true and it cannot be false. One idea to deal with this is to consider this statement invalid, because it references itself - when you see the word &quot;people&quot; it applies to &quot;barber&quot;, so&amp;nbsp;the statement says something about it&#39;s own truth value.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In order for a statement to have a truth value it cannot reference itself. It can reference other statements and then we call this a second-order logic. For example a statement &quot;0 is not the successor of any natural number&quot; is a first-order logic statement. However, the axiom number 5 starts with &quot;if a statement...&quot; so it&#39;s a second-order logic statement, because it references to statements.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In order to break the circular reference a second-order logic statement may only reference the first-order statements and not the second-order statements. In the barber example it would mean that the reference to &quot;people&quot; didn&#39;t include the barber and then we can assign a logical value to it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As you can see here what is considered a &quot;statement with a logical value&quot; gets pretty messy the closer you look.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The reason for axiom number 5 being controversial is that if we assume all of the Peano axioms we admit that even something as simple as arithmetic needs second-order logic. There are ways around that, but, again, that may be a good story for another time.&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;The Gödel incompleteness theorem&lt;/h4&gt;&lt;div&gt;The&amp;nbsp;Gödel incompleteness theorem stroke a final blow to the foundations already weakened by Russel and is my personal favourite theorem in all of mathematics. It states that no matter what axioms you accept as the foundation of natural numbers there will always be a statement which you won&#39;t be able to prove. Mathematician call this an &lt;i&gt;incomplete system&lt;/i&gt;&amp;nbsp;- it doesn&#39;t assign a truth value to all statements.&amp;nbsp;Gödel says that &lt;i&gt;every&lt;/i&gt;&amp;nbsp;interesting system is incomplete.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The implication here is that you cannot create a perfect set of axioms - not only that the Peano ones aren&#39;t perfect, but no other ones will ever be perfect. Let that sink in for a while before we move to the second theorem - and yes, there is a second part.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While completeness means that all the statements have a truth value assigned to them, consistency means that every statement has at most one truth value - or, to put it in other words, there is no statement that is both true and false. Incomplete systems are not interesting to mathematicians - if you can prove that one statement is both false and true the whole logical reasoning collapses pretty quickly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Second Gödel&#39;s theorem says that you cannot prove that a system is complete within that system. So you cannot prove that the Peano axioms don&#39;t lead you to a paradoxical statements within Peano axioms. You have to go outside that system. The search for a &lt;i&gt;perfect, all encompassing&lt;/i&gt;&amp;nbsp;system collapsed even more now.&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;OK, but this is just a theory(TM)&lt;/h4&gt;&lt;div&gt;So your first reaction may be the same as the reaction of people who first heard about the&amp;nbsp;Gödel theorems - the statements that this theorem talks about are probably not interesting from a mathematical perspective. The theorem may be true, but it&#39;s not practical in every day work.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Furthermore, if an unprovable statement comes up we can use our intuition and &quot;objective truth&quot; to figure out if it&#39;s true or not and add it to the axioms, should we need that statement. All is fine. I&#39;m not a psychologist but I believe this reasoning is called &lt;i&gt;denial&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, this status quo (again, denial) remained for a very short while. All was fine until the continuum hypothesis entered the stage. The continuum hypothesis is a fairly easy to explain statement. You may know that there&#39;s more real numbers than natural numbers. The number of real numbers is called &lt;i&gt;continuum&lt;/i&gt; and the number of natural numbers is called &lt;i&gt;aleph zero&lt;/i&gt;. The continuum hypothesis states that there&#39;s no set which has a size in between &lt;i&gt;aleph zero&lt;/i&gt; and &lt;i&gt;continuum&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even simpler: there is no set which has more elements than there are natural numbers (or integers or rational numbers - they all have the same number of elements) and less elements than there are real numbers. Fairly simple. Also fairly unprovable (in the current axiomatic set theory). Also no human intuition as to whether it&#39;s &quot;objectively true&quot; or not. No analogue to real world that can give us any intuition.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So... that&#39;s it. You should feel defeated by now and question the existence of the &quot;objective truth&quot;. If you don&#39;t please continue to the next section.&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;What about computer science?&lt;/h4&gt;&lt;div&gt;Some of you may say: ok, but you know, continuum hypothesis is not something that changes my day-to-day life. If you&#39;re reading this there&#39;s a very high chance that you&#39;re a software developer or software developer-adjacent. If you are you may think that you&#39;re able to write a software which does anything you want and you shouldn&#39;t think about Gödel, continuum hypothesis and all that because it&#39;s just theoretical stuff.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My immediate response to it is: you&#39;re still in denial. Don&#39;t worry though, I also have a longer response.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using a very similar method to Gödel&#39;s you can prove that you are not able to write a computer program which, for any given code in your favourite programming language, is able to decide if that program will stop or run indefinitely. To put it even more simply: you&#39;re (you, the human) not able to decide for every given code in any programming language if it will stop or run forever.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now your reaction may be: wait, but if I just write &lt;span style=&quot;font-family: courier;&quot;&gt;printf&lt;/span&gt; surely I&#39;m able to say it will stop. Yes, but the whole point is that you&#39;re not able to do it for &lt;i&gt;every&lt;/i&gt; program. My favourite example of this is now spoiled thanks to Andrew Wiles, but let&#39;s assume that we all live in the 1980s for a moment and that the Fermat&#39;s Last Theorem is still unproved.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fermat&#39;s Last Theorem is this: for every &lt;span style=&quot;font-family: courier;&quot;&gt;n&amp;gt;2&lt;/span&gt; there are no positive integers &lt;span style=&quot;font-family: courier;&quot;&gt;a&lt;/span&gt;,&lt;span style=&quot;font-family: courier;&quot;&gt;b&lt;/span&gt; and &lt;span style=&quot;font-family: courier;&quot;&gt;c&lt;/span&gt; such that:&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;i style=&quot;background-color: white; color: #202122; font-family: &amp;quot;nimbus roman no9 l&amp;quot;, &amp;quot;times new roman&amp;quot;, times, serif; font-size: 16.52px; white-space: nowrap;&quot;&gt;a&lt;/i&gt;&lt;sup style=&quot;background-color: white; color: #202122; font-family: &amp;quot;nimbus roman no9 l&amp;quot;, &amp;quot;times new roman&amp;quot;, times, serif; font-size: 13.216px; line-height: 1; white-space: nowrap;&quot;&gt;&lt;i&gt;n&lt;/i&gt;&lt;/sup&gt;&lt;span face=&quot;&quot; style=&quot;background-color: white; color: #202122; font-family: &amp;quot;nimbus roman no9 l&amp;quot;, &amp;quot;times new roman&amp;quot;, times, serif; font-size: 16.52px; white-space: nowrap;&quot;&gt;&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;i style=&quot;background-color: white; color: #202122; font-family: &amp;quot;nimbus roman no9 l&amp;quot;, &amp;quot;times new roman&amp;quot;, times, serif; font-size: 16.52px; white-space: nowrap;&quot;&gt;b&lt;/i&gt;&lt;sup style=&quot;background-color: white; color: #202122; font-family: &amp;quot;nimbus roman no9 l&amp;quot;, &amp;quot;times new roman&amp;quot;, times, serif; font-size: 13.216px; line-height: 1; white-space: nowrap;&quot;&gt;&lt;i&gt;n&lt;/i&gt;&lt;/sup&gt;&lt;span face=&quot;&quot; style=&quot;background-color: white; color: #202122; font-family: &amp;quot;nimbus roman no9 l&amp;quot;, &amp;quot;times new roman&amp;quot;, times, serif; font-size: 16.52px; white-space: nowrap;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;i style=&quot;background-color: white; color: #202122; font-family: &amp;quot;nimbus roman no9 l&amp;quot;, &amp;quot;times new roman&amp;quot;, times, serif; font-size: 16.52px; white-space: nowrap;&quot;&gt;c&lt;/i&gt;&lt;sup style=&quot;background-color: white; color: #202122; font-family: &amp;quot;nimbus roman no9 l&amp;quot;, &amp;quot;times new roman&amp;quot;, times, serif; font-size: 13.216px; line-height: 1; white-space: nowrap;&quot;&gt;&lt;i&gt;n&lt;/i&gt;&lt;/sup&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;sup style=&quot;background-color: white; color: #202122; font-family: &amp;quot;nimbus roman no9 l&amp;quot;, &amp;quot;times new roman&amp;quot;, times, serif; font-size: 13.216px; line-height: 1; white-space: nowrap;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/sup&gt;&lt;/div&gt;You can probably very easily write a computer program that will iterate over the values for &lt;span style=&quot;font-family: courier;&quot;&gt;a&lt;/span&gt;,&lt;span style=&quot;font-family: courier;&quot;&gt;b&lt;/span&gt;,&lt;span style=&quot;font-family: courier;&quot;&gt;c&lt;/span&gt; and &lt;span style=&quot;font-family: courier;&quot;&gt;n&lt;/span&gt; and check if the equation is true or not. Will this computer program ever stop? It will only stop if the Fermat&#39;s Last Theorem is false. Today we know that it will run indefinitely, but would you say the same thing in 1980s?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, this is an imperfect example since Fermat&#39;s Last Theorem turned out to be provable (although there was a dispute on whether it may be unprovable), but it shows the complexity of deciding the halting problem even for very obvious and small computer programmes.&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;What about physics?&lt;/h4&gt;&lt;div&gt;You may also be a physicists and say: this whole thing is interesting, but I&#39;m a physicist so I&#39;m not interested in either the continuum hypothesis or the halting problem or undecidable problems. I&#39;m interested in figuring out how the universe works! I don&#39;t have a problem with a definition of &quot;truth&quot;. I can use the non-fuzzy parts of mathematics.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My immediate response to it is: you&#39;re kind of right, but you&#39;re also in denial and by now you should know better. Don&#39;t worry though, I also have a longer response for you too!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Take a look at this actual theorem called the Banach-Tarski theorem:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Given a solid ball in 3‑dimensional space, there exists a decomposition of the ball into a finite number of disjoint subsets, which can then be put back together in a different way to yield two identical copies of the original ball.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;To put it in ever simpler terms: you can divide the ball in a couple of parts and then put them back together to make two identical balls. You can multiply balls. To infinity.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you&#39;re a physicist you probably know that it cannot be done in the real world&amp;nbsp; - conservation of mass, along with many other laws of the universe, forbids it. However, it is true in mathematics. So how does this happen?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, the most straightforward explanation is that the three dimensional space used in mathematics is not the same as the one in the real world. It&#39;s not surprising, since the three dimensional mathematical space doesn&#39;t really have a concept of an atom or any other discrete particle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So there is a mathematical theorem about the fundamental physical model - space - that is not really true in physics. At least not true in any practical sense and contrary to some of the physical laws. That would seem to suggest that there&#39;s a disconnect between &quot;physical (i.e. practical, measurable) truth&quot; and the &quot;mathematical truth&quot; even though physics uses mathematics for its research. I hope that gets you out of your denial.&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;What does it all have to do with objective truth and 2+2?&lt;/h4&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;i&gt;WARNING: this is where the more more opinionated part starts.&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;There seems to be no wide-reaching, Objective Truth in mathematics. There will never be one. There is truth within the constraints of a specific model. This model tries to correspond to reality as much as possible but it will never be intuitively or objectively true, because the very foundations - axioms - cannot be intuitively true and, what is even worse, even if they were, they wouldn&#39;t be able to prove everything. It will always escape the reality in some sense.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;However, we all agreed on a set of rules and a set of facts from which we create the wonderful, messy, complex, sometimes frustrating world of numbers, sets, functions, arrows (I believe the alternative name for &quot;arrows&quot; is &quot;category theory&quot;?) and more. This is not bad, as long as we know that what we construct in mathematics is just that - our own constructions based on our own, flawed, imperfect intuition and perception.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;To stir the whole objective truth mess a bit more mathematicians often play around with models that may be non-intuitive (e.g. non-Euclidean geometry) just so that they may see what interesting theories and properties arise. That brings us back to 2+2=4.&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Summary&lt;/h4&gt;&lt;div style=&quot;text-align: left;&quot;&gt;When it comes to a statement &quot;0 is a natural number&quot; there seems to be disagreement on how we want to model it and people are challenging either approach by presenting their opinions. &lt;i&gt;Opinion&lt;/i&gt; is being the key word here - there is no objective truth to that statement, just arguments one way or the other.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When it comes to the continuum hypothesis it&#39;s even less clear - we don&#39;t have good idea how our brain wants to model the continuum hypothesis. That&#39;s ok though - we know that our models have to be incomplete and are based on how our brain perceives the world, which sometimes fails us.&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;This is, at least to me, the core of the issue - 2+2 is equal to 4 not because it&#39;s&amp;nbsp;&lt;b&gt;The Objective Truth&lt;/b&gt;, but because it&#39;s how our human brains want to model the world around us&amp;nbsp;&lt;i&gt;and&lt;/i&gt;&amp;nbsp;because no one has a good reason to challenge it. If you ask me why we cannot say that 2+2=5 I ask you back &quot;what additional interesting information would that provide?&quot; If the answer is &quot;none&quot; let&#39;s stick to 2+2=4.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Just in case you were wondering, after all these years, I moved from my firm &quot;yes, of course natural numbers exist&quot; position to &quot;maybe they do, maybe they don&#39;t, but it&#39;s fun to play with them&quot;. Maybe I&#39;ll come round one day.&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;hr /&gt;&lt;i&gt;Side note to the whole blog post&lt;/i&gt;&lt;/h4&gt;&lt;div&gt;&lt;i&gt;What I talk about here is basically a whole century of mathematics condensed into one small blog post. I didn&#39;t touch on other solutions to many of the problems presented here: multi-value logic, type theory, non-Peano arithmetic,&amp;nbsp;Church-Turing-Deutsch&amp;nbsp;principle, Tarski&#39;s definition of truth and many, many other ideas that were created during that time. What I presented to you is a condensed version of the mainstream, which doesn&#39;t show you the nuance, but hopefully scratches the surface enough for you, dear reader, to look through that scratch and discover the weird, wonderful world beneath it.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Also, if you enjoyed this blog post and want to here more about the foundations of mathematics and computer science let me know on Twitter (&lt;a href=&quot;https://twitter.com/maldr0id&quot;&gt;@maldr0id&lt;/a&gt;).&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://maldr0id.blogspot.com/2020/08/mathematics-objective-truth-and-why-224.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-8127915906468900763</guid><pubDate>Sun, 25 Feb 2018 22:29:00 +0000</pubDate><atom:updated>2018-02-25T22:29:47.140+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">communication</category><category domain="http://www.blogger.com/atom/ns#">firmware</category><category domain="http://www.blogger.com/atom/ns#">hardware</category><title>Environmently friendly reverse engineering</title><description>When I moved to my new apartment I discovered a lot of old, mostly networking-related, equipment that I was meaning to either sell or throw out, but I never got to it. Recently I also bought an Arduino and decided to learn something about a lower level of reverse engineering (e.g. &lt;a href=&quot;https://github.com/Riscure/Rhme-2016&quot;&gt;the CTF binaries from RHme 2&lt;/a&gt;). This two things combined mean it&#39;s time for some router reverse engineering!&lt;br /&gt;
&lt;br /&gt;
A word of warning: before I started playing with low level RE I didn&#39;t know anything about electronics. If you have some experience with hardware hacking, this post may be a bit too basic.&lt;br /&gt;
&lt;h3&gt;
Typing random numbers into a search bar&lt;/h3&gt;
My victim is the Edimax EW-7206APg wireless router. The very first thing to do is to remove the screws and look around the PCB (yes, I know that the lighting is horrible).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc8CkuDYEsv7QkamEX73qcQ2oHgFaFbHkkdO50RGo8To4fBojUhV80XVwVwFq9Q1ZbhnNMunHHLc7G6WI-fMaCZRLJ0CPQvqCpTU2UaLUo9FW66pKfOFrmBsQWUeEn-wsdNhrMFBHm1Is/s1600/pcb.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;600&quot; data-original-width=&quot;800&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc8CkuDYEsv7QkamEX73qcQ2oHgFaFbHkkdO50RGo8To4fBojUhV80XVwVwFq9Q1ZbhnNMunHHLc7G6WI-fMaCZRLJ0CPQvqCpTU2UaLUo9FW66pKfOFrmBsQWUeEn-wsdNhrMFBHm1Is/s640/pcb.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
As you can see there&#39;s a huge chip in the middle of the board and some additional smaller ones to the left and next to the Ethernet port. They all have markings, so obviously my first instinct was to find their datasheets. The chips are:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;RTL8186&lt;/span&gt; -&amp;nbsp;system-on-a-chip (SoC) with integrated 32-bit MIPS core (aka &quot;cpu&quot;)&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;PSC A2V64S40CTP&lt;/span&gt; - 64 Mb SDRAM chip (aka &quot;memory&quot;)&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;MX29LV160CBTI70G&lt;/span&gt; - 2MB flash memory (aka &quot;flash&quot;)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;RTL8201CP&lt;/span&gt; - single-chip, single-port 10/100M fast Ethernet phyceiver (coincidentally, if you wonder what &quot;phyceiver&quot; is&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/PHY_(chip)&quot;&gt;Wikipedia article&lt;/a&gt;&amp;nbsp;prominently features a picture of this exact chip)&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;TS6121CX&lt;/span&gt; -&amp;nbsp;10/100 Base-T Ethernet isolation transformer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Multimetering UART&lt;/h3&gt;
&lt;div&gt;
Nothing too unusual, but we now know where are the cpu, flash and memory chips. Next, there are four pins that look suspiciously like UART - a serial interface used to debug PCBs. Fortunately the pins are soldered on so I can just connect cables to them. There are four pins, so the first order of business is to decide which pin does what. The possibilities are:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;TX - used to send data&lt;/li&gt;
&lt;li&gt;RX - used to receive data&lt;/li&gt;
&lt;li&gt;GND - ground&lt;/li&gt;
&lt;li&gt;Vcc - power&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Now, in order to find those all you need is a multimeter or a cheap logic analyser.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Let&#39;s start with a multimeter and use it as a (very) poor-man oscilloscope. First of all, GND is fairly easy to find. If the multimeter supports continuity measurements, you have to find ground near the DC connector - this is were one of the probes will be attached. Second probe goes to every pin and when the multimeter shows continuity you have your ground. Once you have GND, connect your ground probe to it and a second probe to one of the remaining pins. Set your multimeter to voltage measurement. All other pins have the following, different, characteristics:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Vcc - will be a constant voltage, around 3.3V in the case of this router.&lt;/li&gt;
&lt;li&gt;TX - will be pulled up (= Vcc) with occasional changes in the voltage. Even my cheap multimeter was fast enough to show those changes.&lt;/li&gt;
&lt;li&gt;RX - will be &quot;floating&quot;, which means that the current will be close to 0V, but not exactly 0V. Either way, it&#39;s the only pin with a pretty low voltage all the time.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
If you want to use logic analyser, you can get a very cheap one (~10 quid) and connect it to the open source &lt;a href=&quot;https://sigrok.org/&quot;&gt;sigrok software suite&lt;/a&gt;. Once you set up all four channels you&#39;ll get something like this:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_uJMJnl0Lqofqfz0nLjfXqMx38Z-8racBXG3xdNHniqjuu1L9uB5ymUwOXAPq0F0ZnfwZtIuA3bd9f71PUixRyzpgaNGHQCTn2iEAN97x6K_mmbZTWK9wdBf68NXM-cnOYbeUgBN5NZA/s1600/pulseview.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;191&quot; data-original-width=&quot;786&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_uJMJnl0Lqofqfz0nLjfXqMx38Z-8racBXG3xdNHniqjuu1L9uB5ymUwOXAPq0F0ZnfwZtIuA3bd9f71PUixRyzpgaNGHQCTn2iEAN97x6K_mmbZTWK9wdBf68NXM-cnOYbeUgBN5NZA/s1600/pulseview.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now it&#39;s fairly obvious what is going on:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;D0 is Vcc (always 1)&lt;/li&gt;
&lt;li&gt;D1 is RX (mostly 0)&lt;/li&gt;
&lt;li&gt;D2 is GND (always 0)&lt;/li&gt;
&lt;li&gt;D3 is TX (some data is being transmitted)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Serial console straight out of hacker movies&lt;/h3&gt;
&lt;div&gt;
We have all that information so it&#39;s time to connect router to the UART-USB cable (or just go for an overkill and use Arduino for it). The last thing left is the baud rate. I wanted to use logic analyser to figure it out, but after a failed attempt I just went with a &quot;Numberwang&quot;-style &quot;guess the baud rate&quot; game until I saw something in the console that looked like text. If you don&#39;t want to play, the answer is 38400.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Anyhow, by using the wonderful &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;picocom&lt;/span&gt; tool I was able to read the serial port and, after a boot sequence, I was welcomed with this rather nice looking screen (colour scheme was chosen by me to enhance the hacking factor).&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5MsEUtb-HyJ0ocibyB91QUkM2m3uOnJoNNETjWqZl7Dxesaj4qxqAjfwF9mB7urHK8rR6DhBQVMee-XUskUB2dIwqQEcrZ-H0HauLIu73NVP88n7OdkbhjUJWyUXMnGyzJd3IkT3d8y0/s1600/username.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;346&quot; data-original-width=&quot;703&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5MsEUtb-HyJ0ocibyB91QUkM2m3uOnJoNNETjWqZl7Dxesaj4qxqAjfwF9mB7urHK8rR6DhBQVMee-XUskUB2dIwqQEcrZ-H0HauLIu73NVP88n7OdkbhjUJWyUXMnGyzJd3IkT3d8y0/s1600/username.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Bad news is that the usual username/password combinations didn&#39;t work. I didn&#39;t want to download a firmware and disassemble it, because that would be cheating, instead I wanted to see if I can get the correct credentials from the router itself.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Before that rather lovely screen there was a booting sequence, which could be interrupted by pressing the escape key. When I did I was welcomed with a following prompt:&lt;/div&gt;
&lt;div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;---Escape booting by user&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;RealTek&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div&gt;
Hmmm... some kind of shell. Typing &quot;help&quot; revealed a list of commands, but without any explanation:&lt;/div&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;HELP (?)     : Print this help message&lt;br /&gt;D &amp;lt;Address&amp;gt; &amp;lt;Len&amp;gt; &lt;br /&gt;EW &amp;lt;Address&amp;gt; &amp;lt;Value1&amp;gt; &amp;lt;Value2&amp;gt;... &lt;br /&gt;EH &amp;lt;Address&amp;gt; &amp;lt;Value1&amp;gt; &amp;lt;Value2&amp;gt;...&lt;br /&gt;EB &amp;lt;Address&amp;gt; &amp;lt;Value1&amp;gt; &amp;lt;Value2&amp;gt;...&lt;br /&gt;EC &amp;lt;Address&amp;gt; &amp;lt;Value1&amp;gt; &amp;lt;Length&amp;gt;...&lt;br /&gt;CMP: CMP &amp;lt;dst&amp;gt;&amp;lt;src&amp;gt;&amp;lt;length&amp;gt;&lt;br /&gt;IPCONFIG:&amp;lt;TargetAddress&amp;gt;&lt;br /&gt;J: Jump to &amp;lt;TargetAddress&amp;gt;&lt;br /&gt;FLW: FLW &amp;lt;dst&amp;gt;&amp;lt;src&amp;gt;&amp;lt;length&amp;gt;&lt;br /&gt;FLR: FLR &amp;lt;dst&amp;gt;&amp;lt;src&amp;gt;&amp;lt;length&amp;gt;&lt;br /&gt;LOADADDR: &amp;lt;Load Address&amp;gt;&lt;br /&gt;AUTOBURN: 0/1&lt;/span&gt;&lt;div&gt;
&lt;br /&gt;&lt;div&gt;
After a bit of Internet searching I found a command line reference for the RealTek bootloader. Two particularly interesting commands are:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;D &amp;lt;Address&amp;gt; &amp;lt;Len&amp;gt; &lt;/span&gt;- print the &quot;Len&quot; bytes starting at &quot;Address&quot; as a hexdump&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;FLR &amp;lt;dst&amp;gt;&amp;lt;src&amp;gt;&amp;lt;length&amp;gt;&lt;/span&gt; - read &quot;length&quot; bytes from flash memory starting from &quot;src&quot; and copy them to RAM starting at &quot;dst&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Now, these two commands can be used to read the whole flash memory. From the flash memory datasheet we know that it holds 2MB, which is further confirmed by the log message during the boot process:&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Found 1 x 2M Byte MXIC MX29LV160AB at 0xbe000000&lt;/span&gt;&lt;/blockquote&gt;
We also know where to write the flash memory:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Jump to image start=0x80300000...&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3&gt;
TFTP and a firmware dump&lt;/h3&gt;
This is all fine, but parsing a hexdump is not my favourite thing to do. There&#39;s another hidden feature of the RealTek bootloader: tftp get. Bootloader uses a tftp protocol to get a new firmware image. You can just send it using the PUT command. However, it also supports the GET command so that you can download a firmware image. How convenient! When the tftp IP is set up using the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;IPCONFIG&lt;/span&gt; command GET results in the following lines in the serial console:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;File Start: 80300000,length=00000000&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;**TFTP GET File test.bin,Size 00000000 Byte&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;-&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;*TFTP Client Download Success! File Size = 00000000 Bytes&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;.Success!&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
So the downloaded file will start from the 80300000 offset in the memory. Now the only thing left is to load flash into that offset:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;FLR 80300000 0 200000&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Another tftp get and we get the firmware dump. The only thing to remember is to switch the tftp mode to binary. Otherwise you will lose a couple of hours trying to debug the Edimax firmware file format and wanting to throw your laptop out of the window...&lt;br /&gt;
&lt;br /&gt;
Now we just use &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;binwalk&lt;/span&gt; with very useful &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;-Mre&lt;/span&gt; options to extract everything from the firmware image. Binwalk output on the dump file shows this:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;DECIMAL&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HEXADECIMAL&amp;nbsp; &amp;nbsp; &amp;nbsp;DESCRIPTION&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;--------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;5424&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x1530&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CRC32 polynomial table, big endian&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;6816&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x1AA0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gzip compressed data, maximum compression, from Unix, last modified: 2005-06-06 03:22:10&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;65536&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x10000&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CSYS header, big endian, size: 65536&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;93204&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x16C14&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;gzip compressed data, maximum compression, from Unix, last modified: 2006-04-24 04:18:31&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;738779&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0xB45DB&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Zlib compressed data, best compression&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1005933&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0xF596D&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Zlib compressed data, best compression&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1030794&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0xFBA8A&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Zlib compressed data, best compression&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1058027&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x1024EB&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Zlib compressed data, best compression&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If you compare it to the firmware updates, you can see that there&#39;s a section right before 0x10000 that doesn&#39;t appear in updates. Just a quick look at strings in that part confirms that it&#39;s the RealTek bootloader. Then you have the squashfs file system at 0x16C14.&lt;/div&gt;
&lt;br /&gt;
A simple grep through everything extracted with &quot;User Name&quot; as argument will find only one file on that file system:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;squashfs-root/bin/setup&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
So this is probably the file where we can find the serial console (or rather Busybox) credentials. When you enter a wrong login/password you get this message:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB2hMKK0fLig2rtX7mlWNJm8lDWd_ZeZYdhTb0svdwVAJlpWQXzhV6OT_kiOfBvxKgv8iCf5JObcnLea2bx3TmUyOZlUnGZCwaP_eAGLArb_2N61p4p01B6a3QDYDPu5pE2TKxChV-P3Q/s1600/error.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;319&quot; data-original-width=&quot;564&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB2hMKK0fLig2rtX7mlWNJm8lDWd_ZeZYdhTb0svdwVAJlpWQXzhV6OT_kiOfBvxKgv8iCf5JObcnLea2bx3TmUyOZlUnGZCwaP_eAGLArb_2N61p4p01B6a3QDYDPu5pE2TKxChV-P3Q/s1600/error.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Hence the first thing to do will be to find that set of strings in the binary and cross reference it with the code. The code at 0x400838 is the one responsible for creating this very nice message. Following the cross references it&#39;s easy to see that 0x400CF8 is the subroutine responsible for validating user name and password.&lt;br /&gt;
&lt;br /&gt;
Now, I&#39;m not well versed in the MIPS instruction set, but fortunately it&#39;s a rather simple one. The most important parts of the subroutine are:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;0x00400d40&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;addiu a3, a3, 0x7a00 ; &quot;super&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;0x00400d44&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lb&amp;nbsp; &amp;nbsp;v0, (a3)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;!--StartFragment--&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;0x00400d50&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb&amp;nbsp;&amp;nbsp;&amp;nbsp;v0,&amp;nbsp;0x20(sp)&lt;!--EndFragment--&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;...&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;0x00400db4&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;addiu a1, sp, 0x20&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;0x00400db8&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;addiu a2, zero, 5&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;0x00400dbc&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lw&amp;nbsp; &amp;nbsp;t9, -0x7ed4(gp)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;0x00400dc0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jalr t9&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
First v0 holds the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;super&lt;/span&gt; string (that&#39;s what&#39;s at the 0x7a00 lower bytes address). Then a subroutine is called with parameters a0 (= the value entered as &quot;User Name&quot;), a1 (= &quot;super&quot;) and a2 (= 5). That subroutine just does a simple comparison between a2 characters of the first two arguments. This way we have the proper &quot;User Name&quot;.&lt;br /&gt;
&lt;br /&gt;
The password part is the really fun part. If we follow all other calls to that string compare function we will find three more: two that compare the password part to &quot;go&quot; and one that compares it to &quot;linux&quot;. This is done presumably to &quot;obfuscate&quot; the password so that it doesn&#39;t show up when you run the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;strings&lt;/span&gt; command on the binary. Additionally there&#39;s this check before all the string compare calls (v1 contains a string that user entered as &quot;Password&quot;):&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;0x00400de8&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;addiu v0, zero, 0x40 ; &#39;@&#39;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;0x00400dec&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;addiu a1, sp, 0x18&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;0x00400df0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;beq&amp;nbsp; v1, v0, 0x400e2c&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Your homework is to patch the password given all this information ;)&lt;br /&gt;
&lt;br /&gt;
Finally, after entering proper credentials we get a Busybox shell:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;# sh&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;BusyBox v1.00-pre8 (2005.11.23-10:23+0000) Built-in shell (ash)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Enter &#39;help&#39; for a list of built-in commands.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
P.S. If you want to try the software reverse engineering part yourself, you can download a firmware from &lt;a href=&quot;http://www.edimax.com/edimax/download/download/data/edimax/global/download/for_home/home_legacy_products/home_legacy_access_points/ew-7206apg&quot;&gt;the Edimax website&lt;/a&gt;. Then just follow along with the blog post starting at the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;binwalk&lt;/span&gt; command.&lt;br /&gt;
&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2018/02/environmently-friendly-reverse.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc8CkuDYEsv7QkamEX73qcQ2oHgFaFbHkkdO50RGo8To4fBojUhV80XVwVwFq9Q1ZbhnNMunHHLc7G6WI-fMaCZRLJ0CPQvqCpTU2UaLUo9FW66pKfOFrmBsQWUeEn-wsdNhrMFBHm1Is/s72-c/pcb.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-8534849396491650471</guid><pubDate>Sat, 26 Mar 2016 13:30:00 +0000</pubDate><atom:updated>2016-05-09T23:56:40.904+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">OWASP</category><title>How one company implemented (almost) whole OWASP Top 10</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
During one of my talks I was presenting OWASP Top 10 to students, who were interested in software development. One of them said that OWASP Top 10 is irrelevant in today&#39;s world, because there are frameworks with built-in security safeguards and everyone uses them. Unfortunately, I didn&#39;t have any real-world examples prepared and couldn&#39;t provide them on the spot. Not long after I received a spam message with an ad for some new auction portal. Out of curiosity I went there (if you check links in your spam folder you may end up with some interesting findings, right?) and looked around.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
To my horror, the more I clicked the more vulnerable the portal seemed. I was able to find so many problems with it, that I dismissed it as a failed attempt at building a website made by a single developer, who wanted to play in &quot;the big game&quot;. Some time after that event I received a spam for different auction portal, which had the same problems. Soon enough, with a help from my friend, I found the company (&lt;a href=&quot;http://jmlnet.pl/&quot;&gt;JMLNet&lt;/a&gt;) that - oh, really - sold and deployed this auction portal. It was a product and was sold for a price ranging between 150 to 350 euros. Not much, and I guess you get what you pay for.&lt;/div&gt;
&lt;h3&gt;
The problems&lt;/h3&gt;
&lt;div&gt;
First thing I did was to search for something. So I wrote the word &quot;test&quot;, clicked on &quot;search&quot; and to my amusement this was the link that I was sent to:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;img alt=&quot;SQL Injection w serwisie firmy JMLnet&quot; src=&quot;https://zaufanatrzeciastrona.pl/wp-content/uploads/2016/02/owasp_a1_2.png&quot; /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
That base64-encoded parameter looks interesting, doesn&#39;t it? It decodes to:&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp;AND (p.tytul LIKE &#39;%test%&#39;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Which is a part of an SQL query. Well, this probably (I didn&#39;t test it of course) means that we have the master of all SQL injections - basically, a free access to the database. (btw. did you notice the space at the beginning of the decoded SQL? ;)&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
At this point I decided to click some more and just go through a website to see if there are any other obvious security problems. Mind you, I wasn&#39;t even trying to find them, I was acting like a normal user. Sure enough, this came along:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;img alt=&quot;XSS w serwisie aukcyjnym JMLnet&quot; src=&quot;https://zaufanatrzeciastrona.pl/wp-content/uploads/2016/02/owasp_a3_1-580x147.png&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
As you can see the message displayed on the website and the &quot;info&quot; value are the same. Coincidence? No, not all. In fact whatever was in the &quot;info&quot; value was copied over to the website and rendered in HTML. Like, a message that user isn&#39;t logged in (as above) or a javascript that send cookies to the malicious C&amp;amp;C server. All of that was one click away for a regular user.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So, I decided to create an account. When I clicked on a link I got redirected to this website:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;img alt=&quot;Open redirect w serwisie aukcyjnym JMLnet&quot; src=&quot;https://zaufanatrzeciastrona.pl/wp-content/uploads/2016/02/owasp_a10_1-580x28.png&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Again, we see the base64 encryption of what seems to be a redirect address. Of course, you can put any address you want in there. Why does it matter? Let&#39;s assume that a person receives a link saying: &quot;Want to buy this thing? Just log in using the link below:&quot;. Being a watchful user, he spots that indeed link is directing to the auction portal website. He goes in, log in (successfully) and get redirected to a phishing website which looks just like the login website but says &quot;your password is wrongt&quot;. Being used to mistype the password user tries again and gives credentials to the phishing website. This kind of error is called &quot;open redirect&quot;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
OK, now we&#39;ve registered, logged in and we&#39;ve got a session cookie. How does it look like, you may wonder? Here it is:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;user_id:username:MD5(password)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
What&#39;s wrong with it, you may ask? Well, first of all it doesn&#39;t have a session identifier. Just by stealing this cookie you may login whenever you want and stay logged in for as long as you want. Second thing is that the MD5 hash (MD5...) is not salted. Hence, guessing the password may be very easy. The fact that this cookie is sent with every request makes it easier to steal the hash of the password. Well, but you don&#39;t even need the password, do you? You can just log in using the password MD5. You probably don&#39;t even have to send POST login request to brute force password. Just try doing GET requests using different cookies and see if you&#39;re logged in.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Now let&#39;s get to the final and the most worrisome error. After creating a profile, user could upload his or her photo. This photo was saved on the server and available under the following name:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;MD5(file_contents) + . + original file extension&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Turns out that you can upload a file with any extension. For example, &quot;.php&quot;. This means that you have an arbitrary code execution on the server side.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Responsible disclosure&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
After finding all of that I decided to contact the developer. Here&#39;s the timeline for responsible disclosure:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;27.12.2015 – first contact, mentioned multiple vulnerabilities&lt;/li&gt;
&lt;li&gt;28.12.2015 – response asking for details, unsuccessful attempt at the PGP key exchange&lt;/li&gt;
&lt;li&gt;28.12.2015 – detailed information about the vulnerabilities&lt;/li&gt;
&lt;li&gt;29.12.2015 – JMLNet decides that they can fix the vulnerabilities and I can publish the description &quot;at the end of January&quot;&lt;/li&gt;
&lt;li&gt;05.02.2016 – I ask about the deadline and whether or not I can publish, no response&lt;/li&gt;
&lt;li&gt;11.02.2016 – I ask again, no response given&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
They released an update, but some of their clients still are vulnerable.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Oh, did I mention that they didn&#39;t use HTTPS at all? ;)&lt;/div&gt;
&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2016/03/how-one-company-implemented-almost.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-7480209850043899846</guid><pubDate>Wed, 30 Dec 2015 11:30:00 +0000</pubDate><atom:updated>2015-12-30T11:30:00.158+00:00</atom:updated><title>Three short cyberstories + bonus scam</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
Since we are in the holiday season, let me share three small cybersecurity related stories, which you can read by the fireplace with a hot cocoa in hand and laptop on your lap. Enjoy!&lt;br /&gt;
&lt;h3&gt;
The one where I don&#39;t (really) know my password&lt;/h3&gt;
&lt;div&gt;
My laptop shut down unexpectedly and didn&#39;t want to boot ever again, not even when asked nicely. Since it was only few months after the purchase, I decided to send it back to the shop for repairs. Now, you have to know something about me that might surprise you, as it&#39;s coming from a cybersecurity professional. I&#39;m a little bit paranoid. So, I decided to disconnect the hard drive and take it out from my laptop before sending it in. My paranoia also led me to create a long and complex firmware password for my drive. This is the point where all of my problems started, but I haven&#39;t realized it up until that unfortunate day.&lt;br /&gt;
&lt;br /&gt;
I first tried to connect the hard drive to my old computer. BIOS prompt popped up asking me for my password. Hey, that&#39;s a good sign, right? However, it turned out that for one reason or another, person developing BIOS decided that the user could only enter 8 characters in the password field. No more. After entering the ninth character computer let out an angry beep, presumably warning me that it won&#39;t allow a longer password. But my password had more characters! I decided to abandon that way and try another computer. Maybe the BIOS developer there was a bit more flexible on the password length.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I found a second computer and indeed, this time the BIOS had a longer password entry field. I enter my password and lo and behold it did not work. I tried again - still the same error message. I didn&#39;t want to become a definition of insanity, so I decided to ask for help. My colleague advised me to try and unlock the drive using an hdparm tool. So I happily tried (highly EXPERIMENTAL) hdparm option to unlock the hard drive and I entered my password again, this time in plain text as an hdparm parameter. It didn&#39;t work. I mean, come on, I see that I didn&#39;t make any mistake in the password, it&#39;s there on the monitor!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I browsed the Internet a little and found out that some older HDDs (though definitely not mine) lowercased the password before using it. I decided to give it a try, because all other ways failed and I just wanted to get access to the hard drive. I put in my password, all in lowercase, and finally it worked! So, apparently, another BIOS software engineer decided that she will lowercase the password before passing it to the hard drive. You know, to reduce the bruteforcing complexity. Just for fun...&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
The one where someone is tracking me (and it&#39;s not paranoia)&lt;/h3&gt;
&lt;div&gt;
I went to the Paris Google office for Botconf. If you&#39;re feeling jealous, you should - it was a great conference. I took with me my company&#39;s laptop with our Enterprise VPN Solution(TM) client installed. If you&#39;re wondering why I didn&#39;t take my computer, you&#39;ve put too much rum in your hot cocoa and you&#39;re not paying attention. Organizers provided us with a WiFi Internet. As you may now know, I&#39;m a little bit paranoid. Almost immediately after connecting to the WiFi I also connected to the VPN and I was happily browsing the Internet.&lt;br /&gt;
&lt;br /&gt;
At some point one of my friends decided to send me a file using Google Drive. I clicked on it and it downloaded almost instantly. At first, that didn&#39;t surprise me. After all, I was in the Google office, they should have a fast link to the Google Drive, right? Then I noticed something odd - Google (as in their services, not the actual people) seemed to know that I&#39;m in Paris. How could that be? I was using VPN after all and my company was in a whole other country.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now, the incredible connection speed to Google Drive started to feel a bit odd. My company definitely didn&#39;t have such a high speed connection. I decided to dig a little deeper. After a while, it turned out that the WiFi DHCP server has assigned two public IP addresses to my laptop - one for IPv4 and one for IPv6. Furthermore, I was connecting to Google services using the IPv6 protocol. Which, as it turned out, Enterprise VPN Solution (TM) did not support. Hence, my IPv6 traffic was leaking from the VPN connection. This explained all of the weird stuff that was happening.&lt;br /&gt;
&lt;br /&gt;
What is disturbing here is that you cannot simply tell which of the sites you&#39;re browsing are using IPv6 and which of them are using IPv4. Surprisingly, Android VPN client (from the same company) didn&#39;t have that problem. It simply turned off the IPv6 altogether.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I informed our administrator about the traffic leak and his answer was that &quot;it&#39;s not a leak, since you can turn off IPv6&quot; and &quot;you don&#39;t know what you&#39;re saying&quot;. To which one of my friends responded: &quot;password leak also isn&#39;t a leak, because you can always change password, right?&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4KGiKP0JqxRU_ra2Ol8q4-CCbVsgTb-EdZ-MeySHtkaGnl3hDq8tqoJ_-dNgj0rxEtuqR1653-A1oaaReeh-vgUhJm9T-UOAp0z6jGbX5eet-g21ScLXdI4FKY-l7o4XKqKgevS0ET7M/s1600/sam-ipv6.png&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4KGiKP0JqxRU_ra2Ol8q4-CCbVsgTb-EdZ-MeySHtkaGnl3hDq8tqoJ_-dNgj0rxEtuqR1653-A1oaaReeh-vgUhJm9T-UOAp0z6jGbX5eet-g21ScLXdI4FKY-l7o4XKqKgevS0ET7M/s320/sam-ipv6.png&quot; width=&quot;233&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;
The one where my new intercom becomes smarter&lt;/h3&gt;
I&#39;ve heard a lot of stories of accidental hacking of different IoT things: TVs, Blu-ray players etc. However, my story is about a different accidental hacking. I hacked my apartment&#39;s intercom by not being in my apartment when the repairman came. It was as simple as that.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
My apartment building has an intercom. A standard one, without any fancy video cameras, iris scans or whatever is in right now. It just lets you call any apartment, transmit voice and let someone in. You also can open the doors by typing a special code on the main unit. However, the old intercom tended to break really frequently. At some point, all of the apartment owners got together and decided it&#39;s high time to replace the old intercom system with a new one. You know, a top-of-the-line, but still in budget.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Few days after this decision, a technician came and replaced the main unit and also wanted to replace all of the receivers. However, he couldn&#39;t replace mine, because I simply wasn&#39;t at home. When I came back I noticed that my receiver was behaving weirdly. I could listen on to every single conversation happening on the intercom. No matter who was speaking, I could hear it. While I could hear conversations, I could not open the door. Repairman was so nice to leave his number on a card near my door, so I could call him at my earliest convenience. Which I of course did.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
When he came I asked him why I could hear every conversation. He replied: &quot;yeah, this is just a stupid analog receiver, it works like that. This new one is a smart one, it has electronics inside that pick up a correct caller and you only hear conversations addressed to you.&quot; So, instead of having an old, analog PBX-like solution, where all of the calls were switched to the right caller in the main unit, we now have a new and smart solution, where the main unit does nothing and the receiver decides whether to pick up the call or not. That&#39;s called the future...&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
BONUS: Paris scam with Louvre in the background&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
During the last day of my stay in Paris, I decided to sit on a bench, which had a beautiful view of the Louvre and to finish reading the &quot;Spam Nation&quot; by Brian Krebs (I highly recommend it if you haven&#39;t read it yet). So, I went through Jardin des Tuileries and sat opposite the Louvre pyramid. I took out my Kindle and a bottle of water from my backpack and sat admiring the stunning architecture. Then, out of nowhere, a young girl came to me asking if I speak English. I replied that I do and she asked me, using her broken English, to sign a petition. I decided not to. Despite her many, many appeals.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I started reading and a second young girl came to me and the conversation repeated itself. I firmly, but kindly refused to sign anything she had and I got back to the book. I started to immerse myself in the world of Russian pharma-spam when the third girl came to me and, again, asked me if I speak English and if I can sign a petition. OK, I now had enough. Three girls asked me to sign a petition during 10 minutes. I politely declined, again, and started to pack my things. Then the fourth girl came to me, as I was packing my stuff, to ask me the same set of questions.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
By now it was clear to me that it was some kind of scam. I was curious as to what this scam actually entails and where is the actual scamming part. So, I looked it up and apparently, young girls come to foreigners and ask them to sign some paper. Then, when someone signs it, they say that they just agreed to pay 10 Euros to help poor children or for some other made up cause. Since you provided your name and country of residency, you are now obliged to pay. People apparently do pay the money. Otherwise, if they start to put up a fight, the girl distracts you and her &quot;helper&quot; tries to steal your wallet. So, apart from being interrupted in the middle of an enticing read, you could also get scammed out of you money and documents.&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2015/12/three-short-cyberstories-bonus-scam.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4KGiKP0JqxRU_ra2Ol8q4-CCbVsgTb-EdZ-MeySHtkaGnl3hDq8tqoJ_-dNgj0rxEtuqR1653-A1oaaReeh-vgUhJm9T-UOAp0z6jGbX5eet-g21ScLXdI4FKY-l7o4XKqKgevS0ET7M/s72-c/sam-ipv6.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-2331605294585181890</guid><pubDate>Tue, 22 Sep 2015 09:30:00 +0000</pubDate><atom:updated>2015-09-22T19:21:12.376+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cryptography</category><category domain="http://www.blogger.com/atom/ns#">encryption</category><category domain="http://www.blogger.com/atom/ns#">ransomware</category><title>Using World War II techniques to fight ransomware</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
The best way to fight crypto-ransomware is to have backups. But what if you make backups once a month, but want to decrypt all of the new or modified files? Is it possible? Sometimes...&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Recently, I had a lot of &lt;a href=&quot;http://maldr0id.blogspot.com/2015/05/crystalline-cipher-and-cryptography.html&quot;&gt;encounters with cryptography&lt;/a&gt;. Additionally, this year marks the 70th anniversary of the end of the Second World War. Rather unusually, this two facts combined can help us fight ransomware. We will also learn something about different kinds of ciphers and their weaknesses.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Some versions of the crypto-ransomware use streaming cipher (usually RC4) to encrypt the files found on the victim&#39;s machine. However, they make a serious mistake that would get them in trouble if they were working in the Nazi&#39;s communication department. But first, let me tell you something about the idea behind the streaming ciphers.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Most symmetric streaming ciphers are using on the same idea. Based on the password provided by the user, encryption/decryption algorithm creates a keystream. It is a constant, pseudo-randomly generated stream of characters that will be used to encrypt the file. Next, that keystream is combined with the plaintext using the XOR operation. This operation has one very interesting property - it is self-inverting, which means that for every byte (or bit) x XOR x will be equal to zero. And zero is a neutral element of the XOR operation.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
After all of this math talk, have a look at the example. P1, P2, ..., Pn is a plaintext, C1, C2, ..., Cn is the ciphertext and K1, K2, ..., Kn is the keystream.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;P1 XOR K1 = C1&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;P2 XOR K2 = C2&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;...&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Pn XOR Kn = Cn&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Now, because x XOR x = 0 and x XOR 0 = x you can see that the following is true:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;P1 = P1 XOR K1 XOR K1 = C1 XOR K1&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;P2 = P2 XOR K2 XOR K2 = C2 XOR K2&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;...&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Pn = Pn XOR Kn XOR Kn = Cn XOR Kn&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;So, if we XOR the ciphertext with the keystream, we receive a plaintext. However, there is also one other interesting property, which is shown below:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;P1 XOR C1 = P1 XOR (P1 XOR K1) = K1&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;P2 XOR C2 = P2 XOR (P2 XOR K2) = K2&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;...&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Pn XOR Cn = Pn XOR (Pn XOR Kn) = Kn&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
But, if you know both the plaintext and the ciphertext, you can easily recreate a keystream. What is more, if you use the same keystream twice to encrypt two plaintexts P and P&#39;, we get:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;C1 XOR C&#39;1 = (P1 XOR K1) XOR (P&#39;1 XOR K1) = P1 XOR P&#39;1&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;C2 XOR C&#39;2 = (P2 XOR K2) XOR (P&#39;2 XOR K2) = P2 XOR P&#39;2&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;...&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;Cn XOR C&#39;n = (Pn XOR Kn) XOR (P&#39;n XOR Kn) = Pn XOR P&#39;n&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
OK, but what does it have to do with the World War II? Well, Nazis used a streaming cipher to encode some of the messages. Operators where ordered NOT to use the same keystream twice, because if the allies knew one of the messages (P) they could easily recreate the second one, because it&#39;s simply&amp;nbsp;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; text-align: center;&quot;&gt;C XOR C&#39; XOR P&lt;/span&gt;. Of course, some of the operators did disobey this order.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Some of the ransomware samples also did not obey this order. So, if ransomware encrypts every file with the same password and uses e.g. RC4, you can take one of the files in your backup, XOR it with the encrypted version and you&#39;ll have a keystream. With this keystream, you can decrypt all other files. Including the ones that were not present in your original backup.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
What if you don&#39;t have any backup to work with? You could still take some of the original Windows files (e.g. wallpapers, sample pictures etc.) and XOR them with the encrypted version and get the keystream that will allow you to decrypt all other files.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Of course, this is not a method that can be used always or for every ransomware. But it works. Trust me.&lt;br /&gt;
&lt;br /&gt;
P.S. This is the Computerphile video that inspired this post:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=yxx3Bkmv3ck&quot;&gt;https://www.youtube.com/watch?v=yxx3Bkmv3ck&lt;/a&gt;.&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2015/09/using-world-war-ii-techniques-to-fight.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-4849083079919901269</guid><pubDate>Mon, 27 Jul 2015 09:00:00 +0000</pubDate><atom:updated>2015-07-27T10:00:07.515+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">KLM</category><category domain="http://www.blogger.com/atom/ns#">Monty Python</category><category domain="http://www.blogger.com/atom/ns#">not-security</category><title>KLM&#39;s &quot;We&#39;ll keep you grounded&quot; Programme</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
If you&#39;re travelling by plane often, I&#39;ll bet at some point your flight got cancelled. However, have you ever:&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Had an un-cancelled flight?&lt;/li&gt;
&lt;li&gt;Had a flight cancelled, because of your power of bilocation?&lt;/li&gt;
&lt;li&gt;Had a customer service done via Twitter, but it still feels like it was done by fax?&lt;/li&gt;
&lt;li&gt;Was asked for a screenshot of a printed boarding pass?&lt;/li&gt;
&lt;li&gt;Had a ticket issued so badly by the airline that you have to go to check-in desk, so that the agent could sort it out?&lt;/li&gt;
&lt;li&gt;Had a flight where, after 3h delay and subsequent 1.5h in the plane on the ground, they didn&#39;t get any catering, because there wasn&#39;t enough time?&lt;/li&gt;
&lt;li&gt;Was asked to go to see the downtown, presumably just so that the Transfer Desk queue would disperse?&lt;/li&gt;
&lt;li&gt;Had all this problems during one trip?&lt;/li&gt;
&lt;/ol&gt;
If so, where did you travel via KLM?&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;Let&#39;s start from the beginning. I was supposed to have a simple itinerary: Warsaw to Amsterdam, then non-stop to Seattle. The same, but in reverse, for return. When I checked in I provided my e-mail address and my actual phone number. This was for use e.g. in an event of flight cancellation, get change or delay. Warsaw to Amsterdam was a peaceful and pretty run-of-the-mill kind of flight. I arrived in Amsterdam, I believe even few minutes before the plan. I get off the plane and I see that my flight has been delayed... 11.5 hours. But it still says &quot;proceed to gate D1&quot;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
If you&#39;ve been in the Schiphol airport and were travelling to the US, you probably now that this gate is actually a immigration pre-check. So I go through with the check and the nice gentleman informs me that my flight is severely delayed and I should go to gate and see if they have any other flights. So I go to the gate. There, a lady from Delta says that we should all go to the transfer desk. Just so you can visualize it, it took me 30 minutes to walk from the airplane to the D1 gate, then to the real gate, then to transfer desk. All while I could just go from the airplane to the transfer desk in a couple of minutes.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Anyhow, it was a good cardio exercise for every passenger. I&#39;m sure the 60-something lady walking alongside me would agree with that. Then a very nice KLM lady tells me that I should hit Amsterdam and be in the airport 2 hours before the delayed time. And she tells that to everyone. Go, see the city, don&#39;t stay here! Since I&#39;ve never been to Amsterdam I went at 10:30 to &quot;see the city&quot;. I also had to contact my hotel in Seattle to notify them about the delay.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Amsterdam is a really interesting city. Nice museums and a lot of wonderful architecture. However, after a couple of hours it started raining. Not much, but I didn&#39;t have an umbrella with me, so I decided to go to the airport early. And now the fun begins. I go through security with my boarding pass for the delayed flight. I just say that it&#39;s from a delayed flight. However, the flight is not on the departures list. So I go to the transfer desk (15 minute walk) and the nice lady over there says that my flight got cancelled in the morning and it was &lt;i&gt;never supposed to leave&lt;/i&gt; with this long delay. She was very curious as to where did we get the delayed information from. Apparently a lot of passengers are coming up every few minutes asking for a departure time for a flight to Seattle.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
She rebooked my tickets for the next day. Now I was travelling to Detroit first, and from there to Seattle. I had to contact the Seattle hotel again and ask them to change reservation dates. They were so nice that they did it for free! However, I still needed a place to stay in Amsterdam. But fear not! You just have to take another 15 minute walk to the baggage claim area, because the transfer desk cannot book you a hotel, they only have a button that can rebook your ticket.&lt;br /&gt;
&lt;br /&gt;
Walking to the baggage claim I was thinking about the nice 60-something lady and how she managed to walk the whole airport... again. Another KLM lady at the baggage claim arranged a night and meals in the hotel for me. I lost a day in Seattle, but gained a day in Amsterdam. So up until now it has been a pretty normal story, with just little quirks. Like the fact that I had to go to immigration &amp;nbsp;pre-check again the next day.&lt;br /&gt;
&lt;br /&gt;
In Detroit I had little precious time for transfer. So I went to the transfer desk to get my boarding pass, because the agent in Amsterdam was unable to print one, for whatever reason. So she prints a boarding pass, strikes out some information and scribbles something in the middle of it. I run to a gate and my boarding pass does not work. She tries it again and gets a red light again. So I say that I&#39;m from a cancelled flight and they let me in. Just like that. Wow, that was... weird and unexpected. Anyhow, I&#39;m on the flight.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
But the actual Monty Python-level absurdities began when I wanted to check-in for my return flight. I logged in and wanted to see when can I make my online check-in. Instead I saw a red box with &quot;Important information&quot; that my Amsterdam to Warsaw got cancelled. And it advised me to contact the customer support. Since their support was an international number, and I didn&#39;t feel like leaving my kidney in the US to cover the roaming fees, I decided to go and take alternate route. I saw that they do a customer support over Twitter. Yes, really. And the answer time is about 20 minutes! Well, that&#39;s somewhat fast considering the volume of people that they have to talk to.&lt;br /&gt;
&lt;br /&gt;
What I didn&#39;t expect was that 20 minutes does not apply to Direct Messages. There you have to multiply that time by two. You know, because other people cannot check the reply times on your DM. That&#39;s why I had to do a part of it publicly and, unfortunately, you had to witness it. But, what is even more surprising, is that they reply in 40-50 minutes EVERY SINGLE TIME. So it looks like this (not an actual conversation):&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;Hello, I have a problem with my flight&lt;/i&gt;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
(40 minutes later)&lt;i&gt; Hello! What&#39;s your problem?&lt;/i&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;My flight got cancelled for no apparent reason.&lt;/i&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
(50 minutes later)&lt;i&gt; Hello! Can you provide us with a booking reference?&lt;/i&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;&amp;nbsp;It&#39;s ABCD123.&lt;/i&gt;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
(45 minutes later) &lt;i&gt;Hello!&amp;nbsp;We&#39;ll look into this.&lt;/i&gt;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
(5 hours later) &lt;i&gt;Hello!&amp;nbsp;Thank you for your patience. The problem is solved.&lt;/i&gt;&lt;/blockquote&gt;
As you can imagine this is really frustrating. Especially if your flight got cancelled for no apparent reason and you don&#39;t know what to do. I also logged in to my Flying Blue account (frequent flyer program for Skyteam). I wasn&#39;t expecting what I saw there: they thought I missed my flight to Seattle. You know, that I&#39;m still in Detroit.&lt;br /&gt;
&lt;br /&gt;
So I contact them via DM on Twitter and tell them about the Flying Blue and cancellation. They ask me to elaborate, because, and get this, they think that they cancelled my Amsterdam to Warsaw, because I missed my flight from Detroit to Seattle. Read it again. Just to let it sink in.&lt;br /&gt;
&lt;br /&gt;
After 5 hours since my explanation (during which KLM website went from 22 minutes to &lt;i&gt;we answer every question in 18 minutes&lt;/i&gt;), they were able to reissue my ticket. They didn&#39;t provide any reason for cancellation, nothing. Just said &quot;you can now check-in online&quot;.&lt;br /&gt;
&lt;br /&gt;
Which I couldn&#39;t. Because the check-in system told me &quot;You cannot check-in for that flight online, use an automated kiosk at the airport&quot;. And I still hadn&#39;t had any Flying Blue miles for my Detroit to Seattle flight. So I write to them again and they tell me to send a screenshot of a a boarding pass that their agent printed for me at the transfer desk in Detroit. I think the customer support representative never wanted to work in the customer support. Instead, they wanted to be a lumberjack...&lt;br /&gt;
&lt;br /&gt;
Next day, I go to Seattle airport and try to check-in using kiosk. It says &quot;Go and see an agent&quot;. So I go to the agent, which tries to check me in using the same kiosk. It shows the same message. I&#39;m instructed to go to the &quot;Special services&quot; desk. The very nice lady from Delta tells me that my reservation is odd and she&#39;ll try to sort it out. Couple of minutes goes by and I have both my boarding passes in my hand and I&#39;m ready to fly home. I thought this will be the end of it. Nope.&lt;br /&gt;
&lt;br /&gt;
I arrive in Amsterdam and there&#39;s a pouring rain. Weather is just horrible. So, of course, my flight got delayed. 1 hour passes by. It got delayed again. Second hour passes by. And it got delayed again. After 3 hours they say they&#39;ll start boarding in a couple of minutes. However, they are also unloading our bags. We can see it from the window. To my amazement, they really did start boarding after few minutes.&lt;br /&gt;
&lt;br /&gt;
When the boarding was complete, our pilot informed us that we are waiting for our bags to be loaded. Yep, the same bags that were unloaded just before boarding and were sitting just besides our plane. However, the crew was nice enough and offered us a cookie. I didn&#39;t know that this is all that they will offer. After spending just 1.5 hours in the plane on the ground waiting for our bags to be loaded again, we were finally departing. Mind you, 1.5 hour is also the time of the flight.&lt;br /&gt;
&lt;br /&gt;
In the air, crew informed us that they will be no food served today. Not even for purchase. I guess they didn&#39;t have time to load it on board. If I knew it, I would take my cookie. When we finally landed in Warsaw (and besides, KLM, in English it&#39;s &quot;Warsaw&quot; not &quot;Warschau&quot; at least since 1945) I was just hoping that they didn&#39;t lost my luggage. After all, that&#39;s all that was left for them to screw up...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;TL;DR:&lt;/b&gt;&amp;nbsp;if you want to fly with KLM, consider Ryanair instead. Same quality, but cheaper!&lt;br /&gt;
&lt;br /&gt;
By the way, did you notice that they didn&#39;t use my phone number or e-mail for notifications even once during that whole ordeal?&lt;br /&gt;
&lt;h3&gt;
Epilogue&lt;/h3&gt;
I didn&#39;t get any miles for my Seattle to Amsterdam flight, because, again, they think I missed it. However, according to them, I didn&#39;t miss the flight from Amsterdam to Warsaw that followed it. I sent them the boarding pass. They replied after 9 hours. They asked for my full name. As is printed on the boarding pass...&lt;br /&gt;
&lt;br /&gt;
KLM also &lt;a href=&quot;https://twitter.com/KLM/status/625283768522309632&quot;&gt;thanked me for telling them not to use standard reply templates&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2015/07/klms-well-keep-you-grounded-programme.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-8297517777108894527</guid><pubDate>Mon, 25 May 2015 20:23:00 +0000</pubDate><atom:updated>2015-05-26T19:19:23.525+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cipher</category><category domain="http://www.blogger.com/atom/ns#">cryptography</category><category domain="http://www.blogger.com/atom/ns#">crystalline</category><title>Crystalline Cipher and cryptography snakeoil</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;https://twitter.com/martijn_grooten/status/601853559248801792&quot;&gt;Martijn Grooten on Twitter&amp;nbsp;&lt;/a&gt;&lt;a href=&quot;https://twitter.com/martijn_grooten/status/601853559248801792&quot;&gt;(with his signature sarcastic undertone) &lt;/a&gt;&lt;a href=&quot;https://twitter.com/martijn_grooten/status/601853559248801792&quot;&gt;posed a weekend challenge&lt;/a&gt; for anyone interested in cryptography: have fun with &lt;a href=&quot;https://crystalline.codeplex.com/&quot;&gt;Crystalline Cipher&lt;/a&gt; and show that it is fundamentally broken. Now, I&#39;ve met with Martijn only once, but from that meeting I gathered that he really loves mathematics, at least as much as I do, and has a great understanding of cryptography. This whole business with Crystalline &lt;a href=&quot;https://www.ietf.org/mail-archive/web/cfrg/current/msg06790.html&quot;&gt;started off with the discussion on irtf.org&lt;/a&gt;, when the cipher author was convincing everyone that he discovered the best cipher in the world. &amp;nbsp;But to Martijn, mailing list members and me the cipher has a smell of snakeoil. Since this weekend turned out to be rather free for me, I decided to have a go at cryptoanalysis.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Mind you, I&#39;m not in any way formally trained in cryptography. I&#39;ve had two one semester long cryptography courses - one from more mathematical standpoint and the other one from more technical standpoint. The most complex cryptographic thing that I can do is probably doing an RSA encryption using pen, paper and simple calculator. So, I&#39;m not in any way qualified to do cipher assessments and I don&#39;t know virtually anything on how to create ciphers. However, putting it the other way: if even I can see problems with a cipher, that means that there&#39;s something wrong with it.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Crystalline Cipher - the pitch&lt;/h3&gt;
&lt;div&gt;
In the words of an author:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;line-height: 19.0176963806152px;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;i&gt;Cystalline Cipher is an experimental new type of symmetric cipher. Designed to be as secure as a one-time pad, with cipher text randomness approaching (or exceeding) random sources based upon radioactive decay, Crystalline hopes to set a new standard in security.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
Well, there are several things wrong with this statements, and let&#39;s start with a little bit of history. If you heard about one-time pads just skip the next section (really, just skip it starting &lt;b&gt;from here...&lt;/b&gt;).&lt;br /&gt;
&lt;h4&gt;
One-time pads&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Is there a cipher that cannot be broken? Some of you may know that the answer to that question is &quot;yes&quot;. Nobody can break that cipher, not the NSA, not Five Eyes, not even all of the countries in the world combined. And &lt;a href=&quot;https://en.wikipedia.org/wiki/One-time_pad&quot;&gt;that cipher is called one-time pad&lt;/a&gt;. Basically the idea is that you randomly generate key which is the same length as the plaintext. Then, you combine the key with plaintext using XOR operation (or letter shifting if you&#39;re doing it on paper).&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Let&#39;s analyze this cipher and see what interesting properties it has. If you encrypt any message using a random key of the same length it&#39;s pretty easy to show that the result will be a random string. This is the most sought-after property of any cipher: truly random output, which does not (directly) depend on the plaintext. Of course, if you have the key, then you can decrypt the ciphertext. But if you have the wrong key, there isn&#39;t a way to know it. You can still try to decrypt a message and end up with a different message then the original. In case of the one-time pad you can end up with ANY message that you want, if you use the right key.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This is what (intuitively) makes this cipher mathematically unbreakable. So, why don&#39;t we all just use one-time pad and get rid of RSA, AES, RC4 and all the other ciphers? Because one-time pad is hugely impractical. You have to have key of the same length as the message you want to encode. This means that you have to find a secure way to transfer the key - which is the same length as the message. So, if you have that channel ready at all times, why not just transfer the message using that channel?&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Of course you can transfer the key beforehand. Some spy agencies did it. However, then you have to store the copy of that key with you and have it ready for encryption. Which again poses some threat of security violations - someone may steal it from you and decrypt you past messages. And when you try to encrypt file using one-time pad you have to have twice as much storage for it to work. So, that&#39;s why we use not &lt;i&gt;perfectly&lt;/i&gt; secure, but more practical solutions - AES, RSA and others.&lt;/div&gt;
&lt;h4 style=&quot;text-align: justify;&quot;&gt;
(... to here)&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So let&#39;s dissect the statements made by the author about the Crystalline cipher.&amp;nbsp;&lt;i style=&quot;line-height: 19.0176963806152px;&quot;&gt;Designed to be as secure as a one-time pad&lt;/i&gt;&lt;span style=&quot;line-height: 19.0176963806152px;&quot;&gt;&amp;nbsp;- well, clearly that means that there has to be a mathematical proof of it being unbreakable. Otherwise, it&#39;s just cheap marketing talk. These kind of statements always throw me off, because they prove that the author does not have the faintest idea about the profound role of one-time pad in the cryptography - the subject that he tries to represent.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;line-height: 19.0176963806152px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;line-height: 19.0176963806152px;&quot;&gt;Next&amp;nbsp;statement&amp;nbsp;-&amp;nbsp;&lt;/span&gt;&lt;i style=&quot;line-height: 19.0176963806152px;&quot;&gt;cipher text randomness approaching (or exceeding) random sources based upon radioactive decay&lt;/i&gt;&lt;span style=&quot;line-height: 19.0176963806152px;&quot;&gt;&amp;nbsp;- does also show that the author doesn&#39;t know what&#39;s he talking about. We currently&amp;nbsp;believe&amp;nbsp;that radioactive&amp;nbsp;decay is a&amp;nbsp;truly random process, hence you cannot claim that something is &quot;more&amp;nbsp;random&quot; without&amp;nbsp;annoying&amp;nbsp;many&amp;nbsp;physicists.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;line-height: 19.0176963806152px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;line-height: 19.0176963806152px;&quot;&gt;And now we come to these two statements, which are just hilarious:&lt;/span&gt;&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;line-height: 19.0176963806152px;&quot;&gt;&lt;span style=&quot;line-height: normal;&quot;&gt;&lt;i&gt;Unlike many ciphers, Crystalline operates on an entire file and does not require padding operations or compression.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;&lt;b style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; color: #253340; font-family: &#39;Segoe UI&#39;, Tahoma, Arial, Helvetica, sans-serif; font-size: 13.0080003738403px; line-height: 19.0176963806152px; margin: 0px; outline: 0px; padding: 0px; text-align: start; vertical-align: baseline;&quot;&gt;IMPORTANT SECURITY NOTE: Compress all files first&lt;/b&gt;&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;
Not only are they contradictory, but also there is a serious problem with your cipher if you are depended on compressing the data first.&lt;br /&gt;
&lt;br /&gt;
And lastly, I don&#39;t even know what this paragraph is about:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; color: #253340; font-family: &#39;Segoe UI&#39;, Tahoma, Arial, Helvetica, sans-serif; font-size: 13.0080003738403px; line-height: 19.0176963806152px; margin: 0px; outline: 0px; padding: 0px; text-align: start; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-weight: normal; line-height: 19.0176963806152px;&quot;&gt;&lt;i&gt;Crystalline employs information loss as the basis of its security. This is achieved by shifting the location of data at both a binary and byte level based upon a value provided by the key and salt. As such, the end result is a cipher text that reflects the relationships found in the key and salt, rather than the data. If the key and salt is from a true random source, such as atmospheric noise or quantum fluctuations, then no relationship should be present in the location of bits and bytes in the cipher text. By multiplying the key and salt, information about both sources is also lost.&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Crystalline Cipher - the algorithm&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
It&#39;s easy to make fun of marketing and buzzwords (look up &quot;APT&quot;), but let&#39;s go into more technical stuff. The algorithm looks rather simple. First you need values called &quot;key&quot;, &quot;salt&quot; and &quot;iv&quot;. First two are byte strings and the last one is integer. Then the cipher runs a number of &quot;rounds&quot; on plaintext. Each round is composed of two parts. Let&#39;s assume that &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;byte(a, i)&lt;/span&gt; means i-th byte of string modulo string length.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Part A (bit switch-shuffle part):&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;For every bit in the plaintext:&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Switch (negate) that bit value.&lt;/li&gt;
&lt;li&gt;Swap that bit (which is at position &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;i&lt;/span&gt;) with a bit whose position is &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;byte(key, i) * byte(salt, i)&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;div&gt;
Part B (byte shuffling part):&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;For every byte in the plaintext:&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Swap that byte&amp;nbsp;(which is at position&amp;nbsp;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;i&lt;/span&gt;)&amp;nbsp;with a byte whose position is &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;byte(key, i) * byte(salt, i)&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
And that&#39;s all. Number of rounds is determined using some values of key, salt and iv, but let&#39;s just assume (for the sake of simplicity) that it&#39;s just the iv value. That&#39;s an easy exercise to show that this assumption does not weaken the cipher in any way.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Crystalline Cipher - observations and weaknesses&lt;/h3&gt;
&lt;/div&gt;
&lt;h4&gt;
What&#39;s the key in this cipher?&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The author probably wanted to make &quot;key&quot; variable the actual key. However, if we take a closer look &quot;key&quot; is not used in its original form. Instead, we only use&amp;nbsp;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;byte(key, i) * byte(salt, i) &lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;value, which is the &quot;actual key&quot;. It is worth noting that if the length of key and length of salt is the same (as author recommends) the actual key is just a (byte-oriented) multiplication of that values. So there is no need to introduce &quot;salt&quot; value just to confuse the reader (or make it sound more scientific) and we can now assume that we have just a random key, which tells us which file positions to swap.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;This key actually has some&amp;nbsp;&lt;/span&gt;limitations&lt;span style=&quot;font-family: inherit;&quot;&gt;, which will be&amp;nbsp;&lt;/span&gt;discussed&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;later on.&lt;/span&gt;&lt;/div&gt;
&lt;h4&gt;
Is permutation a form of encryption?&lt;/h4&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
While this question may be weird at first sight, I&#39;ve never thought about it before this cipher. Of course permutation can make it &lt;i&gt;harder&lt;/i&gt; to read the text, but there&#39;s still &lt;b&gt;a lot to infer from a random permutation of plaintext&lt;/b&gt;. You can guess the language of the plaintext. You may guess some words, provided that the messages have a constant template, which is the case for many file formats and our e-mails (&lt;i&gt;Hi ..., ... Best regards, My Name&lt;/i&gt;). If the cipher is based mainly on permutation (as is the case with this one), there is a lot of information that can easily leak.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
But this is just all a hand-waving arguments, let&#39;s get to more serious flaws.&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;
The recommended key length: 16 KB + 16 KB&lt;/h4&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Author recommends key length of 16 KB (for &quot;key&quot;) and 16 KB (for &quot;salt&quot;). That&#39;s 32 KB in total. Yes, kilo&lt;b&gt;bytes&lt;/b&gt;. The largest key length in common use today that I was able to find is 4 Kb for RC4. That&#39;s &lt;b&gt;64&amp;nbsp;times&lt;/b&gt; smaller! This key overhead is really significant, especially if you&#39;re trying to encrypt small files.&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;
Every key produces different output, right?&lt;/h4&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
One of the most prominent features of one-time pad (or any good cipher) is the fact that different key produces different output. This is in fact really important, because if two (or more) keys produce the same result, we can reduce the key space to brute-force. This means that having a big key size can amount to nothing, because in fact you only have a handful of ciphertexts.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Let&#39;s see what the following key will do with the plaintext:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;2, 1, 4, 3, 6, 5, 8, 7, 10, 9, ...&lt;/span&gt;&lt;/blockquote&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So, the first bit will be negated and switch with the second one. Then it will be negated again and will get back at his original position. And so on... So, using that (seemingly proper) key, you&#39;ll get the same ciphertext as plaintext - no encryption at all. And, as you can prove yourself, this outcome does &lt;b&gt;not depend on the number of rounds&lt;/b&gt; used.&lt;/div&gt;
&lt;br /&gt;
Now, Do you know what will the following actual key will produce?&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&amp;nbsp;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;3, 4, 1, 2, 7, 8, 5, 6, ...&lt;/span&gt;&lt;/blockquote&gt;
Hmmm... I&#39;m wondering if there is a pattern. Maybe something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Choose any permutation &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;(p&lt;span style=&quot;font-size: xx-small;&quot;&gt;1&lt;/span&gt;, p&lt;span style=&quot;font-size: xx-small;&quot;&gt;2&lt;/span&gt;, ..., p&lt;span style=&quot;font-size: xx-small;&quot;&gt;n&lt;/span&gt;)&lt;/span&gt; of values &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1, ..., n&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;font-family: inherit;&quot;&gt;where &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; is the (even) key length.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Let the key&amp;nbsp;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;(k&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;, k&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;, ..., k&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace; font-size: xx-small;&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;)&lt;/span&gt;&amp;nbsp;be:&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;k(p&lt;span style=&quot;font-size: xx-small;&quot;&gt;2*i&lt;/span&gt;) = k(p&lt;span style=&quot;font-size: xx-small;&quot;&gt;2*i+1&lt;/span&gt;)&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;for &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;i = 1, ..., n/2&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;k(p&lt;span style=&quot;font-size: xx-small;&quot;&gt;2*i+1&lt;/span&gt;) = k(p&lt;span style=&quot;font-size: xx-small;&quot;&gt;2*i&lt;/span&gt;)&lt;/span&gt;&amp;nbsp;for&amp;nbsp;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;i = 1, ..., n/2&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;div&gt;
Hence, every permutation can produce a key that does nothing to the plaintext. That&#39;s &lt;b&gt;at least &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n!/2^(n/2)&lt;/span&gt; keys that will not encrypt the plaintext&lt;/b&gt;. Why &quot;at least&quot;? There are other keys that can do that, but I&#39;ll leave it as an exercise for you.&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h4&gt;
What happens over 64KB?&lt;/h4&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Since the actual key can only tell the algorithm to swap current index with index&amp;nbsp;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;byte(key, i) * byte(salt, i) &amp;lt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;65,025&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;so any bit (or byte) after 65,025 can only be swapped with bytes that come before that mark.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Hence &lt;b&gt;every bit over that mark will be negated&lt;/b&gt;. If you have odd numbers of rounds, this means that above some mark most of the bits will be negation of the plaintext bits. If you have even number of rounds, above some mark most of the bits will be actual bits of the plaintext. They may be at different places of the ciphertext though. And that leads us to the final question...&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h4&gt;
Is the ciphertext really, truly random?&lt;/h4&gt;
&lt;div&gt;
The author says it himself:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; color: #253340; font-family: &#39;Segoe UI&#39;, Tahoma, Arial, Helvetica, sans-serif; font-size: 13.0080003738403px; line-height: 19.0176963806152px; margin: 0px; outline: 0px; padding: 0px; text-align: start; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;line-height: 19.0176963806152px;&quot;&gt;&lt;i&gt;Thus, randomness in the ciphertext is a very strong indicator of strength in the cipher.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
And, as we saw in the previous question, it may not be true. Let&#39;s assume that we have really large (e.g. 1 GB) file filled with zeros. Using the observation that we made above, if we use 1 round of cipher, we will get a lot of ones. How much? Well, all of the zeros above 64Kb will get converted to ones, &lt;b&gt;no matter what key we will use&lt;/b&gt;. Of course, they can be in a different places in the file, but they still will be ones. That&#39;s approximately &lt;b&gt;99.9992% of the ciphertext filled with ones&lt;/b&gt;. That doesn&#39;t seem like &quot;random&quot; and certainly not &amp;nbsp;&lt;i style=&quot;line-height: 19.0176963806152px; text-align: justify;&quot;&gt;approaching (or exceeding) random sources based upon radioactive decay.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Summary&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I&#39;ve learned a lot playing with that simple and obviously broken cipher. I hope you learned a lot by reading about my journey. I&#39;d like to thank Martijn for the information about that cipher - it was just at the right level for me to learn some cryptoanalysis techniques and see how real ciphers should look like. Bottom line is that Crystalline Cipher looks like it started as a simple shuffle and then author applied patchwork at few steps to answer problems it posed to his cipher. I know that mindset from working on several projects and it is never, ever a good idea.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Anyhow, that&#39;s my weekend story for you!&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2015/05/crystalline-cipher-and-cryptography.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-4141856162879721716</guid><pubDate>Wed, 13 May 2015 10:00:00 +0000</pubDate><atom:updated>2015-05-13T21:35:47.328+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">encryption</category><category domain="http://www.blogger.com/atom/ns#">Mono</category><category domain="http://www.blogger.com/atom/ns#">ransomware</category><category domain="http://www.blogger.com/atom/ns#">Z3Core</category><title>Android malware goes Mono and Lua - part 2 (Ransomware)</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
In &lt;a href=&quot;http://maldr0id.blogspot.com/2015/03/android-malware-goes-mono-net-and-lua.html&quot;&gt;my last post&lt;/a&gt; I described an interesting malware family that used Mono and Lua virtual machines to obfuscate its behavior. Lately, it has been packed &lt;a href=&quot;https://www.virustotal.com/pl/file/c463f992a5004769cb806c8ce78430411e65102ee02f4996dca0e70ad0c6bd21/analysis/&quot;&gt;with new features and upgrades&lt;/a&gt;, which are meant as a forensic countermeasure. Let&#39;s examine these updates and see why this botnet is different from the other Android botnets.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Retrospective: Lua and .NET&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
But first, let me remind you how this malware is build. Diagram below shows one of the malware main components - SMS Broadcast Receiver.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDGhkl487Hb20HYkgUxW2sRLj132ZTsNgepLZaYIgxxpM8XYGVgTfKvYuHKofoMglv6Ie-xFjyCWs90XKaUNtXMT0KbnTfEyVhSG2EjNc2Bk2a5BeEWI38wdQRCNxMnH_kZhgiSDEkq14/s1600/z3core.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDGhkl487Hb20HYkgUxW2sRLj132ZTsNgepLZaYIgxxpM8XYGVgTfKvYuHKofoMglv6Ie-xFjyCWs90XKaUNtXMT0KbnTfEyVhSG2EjNc2Bk2a5BeEWI38wdQRCNxMnH_kZhgiSDEkq14/s640/z3core.png&quot; width=&quot;494&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
How does it work exactly? First, a BroadcastReceiver is registered in the AndroidManifest.xml file. This Broadcast Receiver, in its static initialization block, registers an n_OnReceive function &amp;nbsp;from a native library, libmonodroid.so, using a function call presented below.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxaleB9cxFdvPRehIftJY9Wh9yPfRmGZsRc3f4OfCAM7YGJWHUj4sSgCYS6mdhF9SSSt2oV2EplE0lPXAxeuSYasTCUd_1_kte9g4dHGkWoyQBA9rxrLwGBx5igX9bIiJkrW9pdEN3m3g/s1600/z3core_register.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxaleB9cxFdvPRehIftJY9Wh9yPfRmGZsRc3f4OfCAM7YGJWHUj4sSgCYS6mdhF9SSSt2oV2EplE0lPXAxeuSYasTCUd_1_kte9g4dHGkWoyQBA9rxrLwGBx5igX9bIiJkrW9pdEN3m3g/s1600/z3core_register.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This call specifies the .NET function call which will be used for n_OnReceive (Z.Core.SMSReceiver), library which will be loaded (Leader.dll) and some other parameters. The Leader.dll is then loaded from libmonodroid_bundle_app.so, which contains a bunch of gzipped DLLs written for Monodroid VM.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So, essentially Broadcast Receiver code is passed on from Java to Mono. But that&#39;s not all! This call is then passed to the Lua Script called &quot;onSMS&quot;. This Lua script is run on the KopiLua VM. But this, and many other similar Lua scripts are not bundled with the APK. They are downloaded from the C&amp;amp;C and cached in a structure List&amp;lt;LuaScript&amp;gt;. They are not saved in the phone&#39;s file filesystem, instead they are downloaded each time the service (or phone) is restarted. This is different from the previous version which used Virtual File System to store Lua scripts.&lt;br /&gt;
&lt;br /&gt;
You can see the Lua caching and calling mechanism in the screenshot below.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG3c4YgIRd0V1UeNfWXgymy9oM-MvKeD-gzX4_2gQcNPgGzo5Hrgo4qBUznx2vG0UXiYFFQLiyf1hjZXfU9Ql-rzx7Su7Op4EJwSE_E8gNr0fitikpn2Q7qM0M3leUuowvWLy1G7ClQLA/s1600/z3core_lua_call.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG3c4YgIRd0V1UeNfWXgymy9oM-MvKeD-gzX4_2gQcNPgGzo5Hrgo4qBUznx2vG0UXiYFFQLiyf1hjZXfU9Ql-rzx7Su7Op4EJwSE_E8gNr0fitikpn2Q7qM0M3leUuowvWLy1G7ClQLA/s1600/z3core_lua_call.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
This approach - downloading Lua scripts from C&amp;amp;C - allows for a maximum flexibility and almost instantaneous change in attacker&#39;s goals. He can send Premium SMS or steal online banking OTP or do anything really, easier than when using standard RAT or backdoor.&lt;br /&gt;
&lt;h2&gt;
Retrospective: network communication&lt;/h2&gt;
&lt;div&gt;
This malware uses a special protocol over HTTP to communicate with the C&amp;amp;C server. In the Z.Core.Packets package (or whatever it&#39;s called in .NET) we can see several classes:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMKmnHquKN2qHMWEK3HR0g_6j0ujo7yRg42iB6IDBIjiXNenGGLOEdOZHRDwc5n-hcJQm8a1E7CBsSeNGhZgr0R5zXywTYLpEXQ1IwMG4lxpC2hRH9PzAvpM6Ztw0GndbIhYZqHlxxIz0/s1600/dotnet_packets.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMKmnHquKN2qHMWEK3HR0g_6j0ujo7yRg42iB6IDBIjiXNenGGLOEdOZHRDwc5n-hcJQm8a1E7CBsSeNGhZgr0R5zXywTYLpEXQ1IwMG4lxpC2hRH9PzAvpM6Ztw0GndbIhYZqHlxxIz0/s320/dotnet_packets.png&quot; width=&quot;203&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
These classes are responsible for creation of the messages that are then sent to the C&amp;amp;C server as a body of POST request. Each packet has an ID (which maps to a command) and then some parameters, if the command requires it. Supported commands are:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;1 - registration with IMEI and two countries (both values hardcoded to &quot;111&quot;)&lt;/li&gt;
&lt;li&gt;2 - bootstrap packet with AES key and IV, bot id&lt;/li&gt;
&lt;li&gt;3 - script packet with answer token, script content and md5 checksum&lt;/li&gt;
&lt;li&gt;4 - echo packet with token and text&lt;/li&gt;
&lt;li&gt;5 - &amp;nbsp;SMS received packets with message text and phone number&lt;/li&gt;
&lt;li&gt;6 - Contacts packet with a number of contacts and list of name and phone number pairs&lt;/li&gt;
&lt;li&gt;256 - get task packet with token&lt;/li&gt;
&lt;li&gt;12 - task done packet with token&lt;/li&gt;
&lt;li&gt;19 - set variable packet with variable name and value, used to set variables in Shared Preferences&lt;/li&gt;
&lt;li&gt;28 - version data packet with token and version data&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
What are tokens? Well, they are used to identify the bot.&lt;br /&gt;
&lt;br /&gt;
What does the typical communication look like? First, you have to register. You do this by sending registration packet (id = 1). In response, you&#39;ll get a XOR key. You have to randomly generate AES key and IV and send them to C&amp;amp;C encrypted with this XOR key. Now, all the following communication will be encrypted using this random AES key saved in the Share Preferences like so:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39; standalone=&#39;yes&#39; ?&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;map&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;string name=&quot;id&quot;&amp;gt;8683&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;string name=&quot;token&quot;&amp;gt;516c9d8a-95f4-4552-b549-abb398ec1a7c&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;string name=&quot;registered&quot;&amp;gt;OKAY&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;string name=&quot;adm&quot;&amp;gt;trux&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;string name=&quot;aesIV&quot;&amp;gt;H2DIQX2WW7qgU0nOyhf/LqN0EZCXtBcr5roevejKSVo=&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;string name=&quot;aesKey&quot;&amp;gt;18f7cyFDKPn3pdxRQCpT61C0U7qK8BnUkc/FaFvW7DI=&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;string name=&quot;lckd&quot;&amp;gt;false&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;/map&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;As &amp;nbsp;you can see we have bot id, token, registration status, Device Administrator status, AES IV and key (base64 encoded) and locked (ransomware) status. This last parameter will be described below.&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;
Attack scenario&lt;/h2&gt;
&lt;div&gt;
Every sample pretended to be some kind of popular app, like Skype or Twitter. Current version, after accepting the Device Admin privileges, uninstalls its shortcut. Then, we are only left with service running in the background. This service displays, after some time, notification shown below.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPSTqx8REZ5VKrls6nRjumc_La35WhVeJHN2AhKkc3il7IEqpna3cJ2ZFaxxkYAgHUVrSCvEHH816rxonIRUoO_hWvY-oBYhBuBRPOoq_a0BF-D0Czfow3Xxo6_2JU7ad5E5R3Chxnilg/s1600/dotnet_twitter.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;72&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPSTqx8REZ5VKrls6nRjumc_La35WhVeJHN2AhKkc3il7IEqpna3cJ2ZFaxxkYAgHUVrSCvEHH816rxonIRUoO_hWvY-oBYhBuBRPOoq_a0BF-D0Czfow3Xxo6_2JU7ad5E5R3Chxnilg/s320/dotnet_twitter.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
For those of you, who don&#39;t speak Russian, this means &quot;New Licence Agreement&quot;. When you click on it, this bogus licence agreement is shown:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyYLMrHkYyepsLPsZOkIxZk3YaLFw7t7LSyrwXVtI6cNC-SFEoKEm_ctjLpXk5erpUdTCc0WvyfNd96I9IUoMdL75MqFHzHlLSCe0Tx3tQF1gepnZm21quEXvFfctbrKELGDjuvrvbBdM/s1600/dotnet_terms_2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyYLMrHkYyepsLPsZOkIxZk3YaLFw7t7LSyrwXVtI6cNC-SFEoKEm_ctjLpXk5erpUdTCc0WvyfNd96I9IUoMdL75MqFHzHlLSCe0Tx3tQF1gepnZm21quEXvFfctbrKELGDjuvrvbBdM/s400/dotnet_terms_2.png&quot; width=&quot;252&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
If you scroll all the way down and click on &quot;Accept&quot; you are asked to provide your credit card details:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZE2L_SG30X0uuZwODv1apf3d8-_Zi2bU_q6bER6RAdCXwCxNcjQb6Ev3K00j_fxTA54lRRHIa8hye8Lpj7ncVOGRWb7qRq1zs93Q3KhBxP7K-MO0MuNM7rVoiAdugMqKlyUnAMPcUF3Q/s1600/dotnet_window_3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;210&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZE2L_SG30X0uuZwODv1apf3d8-_Zi2bU_q6bER6RAdCXwCxNcjQb6Ev3K00j_fxTA54lRRHIa8hye8Lpj7ncVOGRWb7qRq1zs93Q3KhBxP7K-MO0MuNM7rVoiAdugMqKlyUnAMPcUF3Q/s320/dotnet_window_3.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
So I was hit with a simple social engineering attack. There are layouts prepared for other types of social engineering attacks designed for banking apps or Chrome browser, but I was unable to invoke them and since this relies heavily on the C&amp;amp;C communication it may be hard to analyze them.&lt;br /&gt;
&lt;br /&gt;
However, as I mentioned before, we can imagine all sorts of attack with such a flexible architecture. What other attacks, you may ask. I&#39;m glad to show them to you.&lt;/div&gt;
&lt;h2&gt;
New features&lt;/h2&gt;
&lt;div&gt;
Newest sample can also lock your phone and demand ransom to be paid by sending funds to a prepaid phone number. This is done by displaying to you the following, rather nice looking, information:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMtMVmdNeCyi9sBWYTrZd79BS8NqHjMtZ3lNbnHLz7bwvxqLKaJ5_los-7HKiEXkNoysWxfRXRABlAg0j8BJPJQ0fgu-7wBNOJEHQQyrSMQlnj2Wbempr8Ep4vperdlBSy2kEWSXkHnow/s1600/dotnet_ransomware.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMtMVmdNeCyi9sBWYTrZd79BS8NqHjMtZ3lNbnHLz7bwvxqLKaJ5_los-7HKiEXkNoysWxfRXRABlAg0j8BJPJQ0fgu-7wBNOJEHQQyrSMQlnj2Wbempr8Ep4vperdlBSy2kEWSXkHnow/s320/dotnet_ransomware.png&quot; width=&quot;258&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
It says that because you viewed child pornography and bestiality you have to pay a fine of 500 rubles (~ 10 USD).&lt;br /&gt;
&lt;br /&gt;
Technicalities are rather similar to &lt;a href=&quot;http://maldr0id.blogspot.com/2014/10/android-ransomware-with-direct3d-dll.html&quot;&gt;other simple lockers&lt;/a&gt;: it periodically invokes the activity displaying the lock information and wants to irritate user so much that he will pay the fine. It&#39;s all implemented in the Mono code, snippet of which is shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwKl-IBNdJr0wk6UyyKZX19aL0iPgx50TCYstwhUrbXWUPkHXWVX-qvD1ZBUuYJ4UAUHcP9kf1led5IQzvRbJ5LhEf9aA2MvR76UnqAtBu-HDIuXDJ9FVHVPiUsyTGoSU7g4IrzhWK-uQ/s1600/dotnet_lock_code.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwKl-IBNdJr0wk6UyyKZX19aL0iPgx50TCYstwhUrbXWUPkHXWVX-qvD1ZBUuYJ4UAUHcP9kf1led5IQzvRbJ5LhEf9aA2MvR76UnqAtBu-HDIuXDJ9FVHVPiUsyTGoSU7g4IrzhWK-uQ/s640/dotnet_lock_code.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Another new &quot;feature&quot; is the fact that application has disabled logging mechanism, which makes it harder to analyze, but you can still enable this feature. If you can recompile .NET code. On Android.&lt;br /&gt;
&lt;br /&gt;
And finally there is the casino. This malicious app goes to the casino website, presumably only to generate traffic and ad revenue. The code of the Activity that visits the website is shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkpl7z3IOj1RMVM7N8EwhUhwjpvf8jnxd5Vde_6lSYiBVqmxpd_URZ_VC7txRKzChNNsp7taoyN-4mYOOO23E2V5lS0RlevXX-CSpangT3yfCzfv-1wbeoP6qEPNEVOkX_1TtH0jMFmsg/s1600/dotnet_casino.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkpl7z3IOj1RMVM7N8EwhUhwjpvf8jnxd5Vde_6lSYiBVqmxpd_URZ_VC7txRKzChNNsp7taoyN-4mYOOO23E2V5lS0RlevXX-CSpangT3yfCzfv-1wbeoP6qEPNEVOkX_1TtH0jMFmsg/s400/dotnet_casino.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&#39;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
In conclusion, this is one of the most advanced Android botnets and it&#39;s really packed with different features and allows the attackers for the easier control of the phone than most other Android RATs. It also uses interesting code obfuscation techniques, which makes analyzing it a (fun) challenge!&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2015/05/android-malware-goes-mono-and-lua-part.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDGhkl487Hb20HYkgUxW2sRLj132ZTsNgepLZaYIgxxpM8XYGVgTfKvYuHKofoMglv6Ie-xFjyCWs90XKaUNtXMT0KbnTfEyVhSG2EjNc2Bk2a5BeEWI38wdQRCNxMnH_kZhgiSDEkq14/s72-c/z3core.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-7502214097183864039</guid><pubDate>Thu, 26 Mar 2015 11:00:00 +0000</pubDate><atom:updated>2015-03-28T20:36:44.125+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">encryption</category><category domain="http://www.blogger.com/atom/ns#">Mono</category><category domain="http://www.blogger.com/atom/ns#">Z3Core</category><title>Android malware goes Mono (.NET) and Lua!</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
In December I attended a (really great!) &lt;a href=&quot;https://www.botconf.eu/&quot;&gt;Botconf&lt;/a&gt; &lt;a href=&quot;https://www.botconf.eu/archives/botconf-2014/&quot;&gt;2014&lt;/a&gt; conference. During that conferece I gave a&amp;nbsp;&lt;a href=&quot;https://drive.google.com/file/d/0B3S5P4PG3jzgNl9VbU1VOFVDRDA/view&quot;&gt;lightning talk about an interesting Android malware sample&lt;/a&gt; that (presumably) used Lua and Mono (hence, .NET) as a way of obfuscation. Very recently&amp;nbsp;&lt;a href=&quot;https://twitter.com/tbiehn&quot;&gt;@tbiehn&lt;/a&gt;&amp;nbsp;Tweeted to me a solution for a problem that I run into during the analysis. So now, below, you can find details about &lt;a href=&quot;https://www.virustotal.com/en/file/f3530c01c42c6384aabdbb2fbdda34d5a996cc740304199db2689a218ef33b91/analysis/&quot;&gt;the weird Lua/.NET/Java Android sample&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibWrW4SWxc9xMsxddgclL1uJlVrilt2_-D6uHQ99MFoh1IcIXcZHgfetbFZWDeEgoMyoDoTA3AFdjwvLDP83iaP5hHe4my76ZN_-a75vTlckxZIoO4ZVd6vtoO9YngtPCCuUgPdGh84kw/s1600/aulrin_tekst.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibWrW4SWxc9xMsxddgclL1uJlVrilt2_-D6uHQ99MFoh1IcIXcZHgfetbFZWDeEgoMyoDoTA3AFdjwvLDP83iaP5hHe4my76ZN_-a75vTlckxZIoO4ZVd6vtoO9YngtPCCuUgPdGh84kw/s1600/aulrin_tekst.png&quot; height=&quot;400&quot; width=&quot;266&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;It says &quot;Please wait, loading data&quot;&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Quick overview&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
It starts fairly innocent, with an app called &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Metrics.Me&lt;/span&gt; and it has a pretty standard malware permissions, as can be seen on a screenshot below. It uses a VKontakte icon, probably to pose as a kind of social media app. The main and only screen of this app is shown above.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSaRz7-FNkGTYmkY-l48Hj1XV-HJ6zVPyrwP90RtiEVz-Dc9IhxvnpI_EyB6b9y-Gm9cDdwIaWUYCtJW0E4apRlwaOH7REG93BycvsnwrhuhzPdUyiWu0uMOYYbgchc6A9acH0BOIEGiQ/s1600/aulrin_permissions.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSaRz7-FNkGTYmkY-l48Hj1XV-HJ6zVPyrwP90RtiEVz-Dc9IhxvnpI_EyB6b9y-Gm9cDdwIaWUYCtJW0E4apRlwaOH7REG93BycvsnwrhuhzPdUyiWu0uMOYYbgchc6A9acH0BOIEGiQ/s1600/aulrin_permissions.png&quot; height=&quot;306&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Let&#39;s start with the usual place: the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;SMSReceiver&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. And now things get a little complicated. There are a lot of references to the &quot;monodroid&quot;. It turns out that this is actually a Mono (.NET) implementation in Android. So, presumably, this is written in Mono. There are also some references to the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Runtime.register&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; native functions (shown below). How does it all work?&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigIYi4vbA_3b7nF8bBTes6bBsb63Mv5IPWaJWhrk2j55Vmz418yIXnR6udsyGaTpMrASDu3BJPquct1KVe-OqmawAj9OJa3HdS8Rzn-UECNEShgBfzdk5jJWSwMQT2CS2QSOmbRmH8s7s/s1600/aulrin_smsreceiver.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigIYi4vbA_3b7nF8bBTes6bBsb63Mv5IPWaJWhrk2j55Vmz418yIXnR6udsyGaTpMrASDu3BJPquct1KVe-OqmawAj9OJa3HdS8Rzn-UECNEShgBfzdk5jJWSwMQT2CS2QSOmbRmH8s7s/s1600/aulrin_smsreceiver.png&quot; height=&quot;180&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;register&lt;/span&gt; function accepts three parameters: first one is the string defining the DLL and .NET class which will be used to load the native functions. In this example &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Metrics&lt;/span&gt; is the DLL name and &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Z.Core.SMSReceiver&lt;/span&gt; is the class. Second parameter is the class to which this functions will be applied, in this case it&#39;s the same class, namely &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;SMSReceiver&lt;/span&gt;. Last parameter is a string which defines a mapping between a .NET function and the native function declaration in the class.&lt;br /&gt;
&lt;br /&gt;
And if you look at the sample, all of the classes in &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;z.core&lt;/span&gt; package use this .NET class loading methods.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Mono and the mkbundle&lt;/span&gt;&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;So, first you need to register a method using the native-implemented Runtime class, which is a part of the Monodroid native library. In this way you can almost&amp;nbsp;&lt;/span&gt;transparently&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;use the .NET code in your Android app. However, if a DLL file on Android is still a little too transparent for you, you can go a little further with the obfuscation. Just use the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;mkbundle&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; tool! It&#39;s a tool that combines all of the DLL files to a native .so library, e.g. for ARM processor. This is usually called&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;libmonodroid_bundle_app.so &lt;/span&gt;and contains gziped DLLs (all of them) with their appropriate file names. You can see it by disoplaying the exports of the .so file, as pictured below.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqFMtQ0I0qK8fqB9IfxrvzE5pZV0zaJkKDfRioURv3_u1fuz_KNQZSQpmoiedpwi7tn-mpniJ8QhihJK7IsPF_IRF93JHFKEBf-a-gvLD8bVbHVCdqrNssRYglYVnI2uRpwjg5LTUw3gw/s1600/botconf-ida.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqFMtQ0I0qK8fqB9IfxrvzE5pZV0zaJkKDfRioURv3_u1fuz_KNQZSQpmoiedpwi7tn-mpniJ8QhihJK7IsPF_IRF93JHFKEBf-a-gvLD8bVbHVCdqrNssRYglYVnI2uRpwjg5LTUw3gw/s1600/botconf-ida.png&quot; height=&quot;273&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
As you can see there is a &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;mono_mkbundle_init&lt;/span&gt; export and a couple of exports called &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;assembly_data_&lt;/span&gt; which are just gziped DLLs. So, you probably want to extract them. You don&#39;t have to do it manually now! You can &lt;a href=&quot;https://gist.github.com/maldroid/d40d59600319d8e225f6&quot;&gt;use my script to extract all of the files&lt;/a&gt;, as I did. So now we have files and we can look at them and see what this malware does.&lt;/div&gt;
&lt;h3 style=&quot;clear: both; text-align: justify;&quot;&gt;
.NET code &amp;amp; Lua&lt;/h3&gt;
&lt;div&gt;
For the .NET code I used a &lt;a href=&quot;https://www.jetbrains.com/decompiler/&quot;&gt;free dotPeek decompiler&lt;/a&gt;, which I cannot recommend enough. You can see the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;onReceive&lt;/span&gt; method below and experience the weird cognitive dissonance by reading a .NET code using Android libraries.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQUR13LFtQStLZBaasBWlilQPcIBB19QsLj-PYIoCpq0hbQMddHvF8lMB8CTSWGsy3sUqsC4rPOaJvOOlUmAnyyF7B7d5gBRjV0nP9du7r0qFhMXRIYT-krl6Kz4v_3c8Bd7J7z3fnrsc/s1600/alurin_onreceive.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQUR13LFtQStLZBaasBWlilQPcIBB19QsLj-PYIoCpq0hbQMddHvF8lMB8CTSWGsy3sUqsC4rPOaJvOOlUmAnyyF7B7d5gBRjV0nP9du7r0qFhMXRIYT-krl6Kz4v_3c8Bd7J7z3fnrsc/s1600/alurin_onreceive.png&quot; height=&quot;388&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
And when you dig a little deeper, you can find a very interesting sets of functions. Like for example the GetScriptFromServer function which does the following.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;Crafts a specific HTTP POST body content, which contains, among others, a token and MD5 checksum.&lt;/li&gt;
&lt;li&gt;Sends the request to hxxp://109.73.170.147/news/news.php (PHP - now we have even more programming languages!). Although the https is not used, the request body is encrypted using AES.&lt;/li&gt;
&lt;li&gt;Depending on the response code it either downloads or uploads a Lua (yes, Lua) script.&lt;/li&gt;
&lt;li&gt;The script above is then executed on the Lua interpreter implemented in the Mono environment on the Android platform. Just let it sink for a while.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Function is presented on the screenshot below. AES key and IV mentioned above are actually generated randomly and exchange on the first contact with the C&amp;amp;C server. This registration process goes like this:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Bot sends a device ID included in it&#39;s registration packet to the server.&lt;/li&gt;
&lt;li&gt;C&amp;amp;C responds with the confirmation and includes a XOR key.&lt;/li&gt;
&lt;li&gt;Bot generates (randomly) AES key and IV and sends them (XORed) to the C&amp;amp;C server.&lt;/li&gt;
&lt;li&gt;C&amp;amp;C server acknowledges the key and IV. This parameters will be used in any future communication.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6M7Bzion5dcL6-2wD7-4UbgNrYsETtZBtUdIxcfG2kgzLg4wE4J8nVPeO6JgxQkfDa-fbl1AGrAN5p0raJRwhV6vUCCIe8b0w3vzX_ZBqur0CZ7cTYE5jxntJRu6AWtuoHUhJVvpyNy8/s1600/aulrin_getscript.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6M7Bzion5dcL6-2wD7-4UbgNrYsETtZBtUdIxcfG2kgzLg4wE4J8nVPeO6JgxQkfDa-fbl1AGrAN5p0raJRwhV6vUCCIe8b0w3vzX_ZBqur0CZ7cTYE5jxntJRu6AWtuoHUhJVvpyNy8/s1600/aulrin_getscript.png&quot; height=&quot;310&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But the anti-reversing techniques go even deeper. Actually, the Broadcast Receiver source code was delivered by the server so there is no way to actually get to know the code once the server is down. Hence, I cannot really say what was done once the SMS was received. The same goes for the boot Receiver.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But wait, there&#39;s more. Have you ever heard about the Virtual File System? Of course you have! However, this VFS is just a simple interface that makes directories more available. Nothing really fancy there. However, it looks like it was just a placeholder and may be evolving in the next versions of this malware.&lt;/div&gt;
&lt;h3&gt;
Summary&lt;/h3&gt;
&lt;div&gt;
This app is one of the more sophisticated Android malicious apps on the market. Author went to great lengths to obfuscate the code and even used some anti-forensic measures. It has some unique capabilities (like the fact the the Broadcast Receiver code is actually kept on the server... in Lua). And you have to admit that running Lua on top of Mono on Android is pretty impressive.&lt;br /&gt;
&lt;br /&gt;
After I typed this post I discovered a framework called &lt;a href=&quot;http://xamarin.com/&quot;&gt;Xamarin&lt;/a&gt;&amp;nbsp;which lets developers write apps in C# for the three most common mobile platforms: Windows, Android and iOS. There are some artifacts named &quot;Xamarin&quot; in the sample, but the C# code looks like it was created for Android platform (the use of native Android functions and concepts, mix of the Java and C# code). If anyone is more familiar with Xamarin please have a look yourself to see if this is indeed a Xamarin app. Although I think this is highly unlikely. But if that turns out to be true maybe you can find a Windows or iOS version of this malware? Cross-platform would make it even more interesting.&lt;br /&gt;
&lt;br /&gt;
And if you managed to read this post to the end, I have a little easter egg for you. Below is one of the package names in the sample.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcH8FgElqSqQvAMKljODDDGYKGXDXVdO3RokSBLIGhQPno8EeHcatgKWCJx7RbK2fWxQvE7ZBifglCgmrHaA4RrVHWhgHntwdQ7wXmxieljQiYlitwEUyM4Q6sT6wAk3KRkVgL9iTR1Lg/s1600/aulrin_obama.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcH8FgElqSqQvAMKljODDDGYKGXDXVdO3RokSBLIGhQPno8EeHcatgKWCJx7RbK2fWxQvE7ZBifglCgmrHaA4RrVHWhgHntwdQ7wXmxieljQiYlitwEUyM4Q6sT6wAk3KRkVgL9iTR1Lg/s1600/aulrin_obama.png&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;Thanks, Obama&lt;/span&gt;&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2015/03/android-malware-goes-mono-net-and-lua.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibWrW4SWxc9xMsxddgclL1uJlVrilt2_-D6uHQ99MFoh1IcIXcZHgfetbFZWDeEgoMyoDoTA3AFdjwvLDP83iaP5hHe4my76ZN_-a75vTlckxZIoO4ZVd6vtoO9YngtPCCuUgPdGh84kw/s72-c/aulrin_tekst.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-7205330244910651005</guid><pubDate>Tue, 03 Mar 2015 10:30:00 +0000</pubDate><atom:updated>2015-03-03T10:30:01.627+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">PornLocker</category><category domain="http://www.blogger.com/atom/ns#">ransomware</category><title>Porno-locker - nice icon, not so nice functions</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
Recently &lt;a href=&quot;https://twitter.com/PaulWebSec&quot;&gt;@PaulWebSec&lt;/a&gt;&amp;nbsp;made me &lt;a href=&quot;https://www.virustotal.com/en/file/595032b6998ec767e6503178134c772ea5bd0d18a4f2f6e5b09611ef66b81b4b/analysis/&quot;&gt;look at porn&lt;/a&gt;&amp;nbsp;(now, will you risk clicking on that link? ;). Well, at least he advertised it as such, but it turned out to be just another fake Android porn app, which in reality was just a ransomware. It even has a kind of NSFW icon, but you have to get the sample to see it for yourself.&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Anyhow, let&#39;s have a look at the code. It uses a lot of interesting permissions: camera, call log, contacts, Internet (of course), location and so on. It also has a bunch of activities, one of which is affectingly called &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;TerrifyActivity&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjQY9M1Vq6gyf6tcqBbkHBNYEI1ltypHIXuCVH2DvGte8qqRAYtv7-yil8c-qf-DdzIeZZTKHb_NT9ogAXNg1wbJmAbSaIiF_QDiDIIw7-MxJm3NTzPwwdawcyj8iVa4P-MrD5rIWbrMg/s1600/pornlocker-fbi.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjQY9M1Vq6gyf6tcqBbkHBNYEI1ltypHIXuCVH2DvGte8qqRAYtv7-yil8c-qf-DdzIeZZTKHb_NT9ogAXNg1wbJmAbSaIiF_QDiDIIw7-MxJm3NTzPwwdawcyj8iVa4P-MrD5rIWbrMg/s1600/pornlocker-fbi.png&quot; height=&quot;320&quot; width=&quot;251&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Overview&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;When we start the app, AndroidManifest says it will start an Activity called &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;MainActivity&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. And by looking at it it does nothing. Absolutely nothing, apart from creating some variables.&amp;nbsp;&lt;/span&gt;Actually&lt;span style=&quot;font-family: inherit;&quot;&gt;, the startup code is in the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;MainApplication&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; class. This, in turn, starts the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;MainService3&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; class.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;A&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://developer.android.com/reference/android/os/PowerManager.WakeLock.html&quot; style=&quot;text-align: justify;&quot;&gt;WakeLock&lt;/a&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;&amp;nbsp;is also put in place - to make sure that the device is on.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;We are asked whether we will allow this app to be Device Admin. It does not use any polices, it just wants to be the Device Admin so we won&#39;t be able to uninstall it using&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; text-align: justify;&quot;&gt;pm uninstall&lt;/span&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;&amp;nbsp;command.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6MTjDrz2Qu5t2U26nRsKoE8aQyV5U4GQfwpNEYISVtdK2SGcjuK6cDdLNHphwuj4VdURNsvG7Ev_x-7GJSbeSUAnfyScVDKSl8cd8gmf3pEaAGM8PTC9zewRiN22FebVMXCkD7d5wsrU/s1600/pornlocker-deviceadmin.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6MTjDrz2Qu5t2U26nRsKoE8aQyV5U4GQfwpNEYISVtdK2SGcjuK6cDdLNHphwuj4VdURNsvG7Ev_x-7GJSbeSUAnfyScVDKSl8cd8gmf3pEaAGM8PTC9zewRiN22FebVMXCkD7d5wsrU/s1600/pornlocker-deviceadmin.png&quot; height=&quot;320&quot; width=&quot;253&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This locker also can use Camera - class &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;b&lt;/span&gt; takes a picture and saves it as &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;fastness.jpg&lt;/span&gt;. Then, by using code in class &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;h&lt;/span&gt; this picture can be downloaded by any website loaded to &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;WebView&lt;/span&gt; via exposed &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;JavascriptInterface&lt;/span&gt;. What this means is that the attacker can easily obtain a picture of the victim using Javascript. Interesting functionality.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Class &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;e&lt;/span&gt; is responsible for the device locking. It implements three listeners:&amp;nbsp;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;a href=&quot;https://developer.android.com/reference/android/view/View.OnClickListener.html&quot;&gt;View.OnClickListener&lt;/a&gt;, &lt;a href=&quot;https://developer.android.com/reference/android/view/View.OnKeyListener.html&quot;&gt;View.OnKeyListener&lt;/a&gt;, &lt;a href=&quot;https://developer.android.com/reference/android/view/View.OnTouchListener.html&quot;&gt;View.OnTouchListener&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. Each of them is&amp;nbsp;&lt;/span&gt;responsible&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;for intercepting different event and making sure that&amp;nbsp;the lock screen stays on top. By intercepting this events we cannot change the View and the phone seems locked.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;In order to be even more persistent the view has the following flags specified:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 class=&quot;jd-details-title&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;FLAG_LAYOUT_IN_SCREEN&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; - take entire screen.&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;&lt;h4 class=&quot;jd-details-title&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;FLAG_FULLSCREEN&lt;/span&gt;&amp;nbsp; - hide decorations.&lt;/span&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;
&lt;h4 class=&quot;jd-details-title&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;FLAG_SHOW_WHEN_LOCKED&lt;/span&gt; - shows a window even when the screen is locked.&lt;/span&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;h4 class=&quot;jd-details-title&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;FLAG_DISMISS_KEYGUARD&lt;/span&gt; - no keyguard.&lt;/span&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;&lt;h4 class=&quot;jd-details-title&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;FLAG_TURN_SCREEN_ON&lt;/span&gt; - screen is always on.&lt;/span&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div&gt;
&lt;h4 class=&quot;jd-details-title&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;FLAG_HARDWARE_ACCELERATED&lt;/span&gt; &amp;nbsp;- hardware acceleration. Because, why not?&lt;/span&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
As you can see this provides an almost kiosk-like mode on your device. Fully locked. Well, you can still kill the process from the adb I guess :) However, there is a slight bug. You cannot scroll the website, because the scrollbar has been disabled. So, you get the message shown above, but you cannot do anything about it.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: start;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;There is also an interesting BroadcastReceiver called&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;MainReceiver2&lt;/span&gt;&amp;nbsp;that responds to a couple of intents:&lt;/div&gt;
&lt;div style=&quot;text-align: start;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6h4qhiWP81PW67Sxb77CYKAy-v9EG7JXo97W_vc8PVcJy5KvuMai1-kr-ep8TQu7bAkUpo9XHKQ2bAxWWnL9DTSbKAYU0bvTyVFsjb4N6ijpc-vk_qk56AOTT7st-yfFCpQaAxWsali4/s1600/broadcastreceiver-porn.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6h4qhiWP81PW67Sxb77CYKAy-v9EG7JXo97W_vc8PVcJy5KvuMai1-kr-ep8TQu7bAkUpo9XHKQ2bAxWWnL9DTSbKAYU0bvTyVFsjb4N6ijpc-vk_qk56AOTT7st-yfFCpQaAxWsali4/s1600/broadcastreceiver-porn.png&quot; height=&quot;144&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: start;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This is to make sure that the locker is running, even if we e.g. reboot the phone. A bit aggressive, don&#39;t you think?&lt;/div&gt;
&lt;br /&gt;
Other interesting stuff: every time you change your location it is saved in the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;eloquence.xml&lt;/span&gt; shared preferences. Class &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;g&lt;/span&gt; is responsible for that and implements a rather interesting Android feature called &lt;a href=&quot;https://developer.android.com/reference/android/os/MessageQueue.html&quot;&gt;MessageQueues&lt;/a&gt;. Speaking of the shared preferences, here is a small snippet of this file:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39; standalone=&#39;yes&#39; ?&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;map&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;boolean name=&quot;joyousness&quot; value=&quot;true&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;boolean name=&quot;inkling&quot; value=&quot;true&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;boolean name=&quot;appraisals&quot; value=&quot;true&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;int name=&quot;semaphoring&quot; value=&quot;4&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;string name=&quot;mouse&quot;&amp;gt;0.0&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;string name=&quot;reeling&quot;&amp;gt;0.0&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;boolean name=&quot;dovecote&quot; value=&quot;true&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;string name=&quot;leader&quot;&amp;gt;{}&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;boolean name=&quot;thickness&quot; value=&quot;true&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;string name=&quot;raft&quot;&amp;gt;73d79f35-9577-4e86-a747-eddd876632c8&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;/map&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;As you can see names are rather strange. For example &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;mouse&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; and &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;reeling&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; are the location parameters. And, just to top things up, below are the basic device information that are stolen.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEzDDcFWLBSo06kjGNm-Gq_W3KwUjKUBrJCS3DuT7PNHdydklysPHyFyFELoKz_YCrc96xHRGLopqSGTX7LjwEFn5whp_FgpwG_uPsovMtKh095WXGfMEtPTjJxiNEENpvMR1kHrabAV0/s1600/porn-stolen.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEzDDcFWLBSo06kjGNm-Gq_W3KwUjKUBrJCS3DuT7PNHdydklysPHyFyFELoKz_YCrc96xHRGLopqSGTX7LjwEFn5whp_FgpwG_uPsovMtKh095WXGfMEtPTjJxiNEENpvMR1kHrabAV0/s1600/porn-stolen.png&quot; height=&quot;185&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Reports are sent in a base64-encoded JSON format. For debugging purposes also stacktraces are sent via this channel. In the end user is presented with a kiosk-like WebView of a website that the attacker has prepared.&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;
Obfuscation&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The class &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;net.biologist.a&lt;/span&gt; contains all of the &quot;encrypted&quot; strings. This are just base64-decoded string that have been prefixed with some random values. So, first you have to de-base64 and then just start reading them starting from a specific index. All of the decrypted strings, along with their indices in hex and decimal &lt;a href=&quot;https://gist.github.com/maldroid/8695666fcf4c6d0ec064&quot;&gt;are available here&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZE1qLLHoyX7Kxxv1BQz6Xe6YEPRPAAUH28w5B40tl4chY1ElObwZ26SwkfTEZMDaN7IlV2o-5sL0EEPtR-1OIhB_I5g34oDHUVg_6c7EsYB2gH7GJDUjqTuuuNYthSulN-XVN7KnA0c0/s1600/porno-a.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZE1qLLHoyX7Kxxv1BQz6Xe6YEPRPAAUH28w5B40tl4chY1ElObwZ26SwkfTEZMDaN7IlV2o-5sL0EEPtR-1OIhB_I5g34oDHUVg_6c7EsYB2gH7GJDUjqTuuuNYthSulN-XVN7KnA0c0/s1600/porno-a.png&quot; height=&quot;94&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Class &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;net.biologist.cf&lt;/span&gt; on the other hand is something quite interesting. Most of the functions used in the sample are hidden there and are obfuscated by using a different, meaningless name. For example instead of invoking StringBuilder append method on String, you would call &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;cf.c101(StringBuilder, String)&lt;/span&gt;. A snippet of this class is presented on the screenshot below.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN0F8V6UEc9KzQlnbn4ZTVnYQuXICS4BSGY34QUxeJB75sOGVYHooVamMXIQTq8mPFZzAAEmAlAZBq9NfsKSnDWavdo76yRKH8b-hKE-kuIAWUW09LcUGrHKRcfrHDjiej5VDaMxiOznQ/s1600/cf-pornlocker.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN0F8V6UEc9KzQlnbn4ZTVnYQuXICS4BSGY34QUxeJB75sOGVYHooVamMXIQTq8mPFZzAAEmAlAZBq9NfsKSnDWavdo76yRKH8b-hKE-kuIAWUW09LcUGrHKRcfrHDjiej5VDaMxiOznQ/s1600/cf-pornlocker.png&quot; height=&quot;328&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Class &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;c&lt;/span&gt; if also used for obfuscation - some of the strings from &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;a&lt;/span&gt; class are even further obfuscated by assigning them to some random members of the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;c&lt;/span&gt; class, as pictured below.&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcnkNzPYgi9zn2_FIlU6usKqpay-NgVO0GXtBkp2fooFkjyjtMwIJ2M_9JQEjbdVH5duw0GDpHR5HEMBRFAhfaaDo9GqdWkVS79vVZ2FlISqmCP1Wy-AuNJDp-WNbuv_LyZ_5BBTVTlV0/s1600/porno-c.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcnkNzPYgi9zn2_FIlU6usKqpay-NgVO0GXtBkp2fooFkjyjtMwIJ2M_9JQEjbdVH5duw0GDpHR5HEMBRFAhfaaDo9GqdWkVS79vVZ2FlISqmCP1Wy-AuNJDp-WNbuv_LyZ_5BBTVTlV0/s1600/porno-c.png&quot; height=&quot;400&quot; width=&quot;312&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
Android Malware Tracker&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
And now for something completely different. As you may be aware &lt;a href=&quot;https://twitter.com/maldr0id&quot;&gt;from my Twitter&lt;/a&gt; I started a really small project called Android Malware Tracker - &lt;a href=&quot;http://amtrckr.info/&quot;&gt;amtrckr.info&lt;/a&gt;. The idea behind it is that sometimes I encounter a sample that I have already described or is interesting, but I don&#39;t have time to take a closer look and I want to put it out there. And that&#39;s my way of &quot;putting it out there&quot; and, as a bonus, you get the C&amp;amp;C data. And there even is an API so that you can easily put URLs, IPs or domains on your blacklists. Have fun and if you have some interesting sample you know where to find me.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2015/03/porno-locker-nice-icon-not-so-nice.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjQY9M1Vq6gyf6tcqBbkHBNYEI1ltypHIXuCVH2DvGte8qqRAYtv7-yil8c-qf-DdzIeZZTKHb_NT9ogAXNg1wbJmAbSaIiF_QDiDIIw7-MxJm3NTzPwwdawcyj8iVa4P-MrD5rIWbrMg/s72-c/pornlocker-fbi.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-5225844892059051138</guid><pubDate>Fri, 09 Jan 2015 10:00:00 +0000</pubDate><atom:updated>2015-01-09T10:00:05.551+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">communication</category><category domain="http://www.blogger.com/atom/ns#">iBanking</category><category domain="http://www.blogger.com/atom/ns#">kitkat</category><title>New iBanking - KitKat SMS bypass done wrong, obfuscation done right</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
iBanking malware seems to be on the rise recently. It is not a new malware, it&#39;s circulating for more than a year now, but it seems to be the go-to choice for some of the more popular e-banking attacks. It&#39;s usually coupled with the PC infection (by some webinject-capable malware), which convinces the user to install either a &quot;specially crafted&quot; banking app, antivirus solution or some other uses trustworty-sounding name.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Anyhow, I recently got my hands on two interesting things: one is the &quot;new&quot; iBanking sample, which tries to fool Android &amp;gt; 4.3 SMS_DELIVER mechanism. The second one is the panel and the builder of the iBanking. Let&#39;s have a look, but first a quick recap of iBanking features and modus operandi. We will be looking &lt;a href=&quot;https://www.virustotal.com/en/file/ecabfe942c015d693cfc4a85a888a97ae7e65b439faef77617f2fc2f2a8e207d/analysis/&quot;&gt;at this sample&lt;/a&gt;.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Templating&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
iBanking has a dozen of what it calls &quot;templates&quot;. Each template is in fact one of the apps that iBanking pretends to be. So you can have a template for a specific bank, a template that makes it look like mobile antivirus and so on. Templates differ slightly in the layout, but mostly in the provided graphics and color scheme, although some of them seem to support specific commands (more on that later on). Dr. Web template is presented on the screenshot below.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKG2CRV79m8RX41mhPnSgIkkMtLLJNrgfwX49FpqJNOLD23e4vePlZ11Awsh62LKFz2CYBgGzb8sQ5FZEnEHFL-3dMzvk0sU6lYo_dZIkjVDZgvXantLm3k6TsMvNHSekchepUUcBmbAI/s1600/drweb-ibanking.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKG2CRV79m8RX41mhPnSgIkkMtLLJNrgfwX49FpqJNOLD23e4vePlZ11Awsh62LKFz2CYBgGzb8sQ5FZEnEHFL-3dMzvk0sU6lYo_dZIkjVDZgvXantLm3k6TsMvNHSekchepUUcBmbAI/s1600/drweb-ibanking.png&quot; height=&quot;400&quot; width=&quot;266&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Looking at the (leaked) crimeware kit it seems that the buyer has to specify a template that he or she wants. This way if the template gets &quot;burned&quot; the attacker has to buy another one, effectively paying for the same malware twice. If you have any additional (or entirely different) information about the sales tactic, feel free to contact (and/or correct) me.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
However, you can still make some personalization when you get the crimeware kit. You can change the hardcoded C&amp;amp;C numbers, HTTP C&amp;amp;C URL and bot ID. All of these changes are done in a curious way. Crimeware kit comes with an app sample that is disassembled (using apktool), then sed is run to replace the variables and then the app is assembled (again using apktool) and signed. Screenshot below illustrates part of that process.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtMxcpI7giHUlLo1he14fJ0jS6GoJG0P8O3ap8JbCIZyJGlBXH_rYqNXhO3o3Gq4ZdtGqMgXvpFWL1b-mU41OwJrIZ679hZOF9FB5hA3je3SiDalrapikSG0G-QZwJggU5DSYvoD1KF5Q/s1600/ibanking-kit.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtMxcpI7giHUlLo1he14fJ0jS6GoJG0P8O3ap8JbCIZyJGlBXH_rYqNXhO3o3Gq4ZdtGqMgXvpFWL1b-mU41OwJrIZ679hZOF9FB5hA3je3SiDalrapikSG0G-QZwJggU5DSYvoD1KF5Q/s1600/ibanking-kit.png&quot; height=&quot;220&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
SMS communication&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
iBanking is certainly one of the most feature-packed Android trojans (although it does not try to &lt;a href=&quot;http://maldr0id.blogspot.com/2014/10/whatsapp-with-finspy.html&quot;&gt;decrypt the WhatsApp messages like FinSpy did&lt;/a&gt;). If you have a look at the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ek&lt;/span&gt; class you&#39;ll see a list of SMS commands, some of which are:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;wipe data&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;- does a factory reset, sent as a last command to prevent device forensic,&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;sms start &amp;lt;number&amp;gt;/ sms stop&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;- starts and stops SMS forwarding to a specified number,&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;call start &amp;lt;number&amp;gt; / call stop&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; - starts and stops call forwarding (done using &lt;a href=&quot;https://en.wikipedia.org/wiki/Call_forwarding#Europe&quot;&gt;the *21* code&lt;/a&gt;),&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;sms list / call list&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; - send a log of text messages or calls (respectively),&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;start record / stop record&lt;/span&gt; - starts and stops audio recording (using the mic in your phone),&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;greed&lt;/span&gt; - this is unusual. It will display a notification with some text to the user and switch the app main view. It&#39;s only for one template and I don&#39;t have a sample with that template so I&#39;m not sure what the notification text is and what the purpose of it is.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
How does the app know that the command was sent from the attacker and not from the third party? Either because the text message was sent from one of the two hardcoded C&amp;amp;C numbers or the number that previously authenticated itself. Authentication is performed by sending the hardcoded password. This way the attackers can change C&amp;amp;C if they lose the phone number. Clever, huh?&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;h3&gt;
Encryption and obfuscation&lt;/h3&gt;
The fun part is also the encryption that they use to hide the actual password in the app. Previously the password was stored in plaintext, but now it&#39;s encrypted using propriatery algorithm pictured below (can be found in the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;cD&lt;/span&gt;&amp;nbsp;class).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_NV6bQrwA2Kn_Yn5-FdnJGPGnMaqLTM1N78hpWi6yYcTlWWiMGYwyyk_Iyg_M6GErWuIvU30m74-RRSWhun2cmkJIyUY0LN7V6kvGrvRkJyZ8rHPT5Nm4UoMJrRb5sf4aTFR0fFIGzU8/s1600/ibanking-encryption.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_NV6bQrwA2Kn_Yn5-FdnJGPGnMaqLTM1N78hpWi6yYcTlWWiMGYwyyk_Iyg_M6GErWuIvU30m74-RRSWhun2cmkJIyUY0LN7V6kvGrvRkJyZ8rHPT5Nm4UoMJrRb5sf4aTFR0fFIGzU8/s1600/ibanking-encryption.png&quot; height=&quot;544&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
As you can see &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;b&lt;/span&gt; is responsible for converting the hex-encoded text to actual bytes. Then, in the last two lines of &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;a&lt;/span&gt;, the encrypted message is xored with a keystream made using an &quot;almost&quot; LPRNG, but it includes not only the keystream variable but also the ciphertext byte. All in all, seems like a good effort in cryptography, not a usual xor with a byte. &lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
And there&#39;s more! In the same class we have two method declarations that have the same name and same arguments, but differ in the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;static&lt;/span&gt;&amp;nbsp;modifier and the returned type. One is:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;public static String a(String paramString)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
and the other one is:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;public final byte[] a(String paramString)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Surely, Java does not allow for such an abomination, right? That&#39;s true, Java doesn&#39;t (and don&#39;t call me Shirley). When I tried to reproduce this I&#39;ve got the following error:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;error: method a() is already defined in class ...&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
However, smali is more flexible. After some testing it seems that Dalvik VM takes into account also the returned type. So if you compile the project, then disassemble it using apktool, change method name, build it and run, you can have two methods with the same name and arguments. But you don&#39;t have to believe me, I&#39;ve prepared a MWE and you can&amp;nbsp;&lt;a href=&quot;https://github.com/maldroid/samples/blob/master/HelloMaldr0id-static-instance-methods.apk&quot;&gt;have a look for yourself&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Despite my best effort, I cannot seem to invoke the non-static (instance) method. All in all, it&#39;s a really good obfuscation that fooled me during this analysis.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
SMS_DELIVER&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Since Android KitKat (4.4) there is a new approach to handling the text messages. There is a special, designated SMS app and there can be only one. You can of course change it &amp;nbsp;- for example when the attackers &lt;a href=&quot;http://maldr0id.blogspot.com/2014/09/android-malware-based-on-sms-encryption.html&quot;&gt;try to convince you that you&#39;ll be better off with their app&lt;/a&gt;. However, if you don&#39;t change it you will be notified about every incoming message and every outgoing message will be recorded. This, of course, is a behavior that the criminals do not want, especially when they forward your SMS OTP messages. So they implemented a workaround which is a little... wrong. Let&#39;s have a look.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMhz6HW9-uIrqX37q9ukl50tcuiYoFgXQbsOUC7wssxOnroE33_RQ9dTTSHhutFVu8_RT4JuUppTkOI8LHVfE0zrSvMJC6kUTcKPqkIf5g-sKI-6JLgBHPBJ0dsGCS508M6ShJsslpLP0/s1600/kitkat-ibanking-1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMhz6HW9-uIrqX37q9ukl50tcuiYoFgXQbsOUC7wssxOnroE33_RQ9dTTSHhutFVu8_RT4JuUppTkOI8LHVfE0zrSvMJC6kUTcKPqkIf5g-sKI-6JLgBHPBJ0dsGCS508M6ShJsslpLP0/s1600/kitkat-ibanking-1.png&quot; height=&quot;54&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So, if the version number &lt;b&gt;starts with&lt;/b&gt;&amp;nbsp;4.4 then mute the audio. This of course will somehow work - user won&#39;t be notified of the incoming message by sound, but there is a problem with the notification bar, which still shows that you received a text message, because it is the newest notification. Apart from that, there is also another problem. It will not work on Android Lollipop, which is 5.0.x version. And 5.0.x does not start with 4.4.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
What about the HTTP?&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Well, HTTP is really not interesting and is left rather unused. However, I did find two active panels using the mighty powers of the Google search engine, so I wouldn&#39;t say it is extinct. One is even in the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;.ir&lt;/span&gt; TLD.&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2015/01/new-ibanking-kitkat-sms-bypass-done.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKG2CRV79m8RX41mhPnSgIkkMtLLJNrgfwX49FpqJNOLD23e4vePlZ11Awsh62LKFz2CYBgGzb8sQ5FZEnEHFL-3dMzvk0sU6lYo_dZIkjVDZgvXantLm3k6TsMvNHSekchepUUcBmbAI/s72-c/drweb-ibanking.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-6729573451083932687</guid><pubDate>Sun, 21 Dec 2014 22:24:00 +0000</pubDate><atom:updated>2014-12-21T22:24:46.164+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">ebanking</category><category domain="http://www.blogger.com/atom/ns#">malware</category><category domain="http://www.blogger.com/atom/ns#">sms</category><title>Iran, secret text messages and a toy for a holiday break</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
So I &lt;a href=&quot;https://twitter.com/maldr0id/status/545985903777169408&quot;&gt;recently tweeted about some interesting Android app sample&lt;/a&gt;. This app either is or pretends to be an Iranian banking app. I couldn&#39;t take a closer look at it (there is a bit of a language problem for me), however it uses the &lt;a href=&quot;http://www.iranwatch.org/iranian-entities/ansar-bank&quot;&gt;Ansar Bank&lt;/a&gt; name and graphics (as you can see on a screenshot below) and also uses a very interesting text messages feature that I was not aware at all.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqrEDA2-2DVu11CUh31H8hhRZnzKJ1x5P13lEuEvuj4YWuOC_JrLEQ_04_XfnUskgKY3gHZYyUHgRcj-v8jr7sD1lGbZNl2KGP_tkE2yI2c-JdaST6re4u4qqaYaYR5zFlHSWWFeLMjsY/s1600/splash.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqrEDA2-2DVu11CUh31H8hhRZnzKJ1x5P13lEuEvuj4YWuOC_JrLEQ_04_XfnUskgKY3gHZYyUHgRcj-v8jr7sD1lGbZNl2KGP_tkE2yI2c-JdaST6re4u4qqaYaYR5zFlHSWWFeLMjsY/s1600/splash.png&quot; height=&quot;320&quot; width=&quot;251&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
The curious case of the SMS protocol&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Text message protocol is pretty straightforward on the high level: it allows you to send a 140-byte message to the other phone. Wait, I surely meant 160 bytes, right? No, it&#39;s a 140 bytes, but it&#39;s using a plain 7-bit ASCII encoding without those fancy characters like the one at the&amp;nbsp;beginning&amp;nbsp;of my name. This allows you&amp;nbsp;to send precisely 160 ASCII characters.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
As you probably all know, we can send more than 160 characters, but it will be broken into several messages. However, mobile phones seem to be OK with that and let you create a long message and the receiver also can read a one, long message without even noticing the split. How is that possible? SMS protocol specifies something called User Data Headers (UDH for short). These headers are sometimes present at the&amp;nbsp;beginning&amp;nbsp;of the text message and allow to send multipart messages, ringtones or include fancy&amp;nbsp;characters with their pretentious UTF-whatever encoding. There is also a flag bit to indicate whether the message contains these UDH or not.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Let&#39;s have a look at the example of multipart message header (taken &lt;a href=&quot;http://smstools3.kekekasvi.com/index.php?p=udh&quot;&gt;from here&lt;/a&gt;):&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;05 00 03 5F 02 01&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;This header would be at the&amp;nbsp;&lt;/span&gt;beginning&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;of your text message and, if your phone wasn&#39;t&amp;nbsp;so&amp;nbsp;&lt;/span&gt;ergonomically&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;designed, it&amp;nbsp;would be rendered as a bunch of characters. First number of the UDH specifies the header length (5 bytes, excluding the length byte). Then there is a header type, in this case meaning that this is a concatenated message. Then there is another length (3 bytes). Then there is one byte message ID, shared among all of the message parts, then the number of message parts and,&amp;nbsp;&lt;/span&gt;finally&lt;span style=&quot;font-family: inherit;&quot;&gt;, this part&amp;nbsp;&lt;/span&gt;identifier&lt;span style=&quot;font-family: inherit;&quot;&gt;.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Header in the given example means that this is first of 2 messages with &quot;thread&quot; id &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;5F&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. So, why am I explaining all of this? Because there is a little known (at least I didn&#39;t know about it) feature of the SMS protocol that allows you to specify &quot;port&quot; information. This is used e.g. for the WAP Push messages, which are just plain SMS messages but with a specific UDH. This UDH looks like that:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;05 04 03 &amp;lt;destination port (2 bytes)&amp;gt; &amp;lt;originator port (2 bytes)&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;The 2-byte values are called &quot;ports&quot; because they are meant to be used to identify a service. Some app in your phone &quot;binds&quot; to a port and listens for all the messages to that port. Another app &quot;binds&quot; to a port and sends SMS from that port to your app - directly. You can also use &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;00 00&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; as the originator port if you don&#39;t need a specific port.&lt;/span&gt;&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;How are these ports handled on Android?&lt;/span&gt;&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;This is a really good question! First of all on Android they are called &quot;binary SMS&quot; or &quot;data SMS&quot;. Apps that want to use them have to have the standard SMS permissions:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;android.permission.RECEIVE_SMS&lt;/span&gt; and&amp;nbsp;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;android.permission.SEND_SMS&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. Next, the Broadcast Receiver has to have somewhat different declaration, like the one in the picture below (taken from an Iranian app mentioned previously).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguhg-ovR4ZNat4oG0H2cu7tylKmfg3ves7tHaIB2E82Vn2m0WrgRcuFSxDjraUhpNpjkWJusr5WIFmCxxq-Ba1FPF7sVP8SYHEOA0LURn_utCoGvY9PHByMtOIIervVqlb6OPhPNT8eoM/s1600/data_sms.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguhg-ovR4ZNat4oG0H2cu7tylKmfg3ves7tHaIB2E82Vn2m0WrgRcuFSxDjraUhpNpjkWJusr5WIFmCxxq-Ba1FPF7sVP8SYHEOA0LURn_utCoGvY9PHByMtOIIervVqlb6OPhPNT8eoM/s1600/data_sms.png&quot; height=&quot;120&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;As you can see you have to declare a port and the scheme. Apparently there are two different addressing schemes - one which uses two byte port number and one which uses 4 byte port numbers.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;So, I wanted to experiment with it. After some Googling (which is nowadays an equivalent of &quot;Research&quot;) I found out the the Android emulator does not handle port messages very well. Or even at all. So I decided to have fun with it using my real phone. My very real phone has Android 4.3 installed and my other test phone has Android 2.3.6. I&#39;ve sent a binary message to both phones and neither of them displayed it. It just went to the dark hole. No notification, nothing. However, my billing statement showed that I indeed have sent the messages. That&#39;s a covert C&amp;amp;C channel for you!&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Summing up the features of a new (at least for me) SMS C&amp;amp;C protocol:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Binary text messages received to a custom port are not displayed in any way (not even in a form of notification) - that means no more &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;abortBroadcast()&lt;/span&gt; nonsense and no problems with KitKat and above!&lt;/li&gt;
&lt;li&gt;They are not saved in the &quot;Sent&quot; folder!&lt;/li&gt;
&lt;li&gt;They require the same permissions as &quot;normal&quot; text messages.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
So go and have fun with binary text messages during Christmas! If you&#39;d like to experiment with them as I did, I suggest you use the &lt;a href=&quot;https://code.google.com/p/krvarma-android-samples/source/browse/#svn%2Ftrunk%2FSMSDemo&quot;&gt;kvarma-android-samples SMSDemo app&lt;/a&gt;&amp;nbsp;which I also conveniently &lt;a href=&quot;https://github.com/maldroid/samples/blob/master/krvarma-android-samples-smsdemo.apk&quot;&gt;compiled and signed just for you&lt;/a&gt;! Usual disclaimer: I do not take any responsibility for your phone bill or any other material and non-material damage the app makes to your phone or to you.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Have fun!&lt;/div&gt;
&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2014/12/iran-secret-text-messages-and-toy-for.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqrEDA2-2DVu11CUh31H8hhRZnzKJ1x5P13lEuEvuj4YWuOC_JrLEQ_04_XfnUskgKY3gHZYyUHgRcj-v8jr7sD1lGbZNl2KGP_tkE2yI2c-JdaST6re4u4qqaYaYR5zFlHSWWFeLMjsY/s72-c/splash.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-9055722272594102244</guid><pubDate>Mon, 15 Dec 2014 10:00:00 +0000</pubDate><atom:updated>2014-12-15T10:00:01.103+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">cloudatlas</category><category domain="http://www.blogger.com/atom/ns#">communication</category><category domain="http://www.blogger.com/atom/ns#">encryption</category><category domain="http://www.blogger.com/atom/ns#">malware</category><category domain="http://www.blogger.com/atom/ns#">WhatsApp</category><title>CloudAtlas - commercial-grade Android malware</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
Few days ago Blue Coat published a &lt;a href=&quot;https://www.bluecoat.com/documents/download/638d602b-70f4-4644-aaad-b80e1426aad4/d5c87163-e068-440f-b89e-e40b2f8d2088&quot;&gt;whitepaper about so-called &quot;The Inception Framework&quot;&lt;/a&gt;: a commercial-grade malware used in some more or less targeted attacks. The paper describes the details (with some nice pictures) and outlines &lt;a href=&quot;https://www.virustotal.com/en/file/21b7ab52098b8d3f90f6a36362cba6a68967ae318b07e3ac99757d2d21ba2479/analysis/&quot;&gt;an Android app used in this attacks&lt;/a&gt;. Because AV companies seem to stick with the &quot;CloudAtlas&quot; name in their signatures for this malware I will use the same name. Let&#39;s dive a bit into the most interesting bits, which I haven&#39;t seen in the Android malware before.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
The &quot;you can&#39;t see the log name&quot; trick&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
First things first: it&#39;s a commercial-grade malware and is written as any commercial software would be - one class has a single responsibility, everything is logged and the code looks clean even after the decompilation. If you&#39;re a software engineer in a big company you probably recognize the function names presented on the screenshot below (maybe you even use the same names in your project?).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJGVtIp3wqkfMh9KBOg6orqyfd3E1eal-x_irtozW9YutC_ZrN-wwswuzg5I8BPM6PArflgioseIiGF9Lsx9-2E61WaJNiW1Pn0PhNz-vkoFGl9cb-ZJAP-WyPGlMNpwJKa3WfVs2Y5m8/s1600/programming-cloudatlas.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJGVtIp3wqkfMh9KBOg6orqyfd3E1eal-x_irtozW9YutC_ZrN-wwswuzg5I8BPM6PArflgioseIiGF9Lsx9-2E61WaJNiW1Pn0PhNz-vkoFGl9cb-ZJAP-WyPGlMNpwJKa3WfVs2Y5m8/s1600/programming-cloudatlas.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
It also uses a simple obfuscation techniques that we got used to. It pretends that it&#39;s a &quot;WhatsApp&quot; update, which is a common theme in the commercial-grade malware segment - FinSpy suggested a similar infection vector for its customers. Anyhow, let&#39;s start with a log file, which has a really interesting name that I cannot write. Not because I don&#39;t want to, but because it&#39;s a white character, namely &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;System.getProperty(&quot;line.separator&quot;)&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. This, on Android, should be the newline character (&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;). &amp;nbsp;Below is the code responsible for the logging and, as you can see, static member&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;b&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;holds the name of the logfile.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmxS5DzbZc4_1g0gJt1naZsZ1rwlMWthAiGu4cbG2azfZ0TmjZO1nMArmS1MQ6n0OKQVKU36gJNPGTG3jU2d64HGpBM21nPQSMv_b-iv1nrs1n2-jpMsHs45yiwGOjHHpjvT9dybfRb6M/s1600/logfile-newline.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmxS5DzbZc4_1g0gJt1naZsZ1rwlMWthAiGu4cbG2azfZ0TmjZO1nMArmS1MQ6n0OKQVKU36gJNPGTG3jU2d64HGpBM21nPQSMv_b-iv1nrs1n2-jpMsHs45yiwGOjHHpjvT9dybfRb6M/s1600/logfile-newline.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;The logging&amp;nbsp;&lt;/span&gt;mechanism&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;is pretty extensive - it logs every action so the forensic analysis of the infected phone&amp;nbsp;should be a piece of cake.&lt;/span&gt;&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;C&amp;amp;C hosted on the blog&lt;/span&gt;&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Malware does not seem to use the SMS C&amp;amp;C, it only uses the HTTP. Well, actually it is more complicated then this. It uses a livejournal blogging website with three different blog addresses. These are supposed to look like a legitimate blogging websites (at least according to the Blue Coat whitepaper), but they also contain something extra - a &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;blog-index&lt;/span&gt; tag. Malware searches for this tag and its content, as you can see below.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGg69MVqceLI8JaMnC46-TwGKH-CV4Gh6OWf9W4qYrb5DIGamY2eiKO3-ctkwQ-g5FIsIRy56f5uNjiOnaF4R3GjRqBwxPEuZn7RTdcEJgnsEfahbUaDh7nVie6OFzWFgjbIdAx9io8v8/s1600/cloudatlas-search-blog-index.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGg69MVqceLI8JaMnC46-TwGKH-CV4Gh6OWf9W4qYrb5DIGamY2eiKO3-ctkwQ-g5FIsIRy56f5uNjiOnaF4R3GjRqBwxPEuZn7RTdcEJgnsEfahbUaDh7nVie6OFzWFgjbIdAx9io8v8/s1600/cloudatlas-search-blog-index.png&quot; height=&quot;318&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This search returns one or more base64 encoded strings. After the decoding there is also some kind of a custom encryption scheme, some part of which is presented below. If you want to know more see the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;g&lt;/span&gt;, &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;i&lt;/span&gt; and &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;c&lt;/span&gt; classes in the sample.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGkLHT69kwVw7MIF0jtASuVxDzuT_SfEoKCX24n4pmNS8bNJegHdM5PMwMfYatAz_p6oSKjfzkJ6d_VwTGjFu0TtATP379SOjzY5q8lDZ9AAccB_t6ZoNRWxT0_Z_3WNqyEqdJdOyaRnk/s1600/cloudatlas-encryption.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGkLHT69kwVw7MIF0jtASuVxDzuT_SfEoKCX24n4pmNS8bNJegHdM5PMwMfYatAz_p6oSKjfzkJ6d_VwTGjFu0TtATP379SOjzY5q8lDZ9AAccB_t6ZoNRWxT0_Z_3WNqyEqdJdOyaRnk/s1600/cloudatlas-encryption.png&quot; height=&quot;400&quot; width=&quot;377&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This extra tag content provided both the dropzone URL and the commands (or rather &quot;tasks&quot; as it is called in the malware). It should be pointed out that this is a known technique in the Windows malware. Anyhow, very nice feature for an Android malware! I haven&#39;t seen it yet.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
From what I gathered, apart from the features mentioned in the whitepaper (call and audio recording, location, contacts, text messages etc.), this malware could also load a DEX file downloaded from the C&amp;amp;C server. Another nice feature, right? Also, it has an awful lot of log comments in Hindi. Overall, well-written and somewhat creative malware.&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2014/12/cloudatlas-commercial-grade-android.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJGVtIp3wqkfMh9KBOg6orqyfd3E1eal-x_irtozW9YutC_ZrN-wwswuzg5I8BPM6PArflgioseIiGF9Lsx9-2E61WaJNiW1Pn0PhNz-vkoFGl9cb-ZJAP-WyPGlMNpwJKa3WfVs2Y5m8/s72-c/programming-cloudatlas.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-7737978365883143959</guid><pubDate>Mon, 24 Nov 2014 20:33:00 +0000</pubDate><atom:updated>2014-11-24T20:33:05.656+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">Koler</category><category domain="http://www.blogger.com/atom/ns#">PornDroid</category><category domain="http://www.blogger.com/atom/ns#">ransomware</category><title>How does the PornDroid (aka Koler) work?</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
Recently &lt;a href=&quot;http://malware.dontneedcoffee.com/2014/10/the-worst-of-windows-police-locker-is.html&quot;&gt;Kafeine identified a CP ransomware for Android&lt;/a&gt;. The idea was the same as with the previously identified one for Windows. Victims were presented with the Child Pornography pictures, their browsing history and their image (snapped from a camera) plus some phone-identifying features. The message said that some FBI/PRISM/NSA or any other entity wants you to pay a &quot;fine&quot; in order to unlock your computer. Pretty standard ransomware, &lt;a href=&quot;http://maldr0id.blogspot.com/2014/10/android-ransomware-with-direct3d-dll.html&quot;&gt;not unlike the one I previously described&lt;/a&gt;. But, unlike the one mentioned in previous posts, this one was actually a little more complex. So, if you want a general overview, go to the Kafeine post and I&#39;ll present a look under the hood here.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
How to do a ransomware?&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Well, it&#39;s not that easy. As we&#39;ve seen previously you can just display a message every couple of seconds. We&#39;ve seen that the previous app used &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;scheduleAtFixedRate&lt;/span&gt; function to ensure that the lock message is always displayed. This app also makes sure that it is always visible, but does it using a &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;startActivity&lt;/span&gt; at some predefined time. Activity is just a ransomware window. Even if you navigate to some other window, a background service will make sure that the ransmoware is on the top. Take a look at the simple code below that does just that.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqlEvUmNpPyf3zr7nFKkqsaKP33Fuz732iwgQMDPg_VYY2xEFqAbIUJf6eZmOkeiZPG9WVXn_XBeZr_kCIuAjwVAs-sYDMrjUWQUkd5S9GJMjd_ffu8cUrkqfp4IEqpQ2fRFg5xZ-N0Ng/s1600/porndroid-startActivity.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqlEvUmNpPyf3zr7nFKkqsaKP33Fuz732iwgQMDPg_VYY2xEFqAbIUJf6eZmOkeiZPG9WVXn_XBeZr_kCIuAjwVAs-sYDMrjUWQUkd5S9GJMjd_ffu8cUrkqfp4IEqpQ2fRFg5xZ-N0Ng/s1600/porndroid-startActivity.png&quot; height=&quot;331&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
That was easy. However, you also have to make sure that you can unlock a phone after user pays the ransom. From what I&#39;ve seen ransomware cybercriminals make sure that, if the payment was made correctly, your computer or smartphone is unlocked. Previously described app made it by checking the C&amp;amp;C response. This one does it in a different, more interesting way. It exposes a JavaScript API that gives the attacker shell on your phone. Ransom message is just a website, so the attacker can use e.g. AJAX to control your smartphone. JS API is exposed using a &lt;a href=&quot;http://developer.android.com/reference/android/webkit/JavascriptInterface.html&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;JavascriptInterface&lt;/span&gt;&lt;/a&gt; decorator (or Annotation as it is called in Java) and exposes three methods, as you can see below.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm_mW-FuI6dB3BfbRHSFAH-wEfxcHOXtQ6hbKkgQQORy1eBFoT_iJuR480rj7uHm8qoOin-3kOg0pjhhXnftmHkTejG8MOKbu_SunV-GNtI5xxNXyql1sHg2oR24VJRh91RvlBiMG4gwM/s1600/porndroid-exposedjs.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm_mW-FuI6dB3BfbRHSFAH-wEfxcHOXtQ6hbKkgQQORy1eBFoT_iJuR480rj7uHm8qoOin-3kOg0pjhhXnftmHkTejG8MOKbu_SunV-GNtI5xxNXyql1sHg2oR24VJRh91RvlBiMG4gwM/s1600/porndroid-exposedjs.png&quot; height=&quot;422&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;
Some tricks&lt;/h3&gt;
&lt;div&gt;
This malware uses also some &quot;encryption&quot; tricks like reversing strings represented as bytes (see below).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijXzZ5xGRccoYtEir7-1OT2seuPPkG9hEaT5013VSjLStkTuG2gAMA5sJGhYdaOEWlZZCe6c7vMOI1A_TnErQh9TfDFQTe6yf7i2q9i2uq3z1gQ2tOPsiES6u5Bx_wFIEpEzRe9GrQeB4/s1600/encryption.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijXzZ5xGRccoYtEir7-1OT2seuPPkG9hEaT5013VSjLStkTuG2gAMA5sJGhYdaOEWlZZCe6c7vMOI1A_TnErQh9TfDFQTe6yf7i2q9i2uq3z1gQ2tOPsiES6u5Bx_wFIEpEzRe9GrQeB4/s1600/encryption.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
It also uses Interfaces extensively so that you will lost a count of what class represents what. This is a really nice obfuscation technique, which is, coincidentally, also the underlying technology for the Java Spring framework. Other nice feature is the fact that if you try to get rid of the application Device Admin privileges, it will lock your phone and display a message confirming the action (see below).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwKqBzQrw9ipusGfvpc4WiGs78FMKEJX5mdD3sqpvgCnU1nrWS6LH5KeteY1PyUGnFTWWDzrBRTGv_muabclPDNg43KoHk-e_o-4z3leUz8ECVrBiu_GzTAjPswdkxOLqu9qM0EqcG-5c/s1600/lock-screen.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwKqBzQrw9ipusGfvpc4WiGs78FMKEJX5mdD3sqpvgCnU1nrWS6LH5KeteY1PyUGnFTWWDzrBRTGv_muabclPDNg43KoHk-e_o-4z3leUz8ECVrBiu_GzTAjPswdkxOLqu9qM0EqcG-5c/s1600/lock-screen.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
There is also one other obfuscation technique that was not used in this particular sample, but the code is written in such a way that it made me think of a subtle Java based obfuscation. See, when you have Interfaces in Java you can use any class that implements that Interface. You can also use reflection to load that class (so that you don&#39;t have those pesky imports). Now, let&#39;s assume that you have several implementations of one Interface - as it is usually a case. Now, you start an activity using an Intent and send the appropriate location of the class that implements Interface as that Intent parameter.&lt;br /&gt;
&lt;br /&gt;
Not only that, but you can take it one step further. Instead of simply sending a fully qualified class name, you can send a hash of class name. Then just go trough every class name and compare it with hash. This is a variation of the technique used in Windows malware to load DLLs or DLL functions. The researchers will have no idea which class you are using. However, unlike in the case of Windows malware you still have an Interface to interact with, so you will have those IDE tips and auto-completion. Win-win, right?&lt;/div&gt;
&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2014/11/how-does-porndroid-aka-koler-work.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqlEvUmNpPyf3zr7nFKkqsaKP33Fuz732iwgQMDPg_VYY2xEFqAbIUJf6eZmOkeiZPG9WVXn_XBeZr_kCIuAjwVAs-sYDMrjUWQUkd5S9GJMjd_ffu8cUrkqfp4IEqpQ2fRFg5xZ-N0Ng/s72-c/porndroid-startActivity.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-3278139813761808375</guid><pubDate>Sun, 19 Oct 2014 20:44:00 +0000</pubDate><atom:updated>2015-05-15T21:11:34.041+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">droidjack</category><category domain="http://www.blogger.com/atom/ns#">Sandrorat</category><title>How to check for a root access in three ways (plus a C&amp;C demo!)</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
Recently I have found a sample of DroidJack, which is somehow the same as &lt;a href=&quot;http://maldr0id.blogspot.co.uk/2014/09/sandroid-rat-analysis-part-i-synthetic.html&quot;&gt;Sandrorat described previously&lt;/a&gt;. Well, it is probably created by the same author or at least on the same code base. What leads me to that conclusion? Well, see it for yourself in the screenshot below.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZyNBc-N3GWcKvz0W_5RolDwtO6RVZ6l_cM99R1LDQLGxNtYSAZRoUzT7-OCf35b8Vx4nrd8uWHerzmXNxPtKYbCjvdIR2X1oOMmMvV4yfFN9Vp8uF4B_sjqs80Fh_Vvrgf_gywJ5Q4ic/s1600/Zrzut+ekranu+z+2014-10-19+17:01:16.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;211&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZyNBc-N3GWcKvz0W_5RolDwtO6RVZ6l_cM99R1LDQLGxNtYSAZRoUzT7-OCf35b8Vx4nrd8uWHerzmXNxPtKYbCjvdIR2X1oOMmMvV4yfFN9Vp8uF4B_sjqs80Fh_Vvrgf_gywJ5Q4ic/s1600/Zrzut+ekranu+z+2014-10-19+17:01:16.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
How does the DroidJack C&amp;amp;C look like? I&#39;ve found this little GIF demo in one of the DroidJack ads (if you haven&#39;t seen it already this means that &lt;a href=&quot;https://twitter.com/maldr0id&quot;&gt;you don&#39;t follow me on Twitter and you should&lt;/a&gt;):&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPNIU0TkUQ0BuY7JYYkqhzWPs6pfB5DamGjfGfBWMFnZgtDXcZ4JtEa4hsZvj9chCIoXZwZ1oomTkKhqj_BvZyK59P-TMNXbmgxYfOmKuXkY3k6UPCzRmJ_Ft02706-suG7R_opRA-CIo/s1600/droidjack-demo.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPNIU0TkUQ0BuY7JYYkqhzWPs6pfB5DamGjfGfBWMFnZgtDXcZ4JtEa4hsZvj9chCIoXZwZ1oomTkKhqj_BvZyK59P-TMNXbmgxYfOmKuXkY3k6UPCzRmJ_Ft02706-suG7R_opRA-CIo/s1600/droidjack-demo.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
So, the pretty much standard stuff for the more complex Android malware: you can do everything and get a &quot;binder&quot; i.e. program that lets you add DroidJack &quot;features&quot; to the benign apps. What else did the author of DroidJack and Sandrorat made? &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.xtraware.sandroid&quot;&gt;This app available in Play Store that is a kind of Sandrorat in reverse&lt;/a&gt;&amp;nbsp;-&amp;nbsp;you can use a mobile phone to &quot;control&quot; your computer.&lt;br /&gt;
&lt;h3&gt;
Checking for root in three ways&lt;/h3&gt;
&lt;div&gt;
Enough about the authors, let&#39;s go to the main point of this post. I find a way that DroidJack checks for the root permissions on the device rather interesting. Important note is that this malware does not depend on the root permissions, it just checks if it has them. And, as you probably know, if you have rooted your phone and you have given root permissions to any suspicious app, you&#39;re most certainly fucked.&lt;br /&gt;
&lt;br /&gt;
First way of checking if the phone is rooted is the usual checking of the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;su&lt;/span&gt; availability using &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;which&lt;/span&gt; command. Nothing too fancy, as you can see on a screenshot below.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiauranLpexiQDMGUCl6Sgf9-jwDGoQPY4OjecK0myR2n3iomNV1H5kXulxFVsRiH84Xnlkje9sQSw1FlppI_hQTsimmVO93z0e34gR2EPco1HqHkzLSHh4gVuMJ2VwAMfQ3lgaxVf73eA/s1600/Zrzut+ekranu+z+2014-10-19+22:29:19.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;209&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiauranLpexiQDMGUCl6Sgf9-jwDGoQPY4OjecK0myR2n3iomNV1H5kXulxFVsRiH84Xnlkje9sQSw1FlppI_hQTsimmVO93z0e34gR2EPco1HqHkzLSHh4gVuMJ2VwAMfQ3lgaxVf73eA/s1600/Zrzut+ekranu+z+2014-10-19+22:29:19.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Next up is a not-so-common checking for the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Superuser.apk&lt;/span&gt; application. Pictured in the screenshot below.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhewBgKMinrb40FV2wv8JGFLRJc_A9k8c-vF7IpVceYiO1M62Y1iS9YotAi9WsGn7ucH6f1Oaek5eMPk2y3RN2usRf3HTgRFb619IbLzEPTVYWE8ixUy7mLj7wX62jqNxuarsSeKrUBNTw/s1600/Zrzut+ekranu+z+2014-10-19+22:31:44.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;177&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhewBgKMinrb40FV2wv8JGFLRJc_A9k8c-vF7IpVceYiO1M62Y1iS9YotAi9WsGn7ucH6f1Oaek5eMPk2y3RN2usRf3HTgRFb619IbLzEPTVYWE8ixUy7mLj7wX62jqNxuarsSeKrUBNTw/s1600/Zrzut+ekranu+z+2014-10-19+22:31:44.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Finally, something that I see for the first time. Checking if the build is signed with test-keys. This is a popular way of signing custom ROMs and, presumably, if you have a custom ROM, you most likely also rooted your phone. While this may be a kind of bet, it&#39;s fair to say that it&#39;s a safe one.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo1dX8fGW6dAr9lOGmn-cqQ6EbxV2ZSaoiJ5CsJqmuXihfV1X3841Y9r2U4dZ-QMhMB-KvjmsWQCcCyB6E1EfQ00-mKdKPZDe_7ycPBcEpSLoHZW307Ri1kUBseKBn9U0_UEQMdI2cam8/s1600/Zrzut+ekranu+z+2014-10-19+22:34:40.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;100&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo1dX8fGW6dAr9lOGmn-cqQ6EbxV2ZSaoiJ5CsJqmuXihfV1X3841Y9r2U4dZ-QMhMB-KvjmsWQCcCyB6E1EfQ00-mKdKPZDe_7ycPBcEpSLoHZW307Ri1kUBseKBn9U0_UEQMdI2cam8/s1600/Zrzut+ekranu+z+2014-10-19+22:34:40.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
I&#39;ll try to look at this DroidJack sample a little more. Meanwhile, let&#39;s play &quot;The Price is Right&quot;! What do you think this piece of malware cost? $20? $50? Surely not over a $100, right? Have a look at the illustrated answer below.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxf1LtzmGnsp5OblAQRPDBU30syVu5e8jV80UkK1zJL5-s-pQTo7-GC3PBrkeQ9RrcZ3U6u0khfPp-fcb-zTpz9gdyrDYP9M0yzpm0-_I6YJgrPcMof94xMzjB23gQZDmdZWbRSXGARpA/s1600/price.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxf1LtzmGnsp5OblAQRPDBU30syVu5e8jV80UkK1zJL5-s-pQTo7-GC3PBrkeQ9RrcZ3U6u0khfPp-fcb-zTpz9gdyrDYP9M0yzpm0-_I6YJgrPcMof94xMzjB23gQZDmdZWbRSXGARpA/s1600/price.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
And for that little price it stays with you for the eternity...&lt;/div&gt;
&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2014/10/how-to-check-for-root-access-in-three.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZyNBc-N3GWcKvz0W_5RolDwtO6RVZ6l_cM99R1LDQLGxNtYSAZRoUzT7-OCf35b8Vx4nrd8uWHerzmXNxPtKYbCjvdIR2X1oOMmMvV4yfFN9Vp8uF4B_sjqs80Fh_Vvrgf_gywJ5Q4ic/s72-c/Zrzut+ekranu+z+2014-10-19+17:01:16.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-5440093308109852509</guid><pubDate>Tue, 14 Oct 2014 18:55:00 +0000</pubDate><atom:updated>2014-10-14T19:55:40.740+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">FinFisher</category><category domain="http://www.blogger.com/atom/ns#">FinSpy</category><category domain="http://www.blogger.com/atom/ns#">WhatsApp</category><title>WhatsApp with FinSpy?</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
I think you heard about the infamous FinSpy by FinFisher. If you haven&#39;t it&#39;s basically something like a &lt;a href=&quot;https://wikileaks.org/spyfiles4/documents.html&quot;&gt;cloud one-way backup app paid by (someone&#39;s) taxes&lt;/a&gt;&amp;nbsp;(and there&#39;s a &lt;a href=&quot;https://wikileaks.org/spyfiles4/documents/FinSpy-Mobile-Video.wmv&quot;&gt;&lt;strike&gt;movie&lt;/strike&gt; really shitty render&lt;/a&gt;!). Anyhow, the mobile version seems old news, as it was unveiled some time ago and even one AV vendor called it nothing new in terms of features. Well, I guess it depends on how you define a feature. But enough of this rant, let&#39;s go and see what a commercially made malware looks like.&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I&#39;ve analyzed the newest sample that I could find and it&#39;s a couple of months old (md5:&amp;nbsp;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;a href=&quot;https://www.virustotal.com/en/file/84d231e6ea1e2e3283c3e9cbfcabeded0d7e5723852e378e0caf5bb001501938/analysis/&quot;&gt;d6a3ca6e48512890d013e922307e1593&lt;/a&gt;&lt;/span&gt;). It has some usual features, like SMS reading and so on, but today let&#39;s have a look at one particular feature: WhatsApp eavesdropping. WhatsApp is a &lt;a href=&quot;http://www.whatsapp.com/&quot;&gt;very popular messaging app&lt;/a&gt;. Probably it was chosen by FinFisher due to its popularity or maybe just because one of the clients requested &quot;support&quot; for it.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
But before we begin let me state that this malware is one of the best written malwares I&#39;ve seen in a long time, in terms of coding. It properly uses Intents, has a nice, commercial-grade class structure with clear responsibilities for each component. It is truly a commercially developed malware and up to the market standard. Nice to see some clean code once in a while. But I guess this is what you should expect from a malware which price starts&amp;nbsp;&lt;a href=&quot;https://wikileaks.org/spyfiles4/customers.html&quot;&gt;at 200000 (that&#39;s two hundred thousand) Euros&lt;/a&gt;.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Decoding WhatsApp&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
FinSpy can only decode older, &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;.crypt &lt;/span&gt;files created by WhatsApp. First, how does it have access to the message database without needing a rooted phone? It&#39;s really simple. WhatsApp performs message backups every day. This backups are saved in the&amp;nbsp;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;/sdcard/WhatsApp/Databases&lt;/span&gt; directory (take a look yourself). They are of course encrypted, using AES cipher. New version uses &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;crypt7&lt;/span&gt; extension and a new key derivation algorithm (key is saved in the private app folder). Older version used &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;crypt5&lt;/span&gt; extension and key was derived from the Google account name. Even older version simply used &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;crypt&lt;/span&gt; extension and was using... hardcoded key.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The hardcoded key was&amp;nbsp;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;4j#e*F9+Ms%|g1~5.3rH!we,&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;and is well-known now (well, at least at some corners of the Net). FinSpy can decode those message databases and the decoding routine is in the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;com.android.services.WhatsApp.a&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; class, as pictured below (hardcoded key is&amp;nbsp;&lt;/span&gt;highlighted&lt;span style=&quot;font-family: inherit;&quot;&gt;).&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-w2nRACx4dqU3nDbvb6LlyeFGk0YugPLZLDX4HnSiPh4Hlpe7BVbP6R-mRmFZHSaGdIcuP034xCniRsZ-mc0JoWpugpuyTwbc6zYTtlWVTYOKCAeA4kl1i4HeO6BHx0kwEZmk_pCFL1A/s1600/Zrzut+ekranu+z+2014-10-14+20:26:56.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-w2nRACx4dqU3nDbvb6LlyeFGk0YugPLZLDX4HnSiPh4Hlpe7BVbP6R-mRmFZHSaGdIcuP034xCniRsZ-mc0JoWpugpuyTwbc6zYTtlWVTYOKCAeA4kl1i4HeO6BHx0kwEZmk_pCFL1A/s1600/Zrzut+ekranu+z+2014-10-14+20:26:56.png&quot; height=&quot;132&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;The decoded file is then saved to the FinSpy folder and analyzed. This is done each time an&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;android.intent.action.MEDIA_SCANNER_FINISHED&lt;/span&gt; is received (so presumably there&#39;s been a file changed on the SD card).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Let&#39;s see whats the analysis made of. First malware creates a &quot;tmp521&quot; +&amp;nbsp;System.currentTimeMillis() + &quot;.dat&quot; file where it stores temporary information and is then renamed according to the similar pattern, but without the &quot;tmp&quot; prefix. It saves time (and timezone information), user id and, of course, the message text itself. The format for it seems to be:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;formatted_time&amp;gt;[TAB]&amp;lt;from_id_or_number&amp;gt;[TAB]&amp;lt;to_id_or_number&amp;gt;[NEWLINE]&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;message&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
It has a nice parsing code, which remembers to add plus (+) before the number, strips the unnecessary &quot;whatsapp.net&quot; from the remote identifier and get user account name from local accounts (because it is not saved in the database). The part that gets the user account name is presented below, the parsing part was to big and boring to include.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoSV_xyNRwjC2sPiWUF0vQ4v57-aUg_ZGcxfGsTv7Uh07NDZz6VXKx6ZQi723QmCv080PKpFx_IbdNoBXb2kuq6JfzcT8r2tof1bqvqeB7izog2qbJWCSItOTyo-sjJSJMrN2f2RMVdBY/s1600/Zrzut+ekranu+z+2014-10-14+20:43:19.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoSV_xyNRwjC2sPiWUF0vQ4v57-aUg_ZGcxfGsTv7Uh07NDZz6VXKx6ZQi723QmCv080PKpFx_IbdNoBXb2kuq6JfzcT8r2tof1bqvqeB7izog2qbJWCSItOTyo-sjJSJMrN2f2RMVdBY/s1600/Zrzut+ekranu+z+2014-10-14+20:43:19.png&quot; height=&quot;182&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
So I guess that&#39;s it about the FinSpy WhatsApp &quot;support&quot;. However, this is not the last time that I will be analyzing this app, as it is packed with interesting code and is, surprisingly, not too obfuscated. The chilling part is that they are really committed to writing malware and reversing the popular apps in order to gain advantage. Perhaps even more chilling is the fact that WhatsApp used to save our messages, almost unencrypted, on the SD card for anyone to see. Well, it has changed now, but maybe FinSpy has been updated too. Who knows...&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2014/10/whatsapp-with-finspy.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-w2nRACx4dqU3nDbvb6LlyeFGk0YugPLZLDX4HnSiPh4Hlpe7BVbP6R-mRmFZHSaGdIcuP034xCniRsZ-mc0JoWpugpuyTwbc6zYTtlWVTYOKCAeA4kl1i4HeO6BHx0kwEZmk_pCFL1A/s72-c/Zrzut+ekranu+z+2014-10-14+20:26:56.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-2483688549649292897</guid><pubDate>Sat, 11 Oct 2014 09:59:00 +0000</pubDate><atom:updated>2015-02-02T22:00:47.446+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">cicio</category><category domain="http://www.blogger.com/atom/ns#">communication</category><category domain="http://www.blogger.com/atom/ns#">encryption</category><category domain="http://www.blogger.com/atom/ns#">FUD</category><title>(Almost) a FUD: another &quot;Porn App&quot;, this time Italian</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
I like FUDs, because they must show creativity either in packing or in the code. Anyhow, they are almost always interesting to analyze. Recently I came across a &quot;porn&quot; app targeting Italy (md5:&amp;nbsp;&lt;a href=&quot;https://www.virustotal.com/en/file/1a3d66a1b2df2fd4ef6d633a38acea075fa8f0d02e48767de576bc999de806b4/analysis/&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;0995aceaeb8e338aff542ab3f1d8dab4&lt;/span&gt;&lt;/a&gt;). When you run it it displays an &lt;a href=&quot;http://ansa.it/&quot;&gt;ansa.it&lt;/a&gt; website, which I guess is a kind of Italian news site. But what it does in the background is really interesting.&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Quick look&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
First off the app is still in the making and let me tell you the author devotes 5 hours a day to make it work! He (or she) is really trying to make it both FUD and powerful and I have to tell you that it starts to shape up with some nifty features. There are still a lot of blanks, which maybe will be filled in in the future. Look at this beautiful icon (remember that it is supposed to be a porn app):&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG6BHQv7Lb6WHROKprhZ_g1ubStcI9VHX-t0RXX8kyR1qZUkgPUmIJftdqAwD3yJ5VSCxy1YLZKQPDtZnL_SFSacLiQOmux5pKR8Yjxzl7obfIn2xrz8ah0L6ahDe-RqAmsK1yb6FoQSM/s1600/icon.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG6BHQv7Lb6WHROKprhZ_g1ubStcI9VHX-t0RXX8kyR1qZUkgPUmIJftdqAwD3yJ5VSCxy1YLZKQPDtZnL_SFSacLiQOmux5pKR8Yjxzl7obfIn2xrz8ah0L6ahDe-RqAmsK1yb6FoQSM/s1600/icon.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Second up, the strings. They are encrypted using DES encryption in a &lt;a href=&quot;http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_codebook_.28ECB.29&quot;&gt;famous Adobe mode&lt;/a&gt;&amp;nbsp;with &quot;Some Key&quot; key. All of the strings seem to be encrypted, even the ones popular in Android apps like &quot;pdus&quot; or &quot;com.android.launcher.action.INSTALL_SHORTCUT&quot; action. And this action is used to create a shortcut on your desktop with the same icon as above.&lt;br /&gt;
&lt;br /&gt;
Some of the telephone info is send to a C&amp;amp;C server located in San Marino (that&#39;s new, right?). Below is a list of stolen data.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI4wYTMo8W7QbpM1fpiUnsrKoyK9wmXpM0QTS-M3NPeHahwldy4drtoIlMfID2NeDWY9gtnahKzYJc4KFNgdxQFau8_c204m-v7b7yGkT4wFZ3Y8dpPLcjy5Uf8dYSVJGhfIPbGnjX0RA/s1600/Zrzut+ekranu+z+2014-10-11+09:44:07.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI4wYTMo8W7QbpM1fpiUnsrKoyK9wmXpM0QTS-M3NPeHahwldy4drtoIlMfID2NeDWY9gtnahKzYJc4KFNgdxQFau8_c204m-v7b7yGkT4wFZ3Y8dpPLcjy5Uf8dYSVJGhfIPbGnjX0RA/s1600/Zrzut+ekranu+z+2014-10-11+09:44:07.png&quot; height=&quot;184&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Now to the interesting parts! It has a kill switch implemented, which activates after some predefined time. Before this time a specified number can send a short message instructing the app to send SMS to another number. This is probably done to facilitate the Premium SMS feature, where the attacker can make money out of paid subscription services. Unfortunately no number was provided in the sample. After the kill switch gets activated the SMS sending features are disabled.&lt;br /&gt;
&lt;br /&gt;
Other interesting functionality is the Hidden Browser. This is an Activity that displays a website in the background using &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Theme.NoDisplay&lt;/span&gt; and &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;excludeFromRecents&lt;/span&gt; parameters in the AndroidManifest file, as shown below. As you can see &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;MainActivity&lt;/span&gt; uses the same tricks.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBRP62mRdFkLCeC9wW0ga8nT5vI6n7JwO9Cr4Un4aSzrXjdlcK5axZe9lcEIDqGPqAlOb6hbfqzpMAURfYna37Uavt23vGbZd7Udqk353A0RL4_bmqXPyTj4zZay3Z4ke6MaNnKPy1ZPg/s1600/Zrzut+ekranu+z+2014-10-11+10:01:30.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBRP62mRdFkLCeC9wW0ga8nT5vI6n7JwO9Cr4Un4aSzrXjdlcK5axZe9lcEIDqGPqAlOb6hbfqzpMAURfYna37Uavt23vGbZd7Udqk353A0RL4_bmqXPyTj4zZay3Z4ke6MaNnKPy1ZPg/s1600/Zrzut+ekranu+z+2014-10-11+10:01:30.png&quot; height=&quot;80&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This activity can open a website and then, when the page is loaded, open a different URL or execute a piece of JavaScript code by passing the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;javascript:&lt;/span&gt;&amp;nbsp;&quot;protocol&quot; to &lt;a href=&quot;http://developer.android.com/reference/android/webkit/WebView.html#loadUrl(java.lang.String)&quot;&gt;loadUrl of the WebView&lt;/a&gt;. In this, what I believe to be a test sample, executed JavaScript was just a simple redirect. Moreover, at least for now, the executed JavaScript is hardcoded to be a redirect and there is no way to change it other then rebuilding the app.&lt;br /&gt;
&lt;br /&gt;
Hidden Browser is meant to be run using an Intent and has an Extra String called &quot;link&quot; specifying the redirect. The page that is opened up before the redirection was hardcoded to be google.com. Using this Activity you can covertly make the Android visit a specific website.&lt;br /&gt;
&lt;br /&gt;
It also gains persistence using a standard &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;BOOT_COMPLETED&lt;/span&gt; Broadcast Receiver.&lt;br /&gt;
&lt;h3&gt;
Summary&lt;/h3&gt;
&lt;div&gt;
Both strings and permissions show that the next implemented feature will be stealing contacts. Let&#39;s wait and see how the app will evolve. In the meantime, for all the Blade Runner fans, this is an excerpt from an app certificate:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Issuer&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; DN: C=IT, ST=Italy, L=Rome, O=Tyrrel Corporation, OU=R&amp;amp;D, CN=Marco Rossi&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; C: IT&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; CN: Marco Rossi&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; L: Rome&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; O: Tyrrel Corporation&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; S: Italy&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; OU: R&amp;amp;D&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2014/10/almost-fud-another-porn-app-this-time.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG6BHQv7Lb6WHROKprhZ_g1ubStcI9VHX-t0RXX8kyR1qZUkgPUmIJftdqAwD3yJ5VSCxy1YLZKQPDtZnL_SFSacLiQOmux5pKR8Yjxzl7obfIn2xrz8ah0L6ahDe-RqAmsK1yb6FoQSM/s72-c/icon.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-1475905674858774800</guid><pubDate>Fri, 03 Oct 2014 19:10:00 +0000</pubDate><atom:updated>2014-10-03T20:10:07.699+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">communication</category><category domain="http://www.blogger.com/atom/ns#">encryption</category><category domain="http://www.blogger.com/atom/ns#">prepaid</category><category domain="http://www.blogger.com/atom/ns#">ransomware</category><title>Android ransomware with a Direct3D DLL</title><description>Recently I came across the Android ransomware sample (sha256:&amp;nbsp;&lt;a href=&quot;https://www.virustotal.com/en/file/c0cb135eef45bb8e411d47904ce638531d53473729c7752dc43c6d55d5ed86f8/analysis/&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;c0cb135eef45bb8e411d47904ce638531d53473729c7752dc43c6d55d5ed86f8&lt;/span&gt;&lt;/a&gt;). This sample is interesting for a couple of reasons, but there is one truly bizarre property of this APK file. It has a raw file included, which actually was a &lt;a href=&quot;https://www.virustotal.com/en/file/996e5b57c06b5614ee7b26936b29bace62218fb3cad3a28dba9e72bcc66d2698/analysis/&quot;&gt;Direct3D library signed by Microsoft&lt;/a&gt;. Why a Windows-based DLL file is included in the APK file is just beyond me. Anyhow, let&#39;s get back to business and have a look at the sample and what it does.&lt;br /&gt;
&lt;h3&gt;
Quick look&lt;/h3&gt;
&lt;div&gt;
First things first. The app pretends to be a NFS Hot Pursuit Android game, straight from the EA. Both the app name and the icon look like a legitimate game. However, upon running, it displays a screen with an information that your phone has been blocked due to the fact that the user watched child pornography. The ransomware targets both Russians and Ukrainians and has text in both languages. The code below checks whether the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;SimCountryIso&lt;/span&gt; is equal to &quot;ua&quot; and changes the displayed text accordingly.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSX5yHTMhvHBRvVC32vSbHW8v39Kc-2DynOwRRrfAaqBgTJywOyVtHx8xT1tcdAlD_NQxsWTkgM4WUcQnRs8gknpfDmJ2j60qQxlNzLi_CKvMEjukcNaa5esE6VwjzdxeQ4uhJhGj4Nzs/s1600/targetting_ua.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSX5yHTMhvHBRvVC32vSbHW8v39Kc-2DynOwRRrfAaqBgTJywOyVtHx8xT1tcdAlD_NQxsWTkgM4WUcQnRs8gknpfDmJ2j60qQxlNzLi_CKvMEjukcNaa5esE6VwjzdxeQ4uhJhGj4Nzs/s1600/targetting_ua.png&quot; height=&quot;96&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The &quot;fine&quot; that has to be paid is equal to either 100&amp;nbsp;hryvnia (8 dollars!) or 500 ruble (~ 13 USD). The fine has to be paid by either the&amp;nbsp;QIWI VISA WALLET, which is a kind of prepaid wallet popular in Russia or by (and this is the fun part) adding funds to a prepaid phone! There is an instruction included on how to add funds to that phone. This instruction is provided below. I don&#39;t know either Ukrainian or Russian, but I used Google Translate and so can you!&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;1. Найдите ближайший терминал.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;2. Подойдите к терминалу и выберете пополнение счета&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;3. Введите номер телефона +380685815686 и нажмите далее&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;4. Вставьте деньги в купюроприемник и нажмите оплатить&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;5. В течении 180 минут после поступления платежа ваш телефон будет разблокирован.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;ВНИМАНИЕ: Попытки разблокировать телефон самостоятельно приведут:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;К полной блокировке вашего телефона и потери всей важной информации(фотографии, видео, музыка).&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;Без дальнейшей возможности разблокирования и восстановления данных. &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
What is also quite interesting is that the number above is provided in plaintext, while the Russian number is encrypted inside the code. So how does the locking actually work? It&#39;s plain and simple. First, we set up an &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ExecutorService&lt;/span&gt; and call the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;a href=&quot;https://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate%28java.lang.Runnable,%20long,%20long,%20java.util.concurrent.TimeUnit%29&quot;&gt;scheduleAtFixedRate&lt;/a&gt;&lt;/span&gt; function. Every second an activity is run. This activity is responsible for displaying the ransom demand above.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq1MJHeH9cgxLyx1U-KW15sOuf2bSs8aUKsP69T_-Wc46A0k4_aw3BXk1U7gt9WuPSi13niVm44CNv6hjEeAYqrLgDqsQPc9l9HjyhD7Kg2Wox-gXzt9RuUFbbvJzncAjy82z3BItgZd8/s1600/ransom-executors.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq1MJHeH9cgxLyx1U-KW15sOuf2bSs8aUKsP69T_-Wc46A0k4_aw3BXk1U7gt9WuPSi13niVm44CNv6hjEeAYqrLgDqsQPc9l9HjyhD7Kg2Wox-gXzt9RuUFbbvJzncAjy82z3BItgZd8/s1600/ransom-executors.png&quot; height=&quot;98&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The second scheduled task checks a URL address. It does so by sending a randomly generated number with device ID using a GET request. If it receives a 200 response code it sets a &quot;STOPE&quot; flag and the application is harmless. That&#39;s the whole &quot;protocol&quot;.&lt;br /&gt;
&lt;br /&gt;
As for the persistence methods it just uses the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;BOOT_COMPLETED&lt;/span&gt; intent to start the activity. It also uses a &lt;a href=&quot;https://developer.android.com/reference/android/os/PowerManager.WakeLock.html&quot;&gt;WakeLock&lt;/a&gt; to ensure that the user does not switch off the device. The fun part is the use of the&amp;nbsp;&lt;a href=&quot;https://developer.android.com/reference/android/content/Intent.html#ACTION_EXTERNAL_APPLICATIONS_AVAILABLE&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;ACTION_EXTERNAL_APPLICATIONS_AVAILABLE&lt;/a&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. It&#39;s an Intent, which is&amp;nbsp;&lt;/span&gt;broadcast&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;when any new&amp;nbsp;set of packages becomes&amp;nbsp;&lt;/span&gt;available&lt;span style=&quot;font-family: inherit;&quot;&gt;, e.g. when user installs an app. This probably prevents user from changing the app context, but it&#39;s just a guess.&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Summary&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;As you have seen this app is rather simple. Well, it&#39;s very primitive even. However it still is virtually undetected (2 AVs from VirusTotal detected it as of 29 September). This fact, combined with a really low ransom demand, can bring a success to the malware campaign.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;i&gt;Adding funds to a prepaid phone? Really?!&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2014/10/android-ransomware-with-direct3d-dll.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSX5yHTMhvHBRvVC32vSbHW8v39Kc-2DynOwRRrfAaqBgTJywOyVtHx8xT1tcdAlD_NQxsWTkgM4WUcQnRs8gknpfDmJ2j60qQxlNzLi_CKvMEjukcNaa5esE6VwjzdxeQ4uhJhGj4Nzs/s72-c/targetting_ua.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-6557814286891798365</guid><pubDate>Mon, 29 Sep 2014 11:56:00 +0000</pubDate><atom:updated>2014-09-29T12:56:28.223+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Mastercard</category><category domain="http://www.blogger.com/atom/ns#">mobile payments</category><category domain="http://www.blogger.com/atom/ns#">NFC</category><category domain="http://www.blogger.com/atom/ns#">Visa</category><title>DoSing NFC prepaid cards: The Mailman Attack</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
It&#39;s time to live up to the blog name - it should not be only about Android after all. Let&#39;s talk Near Field Communication (NFC) and payments. NFC is a relatively simple concept. You have a card with a circular wiring, which induces an electric current if it&#39;s put in the appropriate magnetic field. This field is created by a reader and the current provides the energy for a Javacard-like microchip.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
When it comes to payments, Chip &amp;amp; PIN is a main way to go in Europe. There was a big shift recently - some of the debit (and credit) cards gained NFC communication and with it came a &quot;Chip sans PIN&quot; model for small transactions. This model was also present previously, but used mainly in the parking meters. However, now it has become more and more prevalent and people suddenly became aware that they money might be stolen. Well, it does not really matter that much, the truth is that if the card companies (or banks) can swallow the expenses it is all good. Here I will try to describe two possible attacks on the NFC cards, which are not so obvious. Mind you, this is based on my actual (like in &quot;I have an NFC reader and a stack of NFC payment cards&quot;) research, your experience may vary. Mostly because the payments cards aren&#39;t a monolithic standard - there are different types of even of Visas and MasterCards, different banks save different information to the chip and so on.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;h3 style=&quot;text-align: justify;&quot;&gt;
The Mailman Attack, or DoS attack on the prepaid card&lt;/h3&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
First attack is the attack that can be performed by mailman or someone who has a prolonged access (an hour, maybe slightly more) to our mail. Cards usually come via snail mail. Some of the cards need activation before the NFC capabilities are turned on, but others don&#39;t. The notorious group that favors the latter approach is the prepaid cards. This results in the simple, yet effective way of rendering the card unusable.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
With prepaid cards you usually can&#39;t just withdraw money from the ATM. You have to pay for it. So if I would make the card look usable (i.e. no visible marks), but make it unusable, I would make sure that you will have hard time getting back your money. Or even getting back the money you have paid for your card.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
In order to prevent the replay attacks, there is an Unpredictable Number (UN for short) generated for &amp;nbsp;every transaction. This number is sent then, by the payment terminal, to the bank, where the bank checks the UN signature. And in order to prevent the pre-play attack, there is a transaction counter (called &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ATC&lt;/span&gt;) implemented. This transaction counter is only 2 bytes - one card can perform up to the 65535 (or so) transactions. After that number it is blocked for ever. The UN is a unsigned 4-byte integer. So you cannot just enumerate all of the UNs and then replay the correct answer to the terminal.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
However, transaction counter is incremented when the transaction starts - no matter what the end result will be. So you just have to send &quot;I want to perform transaction&quot; (issue the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;GET PROCESSING OPTIONS&lt;/span&gt; command) and then quit 65535 times. And you effectively block the card for ever. And all of this can be performed wirelessly, without even opening the envelope in which the card is packed (in something like 100 minutes, but it can be performed faster with a dedicated equipment) - hence, The Mailman Attack. And this is how you DoS a credit card.&lt;/div&gt;
&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
The &quot;I know you, therefore I&#39;m your bank&quot; attack&lt;/h3&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Second attack can be performed in the public transport or anywhere when you can come close to the unsuspecting people. Some debit cards, especially Visa, have a very bad habit of leaking too much information trough NFC. MasterCard is somehow more modest in the information it gives - e.g. it does not give the first or last name of the owner. Essentially, the NFC part and the contact parts should be always separated.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Each card has a transaction log. It&#39;s basically what you expect - a log of transactions. It&#39;s kept on a card in order to determine when you have reached your offline payments limit and the card has to enforce transaction to be performed online. This is done so that you don&#39;t have an excessive overdraft on your account. You are allowed to spend a small amount of money without the authorization of your bank. It&#39;s faster that way and we know how credit card companies love speed - it gives you less time to think about your purchase. Card just logs all of the transactions and at some point decided that you have spent too much (or made too many offline transactions) and decides to go online. It&#39;s then free to clear this log.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
But implementing a rolling log of transactions is hard. Well, not hard, just... not worth doing it the proper way. So one of the card companies decided to log all of the transactions - online, offline, contactless, contactfull. And this log is readable via a wireless interface. So now I have a date, amount, currency and, in some rare cases, location of your transaction. Well, this gives me a lot of information - I now if you&#39;re rich and if I can mug you in a dark alley.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Next up is first and last name. While MasterCard specification mentions that it is forbidden to share that data via NFC, the other big card company does not have any problems with it. Last piece of the information is of course the card maker, bank name and card number. Well, bank name and card maker are actually encoded in the card number, so that even does not have to be transmitted - card number is enough. Of course the expiration date is also send via NFC.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
OK, now that we know what we know we just have to use our charm. Come up to a boy or a girl, bump him (now you have read all of the credit card information) say you&#39;re sorry, chat him/her up and get the phone number. Or look it up on some social media site. Anyhow, call your victim and say something like:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;- Good morning, I&#39;m calling from &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;bank_name&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. May I speak with &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;, please?&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;- Are you the owner of the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;credit_card_company&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; card with the number that ends in &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;last_four_digits&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;?&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;- Did you make a transaction on &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;date&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; for &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;amount_of_money&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;?&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Of course, he/she did. We know it.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;- Our fraud detection system (patent pending) has flagged this transaction. In order to process it you have to provide us with the three number code at the back of your card. Can you please read it?&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
And... scene.&lt;/div&gt;
&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Summary&lt;/h3&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Despite all of the drawbacks, I still use NFC cards. Not that I have a choice of course, but if I had a choice I would still stick with them. They are easy to use, the attacks described above are somewhat impractical and - at least for now - too expensive to pull off. There are arguably easier ways to scam you out of your money. But sometimes it really shouldn&#39;t be about the cost of the scam, but about the finesse.&lt;/div&gt;
&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2014/09/dosing-nfc-prepaid-cards-mailman-attack.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-6927324506100061887</guid><pubDate>Tue, 23 Sep 2014 21:17:00 +0000</pubDate><atom:updated>2015-02-02T22:01:09.129+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">communication</category><category domain="http://www.blogger.com/atom/ns#">encryption</category><category domain="http://www.blogger.com/atom/ns#">kitkat</category><category domain="http://www.blogger.com/atom/ns#">SmsSecure</category><category domain="http://www.blogger.com/atom/ns#">thoughtcrime</category><title>Android malware based on SMS encryption and with KitKat support</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
Most of the malware based on the SMS C&amp;amp;C communication channel is not compatible with Android 4.4 KitKat. This is due to the fact that KitKat introduced a concept of one messaging app, which all other apps had to go trough before they send or handle a received text message. This prevented malware from hiding received short messages or sending without saving them in the &quot;Sent&quot; folder.&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Well, it wasn&#39;t hard to predict that this state of affairs wouldn&#39;t last long and that malware authors would eventually catch up. Malware described here not only supports KitKat, but also uses an &lt;a href=&quot;https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms&quot;&gt;open-source SMS encryption tool&lt;/a&gt;&amp;nbsp;as a basis for its code. Let&#39;s have a look at the insides of the new sample (hash: &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;84e2e9e8430792b583d02d3cc1bf8535&lt;/span&gt;) and let&#39;s call it SmsSecure, just for the sake of brevity.&lt;/div&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;h3&gt;
Open-source encryption&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I have to say that I did lie a bit. Well, I didn&#39;t tell the whole truth. Commands sent trough the SMS channel are not encrypted per se. Only the code for secure messaging is used as a basis for this malware, presumably because it supports Android 4.4 out-of-the-box and it is easier to encourage users to install &quot;Secure SMS&quot; application as a main messaging app.&amp;nbsp;It has the same package name, &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;org.thoughtcrime.securesms&lt;/span&gt;&amp;nbsp;and hides main portion of its code in the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;x*&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;(namely &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;xlibs, xservices, xpack, xbroadcast&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;)&lt;/span&gt;&amp;nbsp;subpackages. These are responsible e.g. for sending received text messages to the C&amp;amp;C server.&lt;br /&gt;
&lt;br /&gt;
There are two channels of communication: one trough unencrypted text messages and the other one trough POST requests, which body is encrypted using blowfish. So, all of this talk about &quot;encrypted SMS&quot; is just a scam.&lt;br /&gt;
&lt;h3&gt;
Emulator detection and other techniques&lt;/h3&gt;
&lt;div&gt;
What we are used to is that the Android malware increasingly has a code that detects whether it is run on the emulator or not. There are couple of usual checks (e.g. phone model) and a couple of unusual checks illustrated below.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3un3Pqkc3pihLsS3GUQDueY1a_nNPAZsna7uv2THe7nWQPkvvm7sj5xVWsrxZRD8EXNNpxq52AjtrcSOOu0bxsoTNLXm5zZk_gVXQ5B18PqF0I4dO6N5WktrK672CjPi5wmb3nj-4Vvw/s1600/isEmulator.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3un3Pqkc3pihLsS3GUQDueY1a_nNPAZsna7uv2THe7nWQPkvvm7sj5xVWsrxZRD8EXNNpxq52AjtrcSOOu0bxsoTNLXm5zZk_gVXQ5B18PqF0I4dO6N5WktrK672CjPi5wmb3nj-4Vvw/s1600/isEmulator.png&quot; height=&quot;249&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
Not that frequent technique is checking for the Network Operator and SIM Operator name. These names are hardcoded in the emulator and are equal to &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Android&lt;/span&gt;.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Another interesting feature is the configuration. Configuration is stored as &lt;a href=&quot;http://developer.android.com/reference/android/content/res/Resources.html#openRawResource(int)&quot;&gt;the Raw Resources&lt;/a&gt;, because it is encrypted. Encryption method is Blowfish/CBC (IV=&quot;12345678&quot;)&amp;nbsp;and the key is stored in the resource cleverly called&amp;nbsp;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;blfs.key&lt;/span&gt;&amp;nbsp;and the configuration is encrypted in two files named in the same cunning way:&amp;nbsp;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;config.cfg&lt;/span&gt; and &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;config1.cfg&lt;/span&gt;. However, if you try to just decode the configs using the key provided, you will fail. Key is somewhat &quot;obfuscated&quot; using a &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;byte2hex&lt;/span&gt; function outlined below.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJMSctbUM0nfWWrfcCTHP6iXBCscEJYRNW5d-bvwOyCOqTxF13dlc784qNzRGcWxkyNul-YVL7Qhd3bWFlvdmy_rzodXs5CG4pdcA4ykqr-MMNSwGfKsgw6dod-Ad-mSITy6TcZkrYEPc/s1600/byte2hex.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJMSctbUM0nfWWrfcCTHP6iXBCscEJYRNW5d-bvwOyCOqTxF13dlc784qNzRGcWxkyNul-YVL7Qhd3bWFlvdmy_rzodXs5CG4pdcA4ykqr-MMNSwGfKsgw6dod-Ad-mSITy6TcZkrYEPc/s1600/byte2hex.png&quot; height=&quot;144&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
It takes every byte in the key file, renders it to a hexstring and then construct a new string of this hexstrings. The function that gets the key limits it size to 50 bytes. So instead of the key:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;NfvnkjlnvkjKCNXKDKLFHSKD:LJmdklsXKLNDS:&amp;lt;XObcniuaebkjxbcz&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;we get:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;4e66766e6b6a6c6e766b6a4b434e584b444b4c4648534b443a&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Really clever obfuscation technique. After decrypting the configuration files we get two beautiful XMLs:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;config&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;data rid=&quot;25&quot;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; shnum10=&quot;&quot; shtext10=&quot;&quot; shnum5=&quot;&quot; shtext5=&quot;&quot; shnum3=&quot;&quot; shtext3=&quot;&quot; shnum1=&quot;&quot; shtext1=&quot;&quot;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; del_dev=&quot;0&quot;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url_main=&quot;&quot;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url_data=&quot;&quot;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url_sms=&quot;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url_log=&quot;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; phone_number=&quot;+43676800505476&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt; &amp;nbsp;download_domain=&quot;ttt&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ready_to_bind=&quot;0&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/config&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;config&amp;gt;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;data rid=&quot;25&quot;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; shnum10=&quot;&quot; shtext10=&quot;&quot; shnum5=&quot;&quot; shtext5=&quot;&quot; shnum3=&quot;&quot; shtext3=&quot;&quot; shnum1=&quot;&quot; shtext1=&quot;&quot;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; del_dev=&quot;0&quot;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url_main=&quot;&quot;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url_data=&quot;&quot;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url_sms=&quot;&quot;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url_log=&quot;&quot;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; phone_number=&quot;15555215554&quot;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ready_to_bind=&quot;0&quot; /&amp;gt;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/config&amp;gt;&lt;/div&gt;
&lt;div style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;See if you can spot the fake one. Anyhow, that&#39;s it for the text-based C&amp;amp;C, but what about the HTTP-based dropzone? Well, there isn&#39;t any URL hard coded. The dropzone URL comes via the text command.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;SMS commands&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Each command is send in a following form (the originating number is completely ignored):&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;control_code&amp;gt; &amp;lt;command&amp;gt; &amp;lt;number&amp;gt; &amp;lt;service_code&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Two last values are optional. &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;control_code&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;should be one of the 6-digit predefined codes. &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;service_code&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; is a number to which the logs will be send (as a text messages) and will be updated no matter what the issued command is.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;What are the possible commands? Well, there are eleven of them, listed below.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;START&lt;/span&gt; - starts redirecting all text messages to the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;service_code&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; is ignored) by setting the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;RTB&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; (ready to bind) value to 2 and sending the &quot;Service Started&quot; SMS to the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;number.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;STARTB&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; - starts redirecting all text messages to the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; URL (URLs are for some reason called &quot;buffers&quot;) by setting the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;RTB&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; value to 1 and sending the message as above (but via HTTP).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;STOP&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; - command complimentary to the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;START&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; and &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;STARTB&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; commands. Sets the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;RTB&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; value to 0 and sends &quot;Service stopped&quot; SMS/POST request to the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;DEL&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; - removes the application. Just like that. But you still have to send the correct &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;control_code&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. Sends back the &quot;Delete command received&quot; to the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;SETB&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; - sets what the author calls &quot;Buffers&quot;. These are all the URLs needed for the HTTP communications. URLs are set according to the following pattern:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;number/[1|2|3|4].php&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. First one is used for a ping-back, second one is a dropzone for the captured messages, third one is for the configuration update and the last one is for the logs (e.g. that some action has started).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;CLEARB&lt;/span&gt; - clears the &quot;buffers&quot; i.e. the URLs mentioned above.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;SETP&lt;/span&gt; - sets the phone number that will overwrite any &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;number&lt;/span&gt; that comes in the text message. Useful for using the fake &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;number&lt;/span&gt; values in the subsequent commands.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;CLEARP&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;- reverts the above setting.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;CLEAR&lt;/span&gt; - does both the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;CLEARB&lt;/span&gt; and &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;CLEARP&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;LOCK&lt;/span&gt; - &lt;a href=&quot;https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#resetPassword%28java.lang.String,%20int%29&quot;&gt;set the password for the device&lt;/a&gt; to &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;number&lt;/span&gt; and locks the device. I don&#39;t think this feature is enabled in the mentioned sample, as the sample does not require the Device Admin privileges.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;UNLOCK&lt;/span&gt; - clears the password and locks the device (which makes it unlockable after the lock above).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
The application also supports blocking messages from some numbers. These numbers should be contained in the &quot;filters&quot; variable (separated by the semicolon) and can only be updated via the HTTP or in the starting configs.&lt;/div&gt;
&lt;h3&gt;
Summary&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
This is a fine example of the malware evolution - now completely compatible with KitKat. It even checks whether you have set it as a main messaging app already and displays a pestering notification if not. It also tries to do some targeting based on the SIM operator (as pictured below). However, this function is never used in the code, as it was probably dropped at some point by the authors. Anyhow, the targeted countries were supposed to be Austria, Russia and Switzerland.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD5xXxZpR9XdB5lomwokhHL0DA8gUZ1zxWa_1j0fXmfy4wo77KJ-QYjxYmxK2zCGeJzs19sZb_k09NYnOudkuNLpRF4QUSrXVvo7RV_KZzjE8GxO6DYyQ8hgell2z974LGCfKDO7qqpbg/s1600/cc.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD5xXxZpR9XdB5lomwokhHL0DA8gUZ1zxWa_1j0fXmfy4wo77KJ-QYjxYmxK2zCGeJzs19sZb_k09NYnOudkuNLpRF4QUSrXVvo7RV_KZzjE8GxO6DYyQ8hgell2z974LGCfKDO7qqpbg/s1600/cc.png&quot; height=&quot;102&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
However, my favorite part is how they extensively log everything and use &quot;setted&quot; instead of &quot;set&quot;.&lt;br /&gt;
&lt;h4&gt;
Update&lt;/h4&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://twitter.com/seckle_ch/status/514791727564353536&quot;&gt;@seckle_ch reports&lt;/a&gt; that the SmsSecure is used in conjunction with the retefe banking trojan, targeting Austria, Switzerland and Sweden.&lt;/div&gt;
&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2014/09/android-malware-based-on-sms-encryption.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3un3Pqkc3pihLsS3GUQDueY1a_nNPAZsna7uv2THe7nWQPkvvm7sj5xVWsrxZRD8EXNNpxq52AjtrcSOOu0bxsoTNLXm5zZk_gVXQ5B18PqF0I4dO6N5WktrK672CjPi5wmb3nj-4Vvw/s72-c/isEmulator.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-5294490412178318015</guid><pubDate>Mon, 15 Sep 2014 05:36:00 +0000</pubDate><atom:updated>2014-09-17T16:11:10.596+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AndroidManifest</category><category domain="http://www.blogger.com/atom/ns#">OBAD</category><category domain="http://www.blogger.com/atom/ns#">tool</category><title>Having fun with AndroidManifest.xml</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
Before w will get back to Sandrorat let&#39;s have some fun. It&#39;s weekend after all, or rather it was weekend when I wrote this post. Everyone that ever tried to see the insides of the APK file knows what&#39;s an AndroidManifest.xml file is. Some even know that, inside the APK, it&#39;s not a real XML, but rather a compressed, binary form of an original XML.&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This compressed form was first abused in the &lt;a href=&quot;http://lmgtfy.com/?q=android+obad&quot;&gt;Android.OBAD malware&lt;/a&gt;. Compressed form of an XML differs with the real XML in at least one key aspect, hidden in the String Pool. Let&#39;s have a look at a compressed AndroidManifest.xml file of the previously mentioned Sandrorat sample and see if we can do something interesting with it. If you want to skip directly to the fun part, just ignore the next section.&lt;/div&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;
Binary XML layout&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Binary XML file starts with an XML header which is two words long (when I write &quot;word&quot; I mean 4 bytes, because I still live in early 2000s). Below is a hexdump of the Sandrorat AndroidManifest.xml, provided for your convenience. First two bytes are kind of a &quot;magic number&quot; for XML (which is &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;03 00&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;and is marked in red). Next two bytes are a header size (which is always 8, marked in green) and next word is the XML size, both in little endian convention (marked in blue). In fact every number in this format sticks to the little endian convention. After that header the actual data starts.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;00000000: &amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;03 00 &lt;/span&gt;&lt;span style=&quot;color: lime;&quot;&gt;08 00&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;c8 1c 00 00&lt;/span&gt; &amp;nbsp;01 00 1c 00 &lt;span style=&quot;color: orange;&quot;&gt;ec 0d 00 00&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;00000010: &amp;nbsp;41 00 00 00 00 00 00 00 &amp;nbsp;00 00 00 00 20 01 00 00&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;00000020: &amp;nbsp;&lt;span style=&quot;color: magenta;&quot;&gt;00 00 00 00&lt;/span&gt; 00 00 00 00 &amp;nbsp;1a 00 00 00 34 00 00 00&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;00000030: &amp;nbsp;52 00 00 00 76 00 00 00 &amp;nbsp;82 00 00 00 9c 00 00 00&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;00000040: &amp;nbsp;a8 00 00 00 b6 00 00 00 &amp;nbsp;c4 00 00 00 d6 00 00 00&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;00000050: &amp;nbsp;e8 00 00 00 40 01 00 00 &amp;nbsp;44 01 00 00 56 01 00 00&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;00000060: &amp;nbsp;6a 01 00 00 94 01 00 00 &amp;nbsp;9e 01 00 00 b2 01 00 00&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: inherit;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Next chunk of the binary XML is the String Pool (magic number is &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; and header size is always &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1c&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;). &amp;nbsp;Then file contains the&amp;nbsp;&lt;/span&gt;number&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;of strings (marked in orange) and, after some additional data, the table of string offsets starts&amp;nbsp;(purple). Each word is a relative offset to the string data (relative to the end of String Index Table, so first offset will usually be 0). String data uses a simple encoding: first two bytes are the string length and then there is a null-terminated, UTF-16 encoded string. String length is the actual length of the string, not the number of bytes. Just like shown below (in red).&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;00000120: &amp;nbsp;34 0c 00 00 80 0c 00 00 &amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;0b 00&lt;/span&gt; &lt;span style=&quot;color: lime;&quot;&gt;76 00 65 00 72 00&lt;/span&gt; &amp;nbsp;4.........v.e.r.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;00000130: &amp;nbsp;&lt;span style=&quot;color: lime;&quot;&gt;73 00 69 00 6f 00 6e 00 &amp;nbsp;43 00 6f 00 64 00 65 00&lt;/span&gt; &amp;nbsp;s.i.o.n.C.o.d.e.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;00000140: &amp;nbsp;&lt;span style=&quot;color: lime;&quot;&gt;00 00&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;0b 00&lt;/span&gt; &lt;span style=&quot;color: lime;&quot;&gt;76 00 65 00 &amp;nbsp;72 00 73 00 69 00 6f 00&lt;/span&gt; &amp;nbsp;....v.e.r.s.i.o.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;00000150: &amp;nbsp;&lt;span style=&quot;color: lime;&quot;&gt;6e 00 4e 00 61 00 6d 00 &amp;nbsp;65 00 00 00&lt;/span&gt; 0d 00 6d 00 &amp;nbsp;n.N.a.m.e.....m.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: inherit;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
OK, this was boring and I promised you fun.&amp;nbsp;&lt;span style=&quot;font-family: inherit;&quot;&gt;What comes next is really interesting. It&#39;s called Resource Map (magic number &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;80 01&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;) and contains a table of resource identifiers for some of the strings. Every word is a resource ID for the string. First resource ID is for the first string in the String Pool and so on. So now we have both an actual string data and this string ID. Mapping between resource ID and an actual string is also kept in the &lt;a href=&quot;https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/public.xml&quot;&gt;public.xml file of the AOSP&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Now, do you think that Android checks the string data if it has a resource ID? Or just simply ignores whatever string data says and just assumes it knows the string content by looking at its ID? If you think it&#39;s the latter, you&#39;re right.&lt;/span&gt;&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Trolling the researchers&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;A quick recap for those of you who skipped the last section. Binary XML sometimes contains both the actual string (e.g.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;versionName&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;) and its&amp;nbsp;&lt;/span&gt;identifier&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;(e.g.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;0x0101021c&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;). Android usually does not care about the&amp;nbsp;&lt;/span&gt;actual&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;string, if the&amp;nbsp;&lt;/span&gt;identifier&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;is present. This was used by the somewhat famous&lt;a href=&quot;http://lmgtfy.com/?q=android+obad&quot;&gt; OBAD malware&lt;/a&gt;, which made it to extreme and just removed the unnecessary strings. This action lead to this beautiful part of the AndroidManifest file (decoded with an apktool 1.5.2):&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;receiver =&quot;System&quot; =&quot;.Illlljlj&quot; =&quot;android.permission.BIND_DEVICE_ADMIN&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;lt;meta-data =&quot;android.app.device_admin&quot; =&quot;@xml/jijiiijj&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;As you can see some of the attributes are simply missing. When you run aapt on it, it becomes more clear what happened:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;E: receiver (line=47)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; A: :(0x01010001)=&quot;System&quot; (Raw: &quot;System&quot;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; A: :(0x01010003)=&quot;.Illlljlj&quot; (Raw: &quot;.Illlljlj&quot;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; A: :(0x01010006)=&quot;android.permission.BIND_DEVICE_ADMIN&quot; (Raw: &quot;android.permission.BIND_DEVICE_ADMIN&quot;)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: inherit;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;When you look up the first ID (&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;0x01010001&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;) you find that it means &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. We can do so with other resource IDs.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;OK, now let&#39;s have some fun with it. Removing strings is confusing for researchers, but it is more or less a known technique. Let&#39;s move to something more confusing. Just by a simple variable substitution we can get this amazing AndroidManifest snippet, decoded by the apktool 1.5.2:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBZNX3jEdvVFLUptNnedEgxm9TZQ6Cf3dIJ556qLKUXzTRu-lq-uqrXQ6Yc6taM_nOEsPrJLAOlxGvu_Fck-rHInLStUzG2aYaTL3VkcjpNJkStOilcx7hQfZ2JNYhM8SnPDYrCf32T2c/s1600/androidmanifest.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBZNX3jEdvVFLUptNnedEgxm9TZQ6Cf3dIJ556qLKUXzTRu-lq-uqrXQ6Yc6taM_nOEsPrJLAOlxGvu_Fck-rHInLStUzG2aYaTL3VkcjpNJkStOilcx7hQfZ2JNYhM8SnPDYrCf32T2c/s1600/androidmanifest.png&quot; height=&quot;33&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, what happened here and why are there two different package names? When we have a look at &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;aapt&lt;/span&gt; output we can deduce what happened:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;A: android:versionCode(0x0101021b)=(type 0x10)0x1&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;A: android:versionName=&quot;1.0&quot; package(0x0101021c)=&quot;com.acme.app&quot; (Raw: &quot;com.acme.app&quot;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;A: package=&quot;com.zero1.sandrorat&quot; (Raw: &quot;com.zero1.sandrorat&quot;)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;I just changed the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;versionName&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; to &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;versionName=&quot;1.0&quot; package&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; and &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; to &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;com.acme.app&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; (nobody looks at the version name anyhow). While this can be confusing a lot, it still installs without any problems. If your workflow includes apktool + some XML parsing, you may now need to rethink that approach :)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;There are endless opportunities for confusion! Change &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;enabled&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; to &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;disabled&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;or &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;readPermission&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; to &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;writePermission&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So now you think: well, this is all fun and games, but I can still use &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;aapt&lt;/span&gt; and see what&#39;s up. What would happen then when I change&amp;nbsp;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;versionName&lt;/span&gt; to &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;versionName\r&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;? Since you&#39;re most probably not redirecting output to file &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;aapt&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; will &quot;perform&quot; a carriage return and you will see an incomplete log:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; A: android:versionCode(0x0101021b)=(type 0x10)0x1&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;(0x0101021c)=&quot;com.acme.app&quot; (Raw: &quot;com.acme.app&quot;)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: inherit;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;It gets even more interesting when you change &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;versionName&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; to &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;versionName\x1b&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. At least on my terminal this resets the buffer, which makes the&amp;nbsp;&lt;/span&gt;begging&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;of the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;aapt&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; output unreadable.&lt;/span&gt;&lt;/div&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Breaking things&lt;/span&gt;&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Trolling can be fun, but let&#39;s start breaking things. We won&#39;t be breaking anything major. Do you remember when I mentioned that the string should be null-terminated and preceded by it&#39;s length? What if we were to manipulate this size?&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;First, let&#39;s try to set size to some very big number. A number bigger than the size of the whole AndroidManifest. This leads to the errors in &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;apktool&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; and &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;aapt&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. When I tried to install this app, &lt;b&gt;the emulator restarted&lt;/b&gt;. So I tried it again, but it &lt;b&gt;restarted again&lt;/b&gt;. So it seems that Android tries to read strings, but just doesn&#39;t care about it&#39;s value.&lt;/span&gt;&lt;/div&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;DO try this at home&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Do you have some ideas that you want to try out? Like using the Unicode control characters (e.g. &lt;/span&gt;&lt;a href=&quot;http://www.fileformat.info/info/unicode/char/200F/index.htm&quot; style=&quot;font-family: inherit;&quot;&gt;right-to-left mark&lt;/a&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;). Or maybe you just want to make sure that what I&#39;m writing here is true. Either way, you can try it for yourself. I wrote a small PoC tool (&lt;/span&gt;available&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;in &lt;/span&gt;&lt;a href=&quot;https://github.com/maldroid/manifesto&quot; style=&quot;font-family: inherit;&quot;&gt;my github repo&lt;/a&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;). Options are pretty self-&lt;/span&gt;explanatory (just run the tool with -h). However, the config file can be a little tricky. Configuration is stored in the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;config.py&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;and is in the form of a dictionary, like the one outlined below (which produces the two different package&amp;nbsp;&lt;/span&gt;entries&lt;span style=&quot;font-family: inherit;&quot;&gt;):&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;config = {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;&#39;Manifest&#39;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;u&#39;versionName&#39;:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;{&#39;value&#39;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&#39;v\x00e\x00r\x00s\x00i\x00o\x00n\x00N\x00a\x00m\x00e\x00=\x00&quot;\x001\x00.\x000\x00&quot;\x00 \x00p\x00a\x00c\x00k\x00a\x00g\x00e\x00&#39;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;},&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;u&#39;1.0&#39;: {&#39;value&#39;:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;c\x00o\x00m\x00.\x00a\x00c\x00m\x00e\x00.\x00a\x00p\x00p\x00\x00\x00&#39;,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;check_resource_id&#39;: False}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: inherit;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family: inherit;&quot;&gt;
Details of the configuration are in the &lt;a href=&quot;https://github.com/maldroid/manifesto/blob/master/README.md&quot;&gt;tool&#39;s readme file&lt;/a&gt;. Have fun!&lt;br /&gt;
&lt;h3&gt;
UPDATE: Samples for your pleasure&lt;/h3&gt;
&lt;div&gt;
I&#39;ve started &lt;a href=&quot;https://github.com/maldroid/samples&quot;&gt;another repo on GitHub&lt;/a&gt;, which will be filling with obfuscation samples including the ones mentioned in this and previous post. Enjoy!&lt;/div&gt;
&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2014/09/having-fun-with-androidmanifestxml.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBZNX3jEdvVFLUptNnedEgxm9TZQ6Cf3dIJ556qLKUXzTRu-lq-uqrXQ6Yc6taM_nOEsPrJLAOlxGvu_Fck-rHInLStUzG2aYaTL3VkcjpNJkStOilcx7hQfZ2JNYhM8SnPDYrCf32T2c/s72-c/androidmanifest.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2209090923956459095.post-6738992826490729186</guid><pubDate>Thu, 11 Sep 2014 05:58:00 +0000</pubDate><atom:updated>2015-05-15T21:11:15.436+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">communication</category><category domain="http://www.blogger.com/atom/ns#">Sandrorat</category><category domain="http://www.blogger.com/atom/ns#">synthetic</category><title>Sandroid RAT analysis: Part I - synthetic communication</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;
My first post is about Sandrorat, a fairly new RAT tool that was prominent for being a part of a &lt;a href=&quot;http://www.cert.pl/news/8918/langswitch_lang/en&quot;&gt;Polish spam campaign&lt;/a&gt;. The analyzed sample hash is &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;bed05d8eace6a7ebc5dec7141ea4b9cc559f1b2aab8848e2c79df7a79de39b9d&lt;/span&gt;. Sample was obtained thanks to &lt;a href=&quot;http://honeynet.org/&quot;&gt;The Honeynet Project&lt;/a&gt;.&lt;/div&gt;
&lt;h3&gt;
Everything is synthetic&lt;/h3&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;First part will be about a little known &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;synthetic&lt;/span&gt; methods and the way Sandrorat uses them to obfuscate the code&lt;/span&gt;. This sample declared three different services:&lt;/div&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;lt;service android:name=&quot;&lt;/span&gt;&lt;span style=&quot;color: red; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;com.zero1.sandrorat.Controller&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&quot; android:enabled=&quot;true&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;lt;service android:name=&quot;com.zero1.sandrorat.GPSLocation&quot; android:enabled=&quot;true&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;lt;service android:name=&quot;com.zero1.sandrorat.Toaster&quot; android:enabled=&quot;true&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
First service is run when either the button on the main app screen is pressed or when the &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;com.zero1.sandrorat.Connector&lt;/span&gt; (declaration below) receives a &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;BOOT_COMPLETED &lt;/span&gt;intent.&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;lt;receiver android:name=&quot;com.zero1.sandrorat.Connector&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;intent-filter&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;action android:name=&quot;android.net.conn.CONNECTIVITY_CHANGE&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;action android:name=&quot;android.intent.action.BOOT_COMPLETED&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;lt;/receiver&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Starting the service by button is somewhat convoluted in such a way that jd-gui + dex2jar combo does not show the actual code. This obfuscation is done by the clever use of &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;synthetic&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; methods. These methods (and classes and variables) are supposed to be created by the Java compiler and only by the Java compiler. They have a specific purpose, which is discussed &lt;/span&gt;&lt;a href=&quot;http://www.javaworld.com/article/2073578/java-s-synthetic-methods.html&quot; style=&quot;font-family: inherit;&quot;&gt;in this great writeup&lt;/a&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. However, in this case they are used to hide some of the functionality. Take a look. At first let&#39;s go to the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;onCreate&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; method of the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;MainActivity&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; (btw: really creative name for the class, right?).&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;data:;base64,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&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;data:;base64,iVBORw0KGgoAAAANSUhEUgAAAVMAAACMCAIAAABONt1tAAAAA3NCSVQICAjb4U/gAAAAGXRFWHRTb2Z0d2FyZQBnbm9tZS1zY3JlZW5zaG907wO/PgAAIABJREFUeJztnXdcFEcbx5+9ftxR7ugdBOlFRbFhV+wtIhYktqiJRmMvrxqJJrZYEo0xYiyo2AuxghpRAQERG9LEQu8c5e64fvP+AShl74RQLOz3wx8wTHmmPLuzszO/xRBCQEBA0M4gfWwDCAgIPgKE5xMQtEcIz1cBkonySwU8GfEsRPBF8sV4Pqo8vT4A8z1yQdgy+ZXGnzaet2PsI1F912/pgj428sxDQ51m3ixt6UtcxY2RXLcdr2TK/NNjLLgcJoZ13pchb+FCPlH+W90V2UeGOs4I5bXNzab1PF+Y3N83AFv7NP+/VaSZyT8TFIV3Nk9w5ZIwjMxx8tmbImmJTCUvfnQwmhIuaFRkQezWzXlTVvTnYACAik72xmrguk7a/bBc2VxrSEaTL2fy0s8M1GxuTq3Lx6872WzC6p731/2dJmtuuY3hi7nntzTcHjPR2YCInhpY65UhSd4xYtQemB+aK6jIvrtlkE6bv2dBpfd3X2T7T+5IexdEt17zWCCT8DPOjHi+ynfTU3Ebm/Qx+dh11+r+zZCiwIMJbVEuvucrUi/9gfn+3DvwnKt/AOa/z/8uTwIAIAndtgnz3TPryCk7/wDMd8uwCL4CiR9eO+82MwDz3Wiy7tqJPBmA6MKGAGzmmXsAkBZiPCkA8z9zSwSAxLHVMQM4y87tTBMpAQCQKC9h4YbdTN8AbOoOzwMJGYomJEeinO1bd9N8Awx/jogTqa6msuLwugBsyvELfASgSLu8D/PdMvm5BHCMB1T+vJdvAOYbgPkG9ImurHLGxhYEAEj4IvDrTrpkDGOY9V0aki0DANGjxdZGwxbPGuJhZ6hlOmRLvAABCON27krutfvPeZ5GLE1j97Hf+TsyAAAqYxdYWvjtWjfKwUSXzTQaE5yjAGlmyIpBVhoYRuZ0mnE4uRIBoLLIDSOd9OkYhjHN+y0+nyEFEMWt7Gxo3POX1ILTI825XK7l+AtFCAAvOQAAVCaciWIOHGBGrWU/RqJQKDS2hZePt0H+o3QRiB4t7mAxL7oSAEBw18/Yfl2CBL9GoCy595O3OQ0jc7stvJyndn6ryqT6VD6Ya6rbe9KIrs4dzU1cJv+VqKru+E0nbxgTFZ/uq2nq6aBF0huw8Ls++iSm+6poPvoU6q7hPLZT6dWrb6TqUrcM6u758gfxSt+pfQaSik4cuHK29N3ch3ckWj5y4ohdEzt1ZqKSJ1eHBr1I0nFe5N0Bexnnvzn8kYTWdfy4A9O7dgAAXfftc0YHzvV0pqHCuH+8g168Me26cVL3zqWJyzdfu85HIMlZ8/OFP5JFLl49VgyyZGTl5skbn1yefD1k1eNyspXzKEryrkw11WQP9DIGRc6lTBmgyui4IqBZ+dlQ8YwHTMN83fzRuwbp1EqvaGxBAJIX23wWxw+/VCATv9zT4ezX00/mKAAAZAWPeRNOxr1Mvz8rY+ua0BIky42OKbPy7srF6QN5VkiwYllEZgmfF7/VS0eWuH20X4jdrsRKWWn4jIxVk3YmSwEplHrDf72XLVaIU3Zbnpkx+0KBktlt+5OCvOi19oaTr2XxeLyMSxP0MZDgJQcAkBc+fVph3NWC0cAAJM6JPBPKsx1kr6Gypg1qBILI1VN2Slc8FojTfjW484Sverqs0iTcgnjJMOfa87TXEQty107b+xK/7vhNh+HGVCq5k/5JPt3l4Ymilc8S1irPHn3x/nL+MevOtOqqnxOZ1gZrSGpn+z0mj1g7vP/e0bqgyLqQ+e7pgz1v2aTdYzyXTBy+pSstNiy5DAy2rPzq9298z3mzoeD54UylZadOc/vbmAMA19p/sMecPtYmJNH9sNQKMPxxzsDvh/X7Y6IRCFMOvpII38afKAK9/lNuLxy2ffbE+xsHd6OTG5s8rSwmvgjAeMeKCYeWTVzIUVdPU3dnJxBHPC4RVeZfSgeqvWt3DekDHONlQOWM6O8x3V37fWpU2eiCZJmhFzNdly300qPQLUYum2X48ERsOQAARW/gjH76JGDa9HOjZyUVyhSCYgFi6bHIeNmwvdYu769PAYxp6mRJST1x5E3PXzaOt2ZStDrNXNkr70JYlpyk23fh9yOd9OkkuuXwOUO138bn4DuPJAUvOQCAQlAoJGlq02s/0Uje/OLGwEhMM+/fafN+m+9IV1nVBjUSpVwMEw1YOd2FRdXts3BxZ9VJVZuEB1ln4OzBhmSgWY+b1fHl2fB8hbq612k6Fhk3JknD3NGYa2lnZOZmo2vipCfMKpV/EnUns7hMRVmJqNlLDB9EnedTjbk0EpB0DTUA5CVCRc2chOWoQ6n+VSnJLVMAWdtZhwxAMbPUBBClC/DMVoozy5QABatWbOfO3O58JB9AnlcqlfDLeACWdrrsqtFHIuM6An5ynjBfBMDg2LNJQNXqoqeuolQ9uwmGkPksPS0zNVoC3bwsdFHjjZcUNLYgeXkun2pgwiYBAFA45jpKXqFAAQAkpjaTBACAUehkpVSByGxdFgiLhQqcXChcGxPmO3+UlbwtFtz9zs3M1NTU1NRx+l0ZVi5UIGHi0QWDHI25XC7XbHhQrlgix58x4ycHACAxdZjKSkGdV5f0Dmufi5FSXPwiyOPCxKnHs/HsA8CrkaI8r1LTQo8GAEDWtjBgqFwjUW0SHmRNfS0yAABJQ0+LVJFbLldT97pNBypikqlkADKFTKaSMRKFpJQp0CdRd4WoXIyxtBmtv/5GUfM/2eucSrk7OfttBQBFl0WuqQtGemcXiW6iQ4a35UnlihFMZU4mH4BpVTXqAcMwAASoJqapFgagv2bp0IGsai/nmGnQ87W5AJlpPOFgLS0AQEpldfaNSG6q9fRfAImgQIqAIkrnq60plTu2q9am64mnIysLwHidC5tMkqo2vi4kmgGjkQVRtI3Zsge5AiVokUBemlVG4hiwyVCIY5BJD0/tn24+4i3vaNigUIxMej90KFwrA+Opf7881o/9PoYsbaffouivQhPCeulRhPf8bfxrpYbam7Jxk1eZYOBur/HXsxzpZL169yiMrus8bu6wpcPOvxBOMqBiivIq11KK+GKV9yOytglbnCdQVEUsLpfWuqKQyJhS9s6RVJuEh7wsq1gKoAGK8qwShaaRFnr1l8q61206mbqYtah97fuYdZdkPy029Oyg+jGjxVB7bXkefHrqX+d8r5YD2Wy8ORUvCr2nt4M2FK7ZfnHxobO+YQLQd51pQQUAIDPMNAAyHm259uhgxNtcJbPv4I4sKDxwIyniTV5MQtKeUxFRYoxl7TFVF4rCTw3dd2tt0MVBAbfjqt5sNSa5hNWzqx6gzPXHog9eCvstX31VKY49Ohqg7G23eGDm7M0lqTCeUvo26fDt+KBn5QCQ/ezZwdtPLqSTuje2IKrFsPHmz3fujSyRS7Ku7zqc32VKN238qCzPZYtsI5csOPCwoFJYkHgt8EQy/qIuw9Fvmt711b/+myNBSFKcFHbyarpUKS4T0S3c7LgUkOfe2H+94N1kmaJtoilIeZorVZe86l9sd98u5f8+yK99b0NKuVwuE/NSw4JvF+s5G9Foxi4m/PjobCkoCv49GlmmcvQzHSYMZUQERZQoQZYecii+1koo3bSzXvatmHz5B03CQcm/vf1oglBeGnNgX4qNzwBjTGXdGyRtdMxPou6il9fjGYPG2DVceGlx1M72Bw4zff0g9Q1df9rc0ZPwFqIAML0uo0L9ne15ib+HvZJ19AhaO7Br1e2DYbrSx8GWlL332NW5gQ8TpSTjXuNvTne1zn2yMfjW+stJrzVNndgkYJhtXTf+O3v643tRm0NflxoZGVIan5zqOHzcL+6a6RE3Vz3TnGDygbpqWLh4s0AJYNO9oyVZlfGK7NhbswOvLP23DADS74TNC/xnRYzQttEF0V1Xn9vV+dpYfSrDZn7q+MPH/M3xH2AAGC5rQv/5VrrH24jFNu69PKwUUzFFpLuuvhLo9WCuPYNEYtmM3BReJAe604Kd/kWL3OzcPXr5XzXoZvjuxRzZZNxP39C2uGmztUxGnytU4iavgqQ/ZPHggqDLtbaZSN5u6cKm0pi6bvNje+06s8aNQTIat22Jzq7uNi69pl83dNVVPU9k99oS/G3Bok52zh5+YYYdar0RZbj+sNM3e645FdPoG5SrziQcaIb97MN9DKncIecctwf/4EBTXfcGLdfomJ9C3SsTjl2hTZvvwVJnZAuB4Z7VU6Re2u9wij95w7JTzmqbiuCzR5qyra9Pwe+xu7q3xXhrOpUP5tpNoV9M2evJ/NimtDLKopBJXofHh1+aaqLqXtGCqHvOJ2gP0ByW3bxVqCQu8B8dTNPrt/vexoZt4PZAeD4BAEXL+EMPSgRtAMbQM22DB/ya0ghlDgKCdgixb5+AoD1CeD4BQXuE8HwCgvaIes+XpOybYM/V1HVeEPWF6FAQEBAAfGBtX5x8dNcdm8A3KT76rXhKnYCAoM1Re89XVvKkWh3M2YTbExB8Yaj1fKSQKzAysRRAQPDFocatUeWr+3Hlunb6uEd1CAgIPmNUPOej4pBxDuMvl1h/d3uqBbHPj4DgS0PFPR/TG/dPYVnUCtLxTVcLWl8fhICAoG1RM9snabuN7MnKfJbXBnKABAQEbYra5TsSlUlRqNJ4IiAg+HxRv3CPkTAkVxKeT0DwpaHW86m61tqlCQlFbfLNDwICgrZDved3mLZpJmlLVxNi9y4BwZcFcT6fgKA9QmzQIyBojxCeT0DQHiE8n4CgPUJ4PgFBe4Tw/DZFnnloqNPMm6Wf7apqxY2RXLcdr2TK/NNjLLgcJoZ13peh/rs1AKDIPjLUcUYo77Ot9hdIe/J8ReGdzRNcuSQMI3OcfPamSFoiU8mLHx2MpoQLGhVZELt1c96UFf05bap4gIpO9sZq4LpO2v2wvNlHMUhGky9n8tLPDNRsTGyy2YTVPe+v+zuN2BnyydB+PF+SvGPEqD0wPzRXUJF9d8sgnTZ/nYlK7+++yPaf3PEjfNWCbr3msUAm4WecGfF8le+mp/gf8Gs9tLp/M6Qo8GBCW5dLoIrme76Cf+V4kKVfAOYbwJjz1/Socjkoc/4NxHx/GhwvBln+mgUB2Jwr0RJF6qU/MN+feweec/UPwPz3+d/lSQAAiWOvnXebGYD5BnCWnduZVvXlcEnotk2Y755ZR07Z+QdgvluGRfDxP2iMhC8Cv+6kS8YwhlnfpSHZMgAQPVpsbTRs8awhHnaGWqZDtsQLEIAwbueu5F67/5znacTSNHYf+52/IwMAoDJ2gaWF3651oxxMdNlMozHBOQqQZoasGGSlgWFkTqcZh5MrEQAqi9ww0kmfjmEY07zf4vMZUgBR3MrOhsY9f0ktOD3SnMvlWo6/UIQA8JIDAEBlwpko5sABZjV6B5UP5prq9p40oqtzR3MTl8l/JaoqCN9OecOYqPh0X01TTwctkt6Ahd/10Scx3VdF8xEAAEaiUCg0toWXj7dB/qN0EYgeLe5gMS+6EgBAcNfP2H5dggS/6UBZcu8nb3MaRuZ2W3g5T+3cXlXdQcN5bKfSq1ffEMe/PhGa7fnCV+GzrryVegw+umjslgFGVLFC7UxS/iBe6Tu1z0BS0YkDV86WKgrj/vEOevHGtOvGSd07lyYu33ztOv/daOEdiZaPnDhi18ROnVV8U03yYpvP4vjhlwpk4pd7Opz9evrJHAUAgKzgMW/CybiX6fdnZWxdE1qCZLnRMWVW3l3xvgsqzwoJViyLyCzh8+K3eunIEreP9gux25VYKSsNn5GxatLOZCkghVJv+K/3ssUKccpuyzMzZl8oUDK7bX9SkBe91t5w8rUsHo+XcWmCPgYSvOQAAPLCp08rjLta1P6MioyXDHOuPU97HbEgd+20vS/xC8K3E8ONqVRyJ/2TfLrLwxNFK58lrFWePfri/WddkTgn8kwoz3aQverPNDdoOhBErp6yU7risUCc9qvBnSd81R2ssu4AwLTqqp8TmVZ7L6g0aaMdhvW7UKoyQ4JWowXu+QoFgKCML2QaTpww9u9BXPVz2R6TR6wd3n/vaF1QZF3I4N8PS60Awx/nDPx+WL8/JhqBMOXgq3fP3+x5yybtHuO5ZOLwLV018b42JssMvZjpumyhlx6FbjFy2SzDhydiywEAKHoDZ/TTJwHTpp8bPSupUKYQFAsQS4+F+80yttfa5f31KYAxTZ0sKaknjrzp+cvG8dZMilanmSt75V0Iy5KTdPsu/H6kkz6dRLccPmeo9tv4HPy7lyQFLzkAgEJQKCRpatNrP+OTdQbOHmxIBpr1uFkdX54Nz1eoK6iOnSwybkyShrmjMdfSzsjMzUbXxElPmFUqBwDJm1/cGBiJaeb9O23eb/Md6So7qEHTiVIuhokGrJzuwqLq9lm4uLPqpKrrDgBkFpepKCsR1bpuYDTdDh3sLTTbzyPnJ0SzG53Vsf+egcbklNgF2wLN/fdMvVeqdj5HNebSSEDSNdQAkJcIKjPKlAAFq1Zs587c7nwkH0CeVyqtGRwsRx31ekDy8lw+1cCETQIAoHDMdZS8QoECAEhMbSYJAACj0MlKqQKR2bosEBYL8Z4ZKFwbE+Y7f5SVvC0W3P3OzczU1NTU1HH6XRlWLlQgYeLRBYMcjblcLtdseFCuWNXhZfzkAAAkpg5TWSmQ1U5H1tTXIgMAkDT0tEgVueVyNQXVtRNUxCRTyQBkCplMJWMkCkkpUyAAoHdY+1yMlOLiF0EeFyZOPZ6N//CE13SK8rxKTQs9GgAAWdvCgKFyeVJ13QFAISoXYyxtRq0RR7VdEPo65bi3tqoMCVqP5ittUTnTvp3nN1vw4sWzNXtunTodu7TnUBMSBoAUcgRKWd0rgex1TqXcnZz9tgKAostmmmlhAPprlg4dyKoaUCSOmQYJqoYLRvrAhYmibcyWPcgVKEGLBPLSrDISx4BNhkIcK016eGr/dPMRb3lHwwaZYmTS+9FM4VoZGE/9++WxfuxaZqft9FsU/VVoQlgvPYrwnr+Nf63UUPvsA27yKhMM3O01/nqWI52s9+62KS/LKpYCaICiPKtEoWmkhV79pbKgunbK1MWsRe0LDUbXdR43d9jSYedfCCcZUDFFedVlRSnii1XO4cnaJmxxnkBRFbG4XForRxIZU8reXURU1x0AJNlPiw09O6h+zCBoU5p9zxe9uTtu541td98klkmkCIBEoWKYpp6OJkD8zdjAq/fPlNeJ/zz49NS/zvleLQey2XgLrb6DO7Kg8MCNpIg3eTEJSXtORUSJ1bzykr3aO9jSdmpYdZ5Ui2HjzZ/v3BtZIpdkXd91OL/LlG4qbiAsz2WLbCOXLDjwsKBSWJB4LfBEMv46M8PRb5re9dW//psjQUhSnBR28mq6VCkuE9Et3Oy4FJDn3th/veDdMhdF20RTkPI0V6ouedW/2O6+Xcr/fZBf63ar5N/efjRBKC+NObAvxcZngDGmsqD6qDYJF6SUy+UyMS81LPh2sZ6zEY1m7GLCj4/OloKi4N+jkWUqPZ/pMGEoIyIookQJsvSQQ/Hvlw2AbtpZL/tWTL78g3UH0cvr8YxBY+xqr3Kgsqgt8+b+HF5C6L21Pc32fLKGJrswadPBi1P2349kdVg9p4cLFTTt+/7Uic1PuPvjM7qnVu3o1IHDTF8/SH1D1582d/QkLtm41/ib012tc59sDL61/nLSa01TJ7Y6PWBpaWbm6xxBzVChu64+t6vztbH6VIbN/NTxh4/5m6v6+jjDZU3oP99K93gbsdjGvZeHlWIqrjB019VXAr0ezLVnkEgsm5GbwovkQHdasNO/aJGbnbtHL/+rBt0M3y1mkE3G/fQNbYubNlvLZPS5QiVu8ipI+kMWDy4Iulxr5wvNsJ99uI8hlTvknOP24B8caKoLamBmo2MCAEjebunCptKYum7zY3vtOrPGjUEyGrdtic6u7jYuvaZfN3TVVT37Y/faEvxtwaJOds4efmGGHTTetxvD9YedvtlzzamYRt+gXHV1r0w4doU2bb4Hq3bGyorn5wMPXn4lInb4fARQWyFPubgXJm6e/ELSZkV+ekiSt3Z3XhIjQAghJIyaY2rxfWzlR7apDVAUXvKxGx2cI68bXHFrEoflfaJ+MEFbQChqtyk0h2U3bxUqP8JWno8Kpun1231vY8O68zHxyxuP9b89Od5E1TSNoBUhPL+NoWgZm3xsG9ocjKFnymgQyvDY+TL1I1hDAEBo8hAQtE+ITRQEBO0RwvMJCNojhOcTELRHCM9vCpLEAAfDyXcadxgfj89emeODECIcnwlt7Pl4OhbNFcxokjbGB5OL4n4w0+h/suaAnCx1ixOjyx/pVTtSqMYj1m+Zaaf6zMoHqKvMIYKzc2CoDjhj0NMVgmKgqsysIJjhBK4YdJ8ClVXpxHBkLPRjgjMGHlaw7SxU7YxT5MI2L3DFoIsN/P2gOnlJKMy2BGcMutnDoejqQJyYTcmzispo8MZg2I9qYxIiHJ8JH/2e//EFM+rCdPxqEPv5pWdVVwJlYdTldOsJg02q3n6SuJ5+s4a+O2DfROopcyAJFLBh1U0Iz4aNA2DHaIirAACg6MGoTbBhNLx/zU0Bj+/hYBJEFcORlRAyA27mAyggdCZcNYbrfDg+D/7ygfgKQDzYOBVoayFOAkfmQqAPPOHjx2x8ntWI4dgy0NGv+VN1TEKE4/Og+ZuBhIkH/Ny4FAwjs0x7LY8oVyKEkCTj0vKBlkwAko779ENJQiWqfLiikwGHTQIApg6Hw7EYd75QiQQRsw00Bp3MV9TJUilIOODvziUB0E37LLmUJUUIVcb9YGU49IeZg7t0NNA0Gbz5EV9VnnilNyF56bVxHLOqrXVK3uVROlbL40UIiRO39jbisEmgNelf/jtD6xckiJpjbrfmqfh9VSpu+hi4/ZomRQgJ7n1tZLU4Dm/PnvwNGkdHh16+D4n7GvWcjIQNYhZdRQO00I0CpCxEM1ho52OEEEJlaJE2Wn0PiaJRfx0UWV5VNPqBg356gB+z8XlWkfUH+moROt8bDV2PJEh9nmXXxnAdfkpsz5s1P32afc9HvLClKx4MDimUK8U54VtHmFAxfIUGXB0LfMGMRuttNE0bo5HJtbtO7lLx7+0MKUBlYki8xuBx9gwAutOqyLy8mPX2tXakNCwo3WqIHS/yxfvjL5LMqERG914mVHxljhoESVCkA65G6lo6fCx0oUK/r2DURRhiALJcyFWAEwdOLYWwAnAygtepoKh3FkEGaZkgxY3Z+DyrJvb74Nv/Aasmf1UxAYAQ4fgsaIHZPomM+G9fpOQIMO2OfQZ0YH5AoaEOuIIZjdfbwLVHZemNSw6Ybu9JjjlXHhQpJK9vRCi8Jrqy8CPiFHST7zLEJONOWmXp1a9MHFc/qax4cb+44xA7JuArc1Q1QiFs/w467YAuauUsex+BG8mw9Rs4uwSShaAUg4QMND7cPAz33oIGAyTlQLMFNwyOnwKBBBICIUYAEj4o8GKiRueJlBC1GirmwwCD98bgx6z+JyHC8RnQ7J7AuMP3By+gHvNz1qTqdp5xOFX0AYWGOuAKZjRebwPXIpWlNy45ANlwwESrtEuPebn3Q3ldJnmo8ke8giSGvT3gadybJ1ff6Coj77xMDk83GeKujQG+MgcA4sPBMfDSH7b4gfr96zQuGNrC6K3QPw+OxwGJAXQFyEzgSBlsHgCVYqBrA0kX1geDdDN0Z8CqSBjlABocoODFxBqdpygWtj+BlbPq7PTGjVlzTSNEOD4DWuAaTLMYHXAm+k258OUfjqFLVoSXVys0XEzLycnJycnJLSwvexLgVr0gXlfHgmrSw1M7/eYjXu01ZIq2MVtWmFt1FPe93oZq8LQx8EtvRHIAoJp7j9F7dikyPCTTaXIPlRLZuAVx7Ifa5t+4EvKy27ql3Nv/hMYpu/Q2pQJUK3PkPauj4iWCkz5wpRMc2AiajVTixgADEEqAagImZEjMqs4nqQBs7IEMoDccDmdAIoJrh6CoBDzsVMZsZJ7CZ/D2BfiywJkEyyIhaxN4DAaxujwJEY7PgGZ7vrL8yYWQhzlCBVDoNDKJzmaQ1Sg01NexwBXMaILeBl6e6vQhGpEcAIBuO3oI5ea2HU+tJvY1UNlEuAVh2u4DuTG7L+mMGTBkKH//3te2Q2vkLusrc0ghxA/+1oR9vwJLBhIxVM1CkAIkYpDKARQgEYNMCbLXcHAvJL4BfjHc3wZhlTDEBTAuTOgNl7ZCjghSD0EUA77qBABQHAuvcqEiGy4shGgbGOuAH7PxeRp9C4kIEhEkKmGnF5ivh/jboKWidABChOMzoblLhIrisEU9zVgYANDN+iy+mCVFCCEkTr+wfHAHFgCQtax6f3M4rXqhV55/bVE3PTqDpWk86myBAiGEZLmhG0Y7aAMApu3w1Z5kMUJK/rM//Vx1MACqUc/vz6ZLEEKVcT9Ym899IEQIIX74VCO7tc/FqvLEKb0pyRFCFXemcQDsNtYsUPPvzbHX5bx/D2A28kSOHL+agntfc2l9juUqxAk/2pLtf05+t8at5F2fbNF9z2sZQgghWRoaA8ip1s/PsQghlL2nTqDPfiR+i9b3RJ4k5ATI0x7tDUVVJ9rl2WhrL+QCqJM1CoxCVaYnByAvMnICNGw4isitLrlhTFlT8qyxH93wql7bVxNTGLvI1mH1E1GdYSLP+LMLQLfALOIs/icCcVavTZGmbOvrU/B77K7uKlYNP3uURSGTvA6PD780tc6xe/7tyZbjSve+vO5HnMb/NCA8v42RV+QVKvVMdP7jbqBPHiQuzi3XMDbUqPOQJI5f5jYVO/lkR1fi4f8TgfB8AoL2CPF+lYCgPUJ4PgFBe4TwfAKC9kibez6SifJLBTwZsbrw6UL0UTugdTy/PP44xTegezjOZ1dL408bz9sx9hHxdYVW5cMSIO2jj5T5p8dYcDlMDOuipPb0AAAdw0lEQVS8790XTnADWwF50aYfAjDfAMw3gPLzy/IPJ2gsLSF/0iKeL0zu7xuArX2a//mPlOYjeb62A1aL3ieL1DRLy8qKvKOuBAjAR+6jjye+QjKafDmTl35moOaHAlsBsuYYv7H7/VxbXGa9JeRP2ny2z+0xE50NiOip0cht6p8ddNeNKSJR/oVBTONv7/NEovDJ+m1d1XoSIE2mhfvoUxNfaTMwhrtn5zleVsYtn3Xz5U+a6/miCxsCsJln7gFAWojxpADM/8ytmk8ulr+823d2AOb3x8zoCjkAKn/ey7d68tMnurK69xX8K8eDLP0CMN8Axpy/pkeVq5l9KWR3tyS6cO9j2H2DLqnBGc0eQFUz3g6/n+86472dgMSx1867zQzAfAM4y87tTBPxky5yfH9b+fadaZLbO3/BFt9PxrUVI9MYDAaNBBiFXvULgOjRYmujYYtnDfGwM9QyHbIlXoBAFLeys6Fxz19SC06PNOdyuZbjLxQhAJBmhqwYZKWBYWROpxmHkytR05IDQGXCmSjmwAE12kFt2kcNEcbt3JXca/ef8zyNWJrG7mO/83dkACDhi8CvO+mSMYxh1ndpSLasia0ElbELLC38dq0b5WCiy2YajQnOUeDl2RRwWh6/IPzkSJSXsHDDbqZvADZ1h+eBhAwV8RTlaSs27dWbGoD5BjC/O7I4tlwGKhpZdctrOI/tVHr16hu136xXR3M9n9Z1/LgD07t2AABd9+1zRgfO9XSuudOkRhfadrc1lBUfPfkoWQaYhvm6+aN3DdKpnV74KnzWlbdSj8FHF43dMsCIKlaoPNKBMo4kjd2DLbnXS670evwbR6el7hxvUzDfSZ4u8io7UWHcP95BL96Ydt04qXvn0sTlm6+Fa5hZQ8XzEplMWJaSWy6QVybmyxjGxiZN+UJR28iKADSUAGnDPsKrd2uIr1QhzwoJViyLyCzh8+K3eunIVOTZSFS1fMOC8J1GkrPm5wt/JItcvHqsGGTJyMrNU3GBVAgKIkp1Jo4fdmBmL09hxu9/3gwX4TeyupZvrvxJcz2fbNmp09z+NuYAwLX2H+wxp4/1u43Z9mPGBM4ettgUoLy4QA5A5Yzo7zHdve6xO4VCASAo4wuZhhMnjP17EFfVDFUhufZnRYd1Haa7UsgYyayvwUgr3MmoNHlrNy1aHXSHn1f3rO08YsAS7x7TzQDKiwtkovthqRVg+OOcgd8P6/fHRCMQphwq5LiylBlZZdEn/3ZcHHwgu/RxCVjZcZhNaam2kRUBaCgB0nZ9hG9Ny4uv1MD2Wru8vz4FMKapkyUtS0WejUOtnEydgli44074Nv5EEej1n3J74bDtsyfe3zi4m4qj4VTDbrd/nbZ/QrdpA3v9rysDRAVxPAV+I6tp+ebKn7Tmd/W0OQwKKFgUqH/+vRasjv33DCz8/k7sgpTYBcCZsuDro/04uANLJk8vJZnZUD9kMa3j/CtJfnXeSGEMXV01j6wsNpUMCjoJACGkFGeWKQEKVq3YvqomQh5fY5gBXHydF1UsYZFld14VFAko9taaTXqMbqKsyBISACCZQGbauUmyIlBHAuSDD+ot20d41BJfeT8iG4qvXGuK+Eo1FK6NCfNdFVXkyW3kCSFVLU9pUJCK9PwyHkAXO112VUQSWUXBSJD1dO6+u6cza564gCGQI9xGVtfyquRPFjSuui20wodhGACC/zL9pnKmfTuvNHj58zVDRrJKT52Ofa7iyYVKseQos1/JPvSMKX35x3A7izo4+10taaxtJLqpFgZgsGap/631X99a//Wt9TP2d+G6WGoIM1LPlxguGqidFJX8CuP0MGiZq2ZLy4rgS4C0TR/hJm4F8ZV3oWTSe39UlyeJjCll9af+dQPVtnydglTUk63NBchM41XPv5GyqsIYhUIFUEgk0ir7keDC4RunMxX9vxp/db3fbteaUYTbyGpavrnyJy3i+WSGmQZAxqMt1x4djHibi/9whUrfJh2+HR/0rBwAsp89O3j7yYW3IuGbu+N23th2901imUSKAEgUanUTy17tHWxpOzWsZsJGpo/8Vuv1L2+Ov1AoEMp7UHQDf4WPZvf9jZeZdUgMHqXunl8HjNl3cEcWFB64kRTxJi8mIWnPqYgoMdXaTgcVpD7WsB3bzagiMbOUpteZo+qarpCKxWKpEpBcUvWLGlpBVqShBAhAK/VRo/Q2WkF8BRc1edJNO+tl34rJr3PXqBfYxJZvMD5Z1h5TdaEo/NTQfbfWBl0cFHA7TgIAQGJw3bUBXt5bHhIXGJ6aKqlSvWXYdzRz0aiIrP6SA4jwGhk3sDp+c+VPWsTzGaYrfRxsSdl7j12dG/gwEb+9FNmxt2YHXln6bxkApN8Jmxf4z4qYCqWGJrswadPBi1P2349kdVg9p4dL9Yo0kpZmZr7OEbyrBWY12+nSArSjTySFFOG2gKfqNk7RMjIzr4OZvkbj60ky7jX+5nRX69wnG4Nvrb+c9FrT1IlN5pgZ6gHo2Fo5Wtk4AoC+mbWK+a4k4UcHJtNowr+ivL/6cpnMAafVrTGQTcb99A1ti5s2W8tk9LlCJdBdV18J9How155BIrFsRm4KL1I3yWmQvKoK+kMWDy4Iulx7l0qr9JGy4vn5wIOXX6nf8sNwWRP6z7fSPd5GLLZx7+VhpRgGdNfV53Z1vjZWn8qwmZ86/vAxf3M1t3z8atZHdZ4M1x92+mbPNadiGn2DcpX4gU1r+Ybjk2G2dd347+zpj+9FbQ59XWpkZFh1O6ebrJneyYVRfOzUtXn774YLWeNnDR1vLDqwbW/Hnc8lutX3fDJeI+MGAgBAZcKxK7Rp8z3qyDw0rjveVYDgS0SSvLW785IYQeuWUnFrEoflfSKHENppWxSFl3zsRgfXb/cmdQdxPv9LpQ0kQBqlt4FhX9qerY/vMi0hf0J4PgFBe4Q4pUtA0B4hPJ+AoD1CeD4BQXuEUOYgIGiPEMocACp0LD4sbtGWqBJjQPxHW4aY0DCM1uH76MrqQEligIPh5DuNPs9ecWMk123HK7Wb5JuaZ2vQwM5Pq49aA9x+J5Q5WoiGOhb1A1HRyd7vtDa4rpN2PyxXt08KV0mieSIcKsQYEO/W2u15i56JkfTNHz1r3uZQjUes3zLTTt2uXzxEcT+YafQ/WVBdNVnqFidGlz+qd5n9xzyb0nRNEzWB+h0ngrNzYKgOOGPQ0xWCYqCqnKwgmOEErhh0nwLVl0YxHBkL/ZjgjIGHFWw7C1JVMau+IO4Frhh0sYG/H1TnWRIKsy3BGYNu9nAoWl0gEsKludCfBs4YjJgCtbcRVkaDNwbDfqwunR8DPziCMwZuhrDhGFSfvMftd0KZo0XA1bHACaRbr3kskEn4GWdGPF/lu+npfxdF+G/gijEoytLzMQs307oOSeJ6+s0aatbUV/lMx68GsZ9felZ1cVIWRl1Ot54wuPos8n/MEwAa3XRNFDWp10dIAgVsWHUTwrNh4wDYMRriKgAAKHowahNsGF3rI6IU8PgeDiZBVDEcWQkhM+BmvoqYCgidCVeN4Tofjs+Dv3wgvgIQDzZOBdpaiJPAkbkQ6ANP+PiBgODRMtgcD2vjISIHNs+F92/gxXBsGejo1/wpgn2+kD4BomRw+xDcnwuX3lb/B7ff25MyB5JHbkhw0r+PYfeY5k8Xnxf/Z02CetTTsVAdiJEoFAqNbeHl422Q/yhdBKJHiztYzKuaYwvu+hnbr0uQ4CpJqJCXaKw6RTX1xBjEzzf2MDLovPJ56Y0JllyuYeeVcSIASdI2L2OuJhnTfj8zx89TWXLvJ29zGkbmdlt4ueosOdt9Um+IuZIiAgBU/vhSiuGo4VY03Dwb6lgIH8y1sP/fs1pKW/xbEw3dd7ySNWy6yuj55kZf3+FXxRNGzTMzmXVPgCtqgmcnbh9hOrBwNwz0BANTGLgEbPmQWAAAYDwSfCaAFadWT1LAbQjYWYOOLphYApMKFBJ+TMSD81Ew/n9gzgbnedC7Ei4+BclLeI5g2mTQoIHLXOgpgmsv8AOhHILOwddHYYgrcE2g0wDQqnG47ENwqxtMsqspSQwpRdB3AuhQwKAfuGtASp6KflcT2BQ+H2UOhJR63F/v9RQr+qTsZpyZkXqhoJm2V1Ffx0J1YJUZ4pzIM6E820H2+BulcJUkVIhwNFad4l3edcQYGG4/xuQXPN7qyhlxMYPHK3iyvRsTgO60KjIvL2a9fV3TG+YpiFw9Zad0xWOBOO1XgztPqpZktLtO7lLx7+0MKUBlYki8xuBx9gz8PBvqWKRbDbHjRb4oe9eBksyoREb3XiY1V89aTafRaeYExs1DsRUAAMKnQddg1OyubNwGxbVTfR8BCJKgSAdcjXBzrCZ8LHShQr+vYNRFGGKAH0eWC7kKcOLAqaUQVgBORvA6FRT1JiIySMsEhBcoyYK3JECHoD8NXLmwfC8IEUDVE8Q++PZ/8P6ovyaM6g0RZ6BYAnn/wgsmDHZ4lxeOCEd7UuYgUfsuNB3pRKWTSJbDjYdqi+NzcC8STVXmqK9joTJQ8uYXNwZGYpp5/06b99t8xyY/8daj6eoUOGIMjaVBnqKUi2GiASunu7Coun0WLu5cVRtMt/ckx5wrD4oUktc3IhReE11VfPkTR8fiZoXzEJOMO2mVpVe/MnFc/aSy4sX94o5D7Jh4Tcd0ne7Luv13TDmA8GnQDfLYWZ3xS8K3E0BFxwEAKAph+3fQaQd0Uauw2fsI3EiGrd/A2SWQLMSPoxSDhAw0Ptw8DPfeggYDJOVAswU3DI6fAoEEEgIhRgASPn6gshKExXC5HI6WQPg5SFkOB58DKCFqNVTMhwG1LzcUGPUHmB6GfgwYPB567IGe3Hf/w+335ipztOZzvjaHQQFKI1QfjMkpsQu2BZr775l6r1TV9AUpEo+mDXKM5nKjuGYJQblKCf5zAa3j/CtJr+vw7NgI1ad0a+lYqA+kd1j7XIyU4uIXQR4XJk49nt0UqSccGipJ8D6gToEjxtBYGuSpKM+r1LTQowEAkLUtDBhVDUQ2HDDRKu3SY17u/VBel0keqnznnY6Fqampqanj9LsyrFxq1NsDnsa9eXL1ja4y8s7L5PB0kyHu2hhu0zGc/KfohP8dXSZ4cvQGdfwMdxV7zVXYCSo6DhAfDo6Bl/6wxQ/Ua3LQuGBoC6O3Qv88OB6notkYQFeAzASOlMHmAVApBro2kHRhfTBIN0N3BqyKhFEOoMEBMl4giQ40EvisBCtN0OsHvvYQ+QD4sbD9CaycVUcVB5XCxsGA/QwxMrh/F17Ohn1P37cBXr+rUuZIOe6t5rxzrao1JtIHaQPVB9mrPL9FFf0OdS3k9eZlu0wzVOXKTVXmwNWxwBe3AADA6LrO4+YOo0effyHESFRMIZUjAACliC+uffnFu9rVE+FoqjpFs8UYakPWNmGLiwSKKtuLy6t1I4Bq7j1G79mlyPCQTKfJPTiqWhlXx4JjP9Q2/8aVkJfd1i3l3v4nNE7Zpbfp+5WS2k0HQLefOk333sGb4UfDGBOmu6pSNlNlJ34fieCkD1zpBAc2gmYjl5AxwACEKnTAqSZgQobErOrMkwrAxh7IAHrD4XAGJCK4dgiKSsDDDgAvkGoMRkx4L+qBAQBUPIO3L8CXBc4kWBYJWZvAYzAUp8KDMpg4CTQpoNsbxljB3XtQc2vB7fd2o8yhFMtFdLqbHZUCKPdG7vUCVa7cZGUOPB0L3ECklMvlMjEvNSz4drGesxGNZuxiwo+PzpaCouDfo5Hvn3BxlSTqBzZRnQJfjOE/w3SYMJQRERRRogRZesih+HfSUHTb0UMoN7fteGo1sa+ByuGBq2OBabsP5MbsvqQzZsCQofz9e1/bDq1eDWnQdABA6+g73fDm4oUXmBOnOVXVCUfURKWdDftICiF+8Lcm7PsVWDKQiKFqtoQUIBGDVA6gAIkYZEqQvYaDeyHxDfCL4f42CKuEIS74MTEuTOgNl7ZCjghSD0EUA77qBABQHAuvcqEiGy4shGgbGOuAH0jShTFd4MLvkC+B8hi48BK8eoHpt5CIIBFBohJ2eoH5eoi/DVxjMJbBxRAQK4H/FG6kgrV9jXPi9nuzlTla5ny+9PnVU7bTNsDEDTDt9M1KVPboGHniBs87FQp56Z7lVYGy56d+g4kbav9Yn8yvyHvkt3KHxsQNMHEDc37Q6if8msPFksSfOgL0Pc+r/lsuubLksblxrFuX+IHT04Yaxnwfq2gR45GSd32yRfc9r2WqA5WFwb3eNRnNyMPv94dlCoSUZVE/9jHUNnP2HPrNwr66dmufi6uNzb+2qJsencHSNB51tkChIlDJf/ann6sOBkA16vn92XQJQqgy7gdr87kPhAghxA+favQ+T2HsIluH1U9EdVs+7VdXzojr5TV/8+/NsdflcNgkAGDqcDhmI0/kyPHzVJTc3zjU1szGybXHOB97DZdf06RVeVTcmcYBsNuYKFGTJ0Li9AvLB3dgAQBZy6r3N4fTJAgJ7n3NpfU5lqsQJ/xoS7b/OVmiqukQQkj6apc7gM26mhqKn/3PuvbY7BVcqFRjZ70+kqWhMYCcav38HIsQQtl76gT67Efit2h9T+RJQk6APO3R3lBUNegaxpQjJM9GW3shF0CdrFFgFKoyPTkAeZGRE6Bhw1FEbrU5uIHSdPRzL+QKyEkbLduLBMraYwzd8EJD16Oqds44iaaZISdATpro2/WouGY44vY7bqA8488uAN0CsxpzQJ9Q5kBIhY5F24hbNBYVYgyfNcqiC8M59hteSP5zDp9WH7UGuP1OKHO0HLg6Fm0gbtFo8MUYPmvEKb/173HUJy5uecf/3sKfUh+1Brj9TihzEHyuCCPnOPT5W9Q34OqVH3tofTL7OdsRhOcTELRHvpy5IwEBQeMhPJ+AoD1CKHMQEHyIL3HQEsocLYwy//QYCy6HiWGd92XU21/cKHEL/m0fPds1zxp7/PJTEMxowCcomPFhk5o/aFtNRaM1IJQ5cAQzxK+Oz+mqh2EYzXzg6hv56j61oii8s3mCK5eEYWSOk8/eFAnJaPLlTF76mYE4O97/q7gFKLIDuzKctr3EEWJobJ7N0wVpGrhKJx+Xhia1wqBtNRWN1oBQ5miA7OXeiXNvdvn7Lb80fp1G4ORZ5/NVisgk7xgxag/MD80VVGTf3TJIR/2LkuaIW7Rlns0DV+nk49Jckxo9aFtJRaM1+DKVOSqTAqe561JJJArbrPeKyAoE0FBJAgGuYIYs43JQku2ilSOt2Dqu/mt9Ne7+HcFDuOIWwridu5J77f5znqcRS9PYfex3/o6q9tTji1uAoujulgkuXAqG0Q26zArOqH1fUJZGrO1m2G1dZKmKCw9+ng3rrkIXBKdBVOmC4MQEgMrYBZYWfrvWjXIw0WUzjcYEV8kL1Bc1qZpFd/j9fNcZ7wcDIHHstfNuMwMw3wDOsnM700T8pIsc399Wvn3X/5LbO3/BFt9PxhsQqCxyw0gnfTqGYUzzfovPZ0irWizq56HmNIyi5znr+65a7xX76pnUioO2dVQ0WoMvUZkD8cKWrngwOKRQrhTnhG8dYULF8JQkkqW4ghmSrMc5VCtnAyoAAN3U3Vj+tuqUTQNxC1ludEyZlXdXbiMaEVcwQ55xZNLYPeQl90rkyvLHv3nXmjIoy2M2jfC5PuB02EYvjor88fLEq7sKXRCcBgG8aqqMCQDyrJBgxbKIzBI+L36rlw4JVApmvE3BfCd5usirBgMqjPvHO+jFG9OuGyd171yauHzztXANM2uoeF4ikwnLUnLLBfLKxHwZw9jYBO9j5Uih1Bv+671ssUKcstvyzIzZFwqUIIxZN/lX8dI4vihtl1F4vGoNj9YctK2iotEafHnKHAAAJDLiv32RkiPAtDv2GdCBiaskEZaFO71QisulFHaVEBRgNBYdRBViJeCIWygExQLE0mOpPwauGkXOtT9jOqzbPt1Vm4wxzPpOHmlVrSjHf7x91JA9Jn+GbhnQmMvKB+qOi8oGaVBNtU3H9lq7vL8+BTCmqZMlCwOVghnOIwYs8e4x3QygvLhAJroflloBhj/OGfj9sH5/TDQCYcqhQo4rS5mRVRZ98m/HxcEHsksfl4CVHQe3AiTdvgu/H+mkTyfRLYfPGar9Nj5HKk45f004YPUsdzaV03P+Dx7vLz31TWrNQdsqKhqtwZenzAGAcYfvD15APebnrEnV7TzjcKoIX0lCiHucmETXoskF1V+9R1KhBJhaDBLgiFuQ2bosEBbjZ9MIZLz0UpqZDbfBTU1SeOuRlr3yfvDdgqbmjVd3/MJVNUiDaqprOgrXxoRZ18fxBTOAxaaSgUQnASCElOLMMiVAwaoV27kztzsfyQeQ5/E1ehhA9uu8qNcSFrn8zquCZAHF3loT906AhIlHFwxyNOZyuVyz4UG5YokcyctyBCxz3SoND01TPfoHNDzwae6gbRUVjdbgy1PmAACgWYwOOBP9plz48g/H0CUrwsvxlSSqF8TrCmbQzbuYyNKTimQAAJKc53kUq07GuMOPatLDUzv95iMeztyDRMaUsg+4LZVryZFmv+I1uILRrZacvnzt8KCo+fNOZ6v9iDsODeteTT1dEDUNUhe1MTEyqV5HqBY1eQ+JbqqFARisWep/a/3Xt9Z/fWv9jP1duC6WGsKM1PMlhosGaidFJb/COD0M8Ob6IHv1l9+i6H6HEgp5PF72tWmGZACg6Jiyhdk8KQCAgp9TLFGr4dFag7ZVVDRagy9BmaNeTFCWP7kQ8jBHqAAKnUYm0dkMMr6SBADgCGZYjva3T9vz641MYXnSya1nhX2/8eLiX2ZYnssW2UYuWXDgYUGlsCDxWuCJ5Or1W7ppZ73sWzFqXwgC2XTkt56vf1l1/EWFAknzHpy/UbVQBRiZRiEbjtlzYMjD7+ecyKzORCkTi8Q1SFU86eDVHbeaqhukPo2PWQWu0kldMGbfwR1ZUHjgRlLEm7yYhKQ9pyKixFRrOx1UkPpYw3ZsN6OKxMxSml5nDu6jlFJcJqJbuNlxKSDPvbH/eoEcABgOPiNY4duPJQoV5XGBf8TXWkrHM6lVBm1rqWi0Ai3i+QzTlT4OtqTsvceuzg18mIg/LBTZsbdmB15Z+m8ZAKTfCZsX+M+KmAqlhia7MGnTwYtT9t+PZHVYPaeHS/UCLJKWZma+zhFUtwzdyWSnv2yR20N3jyf+V2ndDN9bXi8mgLzo/vYJ9poUEr3j4oxJB7b3YQPQXVdfCfR6MNeeQSKxbEZuCi+qdiiyybifvqFtcdNma5mMPleoBJrDD+f2D4ydYcnWcd9QPuvkkYnGqp7kGS5rQv/5VrrH24jFNu69PKy05lvxDNcfdvpmzzWnYhp9g3KVILg/10GPa9xjU2rhmVHmXK75qOBcBVCsZp+9tEC6ow+HQtJ0W3CtpI6AK9lgzJ7A4Y9/mHUkXQYAktT17trMGrz/KcPPE6/uuNVU2SANaHxMAAAg6Q9ZPLgg6HL9fUx14hj3Gn9zuqt17pONwbfWX056rWnqxCZzzAz1AHRsrRytbBwBQN/MGn/Vh+60YKd/0SI3O3ePXv5XDboZ0gAAWD1+ObWMsq0zm2W/rGBQN633sxE8k1pl0FYmHLtCmzbfo46aKG6gsuL5+cCDl199vB1tzdcOICCox0cXzFAWnOyt1SMo771qU1uY1GoqGq0BcUqXoDVoXcEMDGvsPrBaw7v1NTxaTUWjNSA8n+CLQZLy+/ih/7uZI6fpOHz1S/CBuS6sT3an6EeH8HwCgvYIcT6fgKA9Qng+AUF7hPB8AoL2iArPRyUhEyy0NQ09vruU29RNZAQEBJ886lb45G9+93A9tTjtwUwTYmpAQPBFoc6lKXodzeiVJZXN/GYsAQHBJ4f6mzmJhClVHpgnICD4bFHr+TQDB+2c8Ji8T0xBjICAoLmo9XyG26KN/eKmWzJtv4sSqotIQEDweaF2D580aVOnHqHz4/5dYM8gtkESEHxBqL3nS7KfFJoNH2RNuD0BwReGWs9HComSwqASfk9A8KWhfm1fqUAYudEnIgkICD4X1Hg+qnwV80ahZ679X7VlCQgIPlVwBQ4BUHGIj8esKI1eKw8NViFCR0BA8PlCnM8nIGiPEBvyCQjaI4TnExC0RwjPJyBojxCeT0DQHvk/K3iFRa3r7C8AAAAASUVORK5CYII=&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;You see that there is a listener put in place in case user clicks on the button. This listener is implemented in the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ag&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; class. So let&#39;s have a look there.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;data:;base64,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&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;data:;base64,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&quot; style=&quot;cursor: move;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Well, there seems to be some kind of &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;startService&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; performed, but it&#39;s performed on the non-exiting class variable, right? What&#39;s up with that? It all starts to come together when we take a look at the smali code (thanks to the apktool). There is actually a variable called &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;, but it&#39;s marked as &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;synthetic&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; and for some reason does not come up in the jd-gui.&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;.field final synthetic a:Lcom/zero1/sandrorat/MainActivity;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;But where is this variable value saved? The answer is: in the constructor. Smali code for the constructor is:&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;.method constructor &amp;lt;init&amp;gt;(Lcom/zero1/sandrorat/MainActivity;)V&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .locals 0&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; iput-object p1, p0, Lcom/zero1/sandrorat/ag;-&amp;gt;a:Lcom/zero1/sandrorat/MainActivity;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; invoke-direct {p0}, Ljava/lang/Object;-&amp;gt;&amp;lt;init&amp;gt;()V&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return-void&lt;br /&gt;.end method&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;So, the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; variable is actually an instance of the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;MainActivity&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; class. Since this class extends the &lt;/span&gt;&lt;a href=&quot;https://developer.android.com/reference/android/app/Activity.html&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Activity&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://developer.android.com/reference/android/app/Activity.html&quot; style=&quot;font-family: inherit;&quot;&gt; class&lt;/a&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;, it also extends a &lt;/span&gt;&lt;a href=&quot;https://developer.android.com/reference/android/content/Context.html&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Context&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://developer.android.com/reference/android/content/Context.html&quot; style=&quot;font-family: inherit;&quot;&gt; class&lt;/a&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;, which means it has a &lt;/span&gt;&lt;a href=&quot;https://developer.android.com/reference/android/content/Context.html#startService%28android.content.Intent%29&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;startService&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://developer.android.com/reference/android/content/Context.html#startService%28android.content.Intent%29&quot; style=&quot;font-family: inherit;&quot;&gt; method&lt;/a&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. Now we know what &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;this.a&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; means, but there is no &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;static a&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; method in &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;MainActivity&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;. When we take a look into the smali code we see that it&#39;s the same &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;synthetic&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; trick used, but this time it&#39;s used to hide a method, not a variable.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;.method static synthetic a(Lcom/zero1/sandrorat/MainActivity;)Landroid/content/Intent;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; .locals 1&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; iget-object v0, p0, Lcom/zero1/sandrorat/MainActivity;-&amp;gt;c:Landroid/content/Intent;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; return-object v0&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;.end method&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;This method returns the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; variable, which actually is the instance of the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Controller&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; class. Now everything makes sense. The only line of code in the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;onClick&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; method is responsible for running the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Controller&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; service. This service is responsible, among other things, for the C&amp;amp;C communication.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;It&#39;s worth noting that the service responsible for communication is not started automatically, but waits for a user to press a button (or for a phone to restart). This is done to prevent the automatic sandbox from capturing the network traffic.&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;C&amp;amp;C communication&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
When we start to browse different classes we eventually come to the class that seems to hold communication parameters. Class is presented below, it has only three static variables.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXwwepQkKIqjg0W-cLsE_fi3KMl66OrBuKPSvmr0z9T6T-PoYPbHboXqgo0_N4vIXFtXOFGqQW4dOsqlZ9voOVbKkdgzotDjTpwPAJTJB14icv56-AbYeC5Gc7B7plzipTTWKfW4mZ4yg/s1600/Zrzut+ekranu+z+2014-09-10+21:41:37.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;91&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXwwepQkKIqjg0W-cLsE_fi3KMl66OrBuKPSvmr0z9T6T-PoYPbHboXqgo0_N4vIXFtXOFGqQW4dOsqlZ9voOVbKkdgzotDjTpwPAJTJB14icv56-AbYeC5Gc7B7plzipTTWKfW4mZ4yg/s1600/Zrzut+ekranu+z+2014-09-10+21:41:37.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Educated guess will be that the first and last variables are C&amp;amp;C addresses, and the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;b&lt;/span&gt; variable is a port number. However, it seems that the first two variables are there as a decoy - false domain and port just to obfuscate the real C&amp;amp;C address. First, Sandrorat sends a register message (&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;l&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;class is responsible for this) via HTTP POST to the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;am.c + &quot;DeviceManager.php?func=registerDevice&quot;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;&lt;/span&gt;URL&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;with a couple of device information and some other parameters. In response it should receive the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;registered&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; string. Then, again using the&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;synthetic&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;tricks, the actual communication takes place.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Communication is handled by the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; class, but the main &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;switch&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; instruction, responsible for the command execution, is in the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Controller&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; class&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span class=&quot;sh_keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;sh_type&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;sh_symbol&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;sh_function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;sh_symbol&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh_type&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;sh_symbol&quot;&gt;,&lt;/span&gt; java&lt;span class=&quot;sh_symbol&quot;&gt;.&lt;/span&gt;lang&lt;span class=&quot;sh_symbol&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh_usertype&quot;&gt;String&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;sh_symbol&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;)&lt;/span&gt; method. Communication is pretty straightforward. First, it sends a HTTP POST to the&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;am.c + &quot;Linker.php?func=getCommand&quot;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;with a device ID as one of the parameters. It then receives one line with a command or no command at all. This line has a following structure:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;lt;command_number&amp;gt;#&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;lt;parameters&amp;gt;#&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;lt;answer_token&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Where&amp;nbsp;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;lt;parameters&amp;gt;&lt;/span&gt;&amp;nbsp;is a &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;~&lt;/span&gt; delimited list of strings. Response to each of the commands is made via HTTP POST body to the&amp;nbsp;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;am.c + &quot;upload.php&quot;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;URL with a &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;filename&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;parameter, which is composed of the device serial number,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;answer_token&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;and the &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;.dj&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; string. Then some weird HTTP POST request to the&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;am.c + &quot;Linker.php?func=setResult&quot;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;is made. I have no idea what is the purpose of this POST request.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Anyhow, that&#39;s all for this post, in the next one I will try to explain a couple of commands that Sandrorat can perform. Just a quick sneak peek: &lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt; is for ping and it always responds with the&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&quot;Ack&quot; &lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;string.&lt;/span&gt;&lt;/div&gt;
</description><link>http://maldr0id.blogspot.com/2014/09/sandroid-rat-analysis-part-i-synthetic.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXwwepQkKIqjg0W-cLsE_fi3KMl66OrBuKPSvmr0z9T6T-PoYPbHboXqgo0_N4vIXFtXOFGqQW4dOsqlZ9voOVbKkdgzotDjTpwPAJTJB14icv56-AbYeC5Gc7B7plzipTTWKfW4mZ4yg/s72-c/Zrzut+ekranu+z+2014-09-10+21:41:37.png" height="72" width="72"/><thr:total>0</thr:total></item></channel></rss>