People often ask me "How did you learn how to hack?" The answer: by reading. This page is a collection of the blog posts and other articles that I have accumulated over the years of my journey. Enjoy!
RTS instruction will jump the code to 0x0000 on the stack. The NMI continues to happen every frame - it records button press inputs to $17,$18,$F5,$F6 and $F8. Through careful planning, the controller inputs can be used to write somewhat arbitrary asm to execute. JSR $9000 at the scratch address using two controllers. Using the only inputs PUSH a value of 0xFA to register SP.JSR $0000 being executed.JSR $9000 is executes from the previous write after our jump occurs. Since the SP is sane this works.CreatorId. However, we can specify our boost to have another users ID! Most of the time, adding information to a user blind isn't helpful. In the case of JavaScript being ran in the browser, it's real bad though. chrome://settings were affected by this. Since these pages have special permissions, it's likely that RCE was possible. -1stake, the validation of the bank module to ensure a user isn't overdrawing amounts will panic. Assertion. This holds information about user details in most cases. To ensure it hasn't been tampered, the assertion is hashed then verified with a digital signature.Signature value is passed inside the SignatureValue element. The hashed data is in the SignedInfo block. This contains a DigestValue and a Reference URI pointing to the assertion.DigestValue in the SignedInfo block to prevent tampering. Next, it validates the digital signature over the top of the hash./ will select the root of the document and // will select any node from the document that it can find.DigestValue via XPATH, the query was //ds:DigestValue. This will find the first instance of the DigestValue in the document! This allows an attacker to smuggle in the value into the document. DigestValue via XPATH, the query was //ds:DigestValue. This will find the first instance of the DigestValue in the document! This allows an attacker to smuggle in the value into the document. DigestValue into an unsigned element with a modified Assertion block.from_slice() function requires that it must be 32 bytes in length. When processing this in the handshake code of P2P, expect(), a nice wrapper for unwrap() is called. If the public key isn't 32 bytes, then a panic is triggered.from_i32() converts the recovery ID value from a single byte to an i32. When doing this, the value is required to be between 0-3 but it can in reality be 0-255. Later on, unwrap() is called, causing a panic upon the error path being taken.tx.origin and msg.sender. One is used for the original executor of the transaction and the second is the most recent caller. This same concept exists in Clarity as well. AsContract command can override the tx.origin of the original caller. This is super important because this is what the post conditions are based around!AsContract command is used, if the call is made to an untrusted contract then there are no post conditions restricting where the money can go for this! This lack of access control on the smart contract call is the reason for the bug. By becoming the contract, we can now drain all of the funds from it. Yikes!AsContract is weird to me. I get there are situations where you want to act as the caller but it's such a security liability here. Again, not a great write up but an interesting vulnerability class none-the-less.Content-Type response header is used to tell the browser how to render a file. This page is a list of Content-Type header with the format they render that can be used for XSS. It even has a list of browsers that this works on.text/html as an HTML format. There are even weirder ones referenced too, like text/xsl being rendered as HTML., and ; can all used as Mime Type separators. For instance, text/plain; x=x, text/html is a valid HTML format when rendered by the browser.( and 0x9 are able to be used as separators. For instance, text/html(xxx is a valid content type that will be render as HTML.mint() function. On the BTC vault, there was a 1 to 1 mapping from Ethereum to BTC. Since BTC is much more expensive, performing this trade would result in an instant profit to the attacker. Although the BTC contract couldn't be called directly, the vault was a trusted minter that could still trigger this.