This commit is contained in:
jpk 2020-04-26 16:11:18 +02:00
commit 5653651d1e
108 changed files with 20424 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
ssh_id_goatpr0n.farm
ssh_id_goatpr0n.farm.pub

6
archetypes/default.md Normal file
View File

@ -0,0 +1,6 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
---

53
config.toml Normal file
View File

@ -0,0 +1,53 @@
baseURL = "https://goatpr0n.farm/"
languageCode = "en"
title = "GoatPr0n.farm"
theme = "hugo.386"
preserveTaxonomyNames = true
[params]
mainpagetitle = "GoatPr0n.farm"
mainpagesubtitle = "A farm w/o animals"
mainpagedesc = ""
copyrightname = "Julian Knauer"
loadfastload = false
loadspeedfactor = 1.0
loadonepass = false
[menu]
[[menu.main]]
identifier = "posts"
name = "All posts"
url = "/posts/"
weight = 20
[taxonomies]
category = "categories"
tag = "tags"
[privacy]
[privacy.youtube]
disabled = false
privacyEnhanced = true
[privacy.vimeo]
disabled = false
simple = true
[privacy.twitter]
disabled = false
enableDNT = true
simple = true
[privacy.instagram]
disabled = false
simple = true
[services]
[services.instagram]
disableInlineCSS = true
[services.twitter]
disableInlineCSS = true

3
content/_index.md Normal file
View File

@ -0,0 +1,3 @@
+++
author = "Julian Knauer"
+++

8
content/posts/_index.md Normal file
View File

@ -0,0 +1,8 @@
+++
aliases = ["posts","articles","blog","showcase","docs"]
title = "Blog"
author = "Julian Knauer"
tags = ["index"]
+++
# All posts

View File

@ -0,0 +1,90 @@
---
title: Can I haz ur dataz
categories:
- cyber
- brain fart
tags:
date: 2019-02-01 09:55:07
---
Remote data acquisitions over ssh
---------------------------------
To get your data trough `ssh` to your local storage, you simply use pipes. It does not matter if you use `cat`, `dd` or any other command line tool which outputs the data on standard output (_stdout_).
### Using `cat`
When using cat the there is no need to add any additional parameters in your command chain. A simple `cat <input>` will suffice.
`Cat` does not have any progress information during read operations.
### Using `dd`
The program `dd` requires more user interaction during the setup phase. To use `dd` you have to give the _if=_ argument. The use of different blocksizes (_bs_) will not have that much of an impact on the speed. Feel free to have a look at this [this](https://goatpr0n.farm/2019/01/23/what-if-the-cult-of-dd-is-right/).
![](https://dl.goatpr0n.events/$/VAN9L)
_Wow. So scientific! Much CLI._
Examples
--------
A simple example with no output to the terminal except of errors. The output to _stderr_ is not suppressed.
``` bash
$ # Using cat to copy /dev/sda
$ ssh <user@remotehost> 'cat /dev/sda' > sda.raw
```
If you want to suppress errors, use:
``` bash
$ # Using cat to copy /dev/sda
$ ssh <user@remotehost> 'cat /dev/sda 2>/dev/null' > sda.raw
```
The next example will demonstrate the use of `dd`.
``` bash
$ # Using dd to copy /dev/sda
$ ssh <user@remotehost> 'dd if=/dev/sda' > sda.raw
```
Of course you can suppress errors as well.
Speeding up the data acquisition and minor tweaks
-------------------------------------------------
With the basics covered, we can begin optimizing our data transfer. In the first step we speed up the transfer with `gzip`.
The argument _-c_ will write the compressed data to _stdout_ which will be piped to your local system.
Of course you can use this with `cat` as well.
``` bash
$ ssh <user@remotehost> 'dd if=/dev/sda | gzip -c' | gunzip > sda.raw
```
To add some progress information, you have two options with `dd`.
``` bash
$ # dd status
$ ssh <user@remotehost> 'dd if=/dev/sda status=progress | gzip -c' \
> | gunzip > sda.raw
```
The _status_ argument writes the output to _stderr_ and will not end up in your local copy.
``` bash
$ # dd through pv
$ ssh <user@remotehost> 'dd if=/dev/sda | gzip -c' \
> | pv | gunzip > sda.raw
```
`Pv` needs to be installed separatly. Check your packet manager. 0r teh Googlez!
KTHXBYE.
#### Update #01
Fixed a problem within the examples. Had a pipe too much. #Fail

View File

@ -0,0 +1,487 @@
---
title: Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com
tags:
- CTF
- hacking
- python
categories:
- CTF
- cyber
- reverse engineering
date: 2019-07-24 12:19:47
---
_#MemeFreeEdition_
The Challenge
-------------
You are provided a zip file containing two files.
* `program`
* `vm.py`
The file `program` contains instructions encoded as emojis for a virtual machine called `vm.py`. At the bottom of `vm.py` I found a list, or lets call it a translation table, with emojis and their function name counter part.
``` python
OPERATIONS = {
'🍡': add,
'🤡': clone,
'📐': divide,
'😲': if_zero,
'😄': if_not_zero,
'🏀': jump_to,
'🚛': load,
'📬': modulo,
'⭐': multiply,
'🍿': pop,
'📤': pop_out,
'🎤': print_top,
'📥': push,
'🔪': sub,
'🌓': xor,
'⛰': jump_top,
'⌛': exit
}
```
To execute `program` with `vm.py` I ran:
``` bash
$ python vm.py program
http://^C
```
The program started printing letters to the terminal, but became horribly slow, until I decided to terminate the execution. So the challenge seemed to be, to convince `program` to give me its secret. With the first characters looking like an URL, the flag might be hidden within the URL or on the website the URL pointing to.
In which way I had to convince the program to reveal its secrets to me, I had yet to decide. One way could be to optimize the VM code, the other might be optimizing the code of `program`.
The Solution(s)
---------------
### Solving the Challenge: Trail and Error
The python script `vm.py` defines a class named `VM` with the following constructor:
``` python
def **init**(self, rom):
self.rom = rom
self.accumulator1 = 0
self.accumulator2 = 0
self.instruction_pointer = 1
self.stack = \[\]
```
The VM stores the program code in the variable `self.rom`. It is filled on creation by reading the source file (`program`) given as argument. The source is stored as a list (returned by `.read().split()` of a `file` object). Two accumulator registers, `self.accumulator1` and `self.accumulator2`, are initialized with '0'. A third register is the `self.instruction_pointer`, it will the the VM which operation in `self.rom` will be executed next. It starts at '1' and not at '0'. The list containing the rom is initialized with an empty string (`['']`) and then extended by the program code. The last variable is `self.stack` which is empty list.
Lists in Python can be used as a stack like structure. With `list.append()` (`push`) and `list.pop()` (`pop`) the behavior of these data structures is identical.
I decided to translate the emoji code of `program` into a more human readable version as a beginning. A dictionary of all operations is at the bottom of the code.
The first version of my script did not translate all emojis in the code. I started digging around further in `vm.py` to find some more emojis I had to consider. As a result a almost completely emoji free version of the program could be generated. The "final" version of my script [emoji2mnemonic.py](https://git.goatpr0n.de/snippets/4) had the following dictionary to translate `program`.
``` python
OPERATIONS = {
'🍡': 'add',
'🤡': 'clone',
'📐': 'divide',
'😲': 'if_zero',
'😄': 'if_not_zero',
'🏀': 'jump_to',
'🚛': 'load',
'📬': 'modulo',
'⭐': 'multiply',
'🍿': 'pop',
'📤': 'pop_out',
'🎤': 'print_top',
'📥': 'push',
'🔪': 'sub',
'🌓': 'xor',
'⛰': 'jump_top',
'⌛': 'exit',
'✋': ';',
'🥇': '[acc=1]',
'🥈': '[acc=2]',
'💰': '@',
'😐': 'end_if',
'🖋': 'func_',
'🏀': 'BRK<',
'⛰': 'BRK!',
'💠🔶🎌🚩🏁': 'Label01',
'💠🏁🎌🔶🚩': 'Label02',
'🚩💠🎌🔶🏁': 'Label03',
'🏁🚩🎌💠🔶': 'Label04',
'🔶🎌🚩💠🏁': 'Label05',
'🎌🏁🚩🔶💠': 'Label06',
'🔶🚩💠🏁🎌': 'Label07',
'🚩🔶🏁🎌💠': 'Label08',
'🎌🚩💠🔶🏁': 'Label09',
'🎌🏁💠🔶🚩': 'Label10',
'🏁💠🔶🚩🎌': 'Label11',
'💠🎌🏁🚩🔶': 'Label12',
'0⃣ ': '0',
'1⃣ ': '1',
'2⃣ ': '2',
'3⃣ ': '3',
'4⃣ ': '4',
'5⃣ ': '5',
'6⃣ ': '6',
'7⃣ ': '7',
'8⃣ ': '8',
'9⃣ ': '9',
}
```
The language for `vm.py` also knows labels for the `jump_to` operations and a symbol to distinguish between the accumulators to use.
A look at the translated source was a little bit more helpful. The example below shows a cleaned up, but shortened version of my interpretation of the syntax after translation.
```
load \[acc=1\] 0;
push \[acc=1\]
load \[acc=1\] 17488;
push \[acc=1\]
load \[acc=1\] 16758;
push \[acc=1\]
load \[acc=1\] 16599;
push \[acc=1\]
load \[acc=1\] 16285;
...
push \[acc=1\]
load \[acc=2\] 1;
func Label01
pop \[acc=1\]
push \[acc=2\]
push \[acc=1\]
load \[acc=1\] 389;
push \[acc=1\]
push \[acc=2\]
jump_to $\[ Label04
xor
print_top
load \[acc=1\] 1;
push \[acc=1\]
add
pop \[acc=2\]
if\_not\_zero
jump_to $\[ Label01
end_if
...
```
To find out what each operation does, I looked at the source code of `vm.py`. The `load` instruction reads as follows: "Load accumulator1 with the immediate value 0". With push the value stored in the accumulator1 is pushed to the stack. Other operations take the top two items from the stack to process them (addition, subtraction, multiplication, division, modulo, xor, ...).
By only looking at the code I had no clue what was going on, but with all the jumps, I though about visualizing the program flow. I used my translated program and formatted the code to be a compatible [Graphviz](https://www.graphviz.org/) [dot file](https://git.goatpr0n.de/snippets/5). The resulting graph was again a little bit more of an help.
![](https://goatpr0n.farm/wp-content/uploads/2019/07/program.png)
Call graph of program
The graph shows a bunch of instructions to fill the stack of the VM. The right side has some more "complicated" instructions with modulo, division, xor, ....
When I see xor instructions, I often think of encryption and with multiplications and modulo instructions right next to it this though hardens.
But starring at the graph and the translated code did not help.
### Solving the Challenge: Finally
It took me a while of starring until I realized, that I should try something else.
My next approach to solve this challenge was to write a trace log of the program execution step by step.
In each instruction function in `vm.py` I added some additional code to store the current status of the registers `self.instruction_pointer`, `self.accumulator1`, `self.accumulator2` and translated each operation into its human readable counter part. I also added (if possible) the parameters and the result of calculations.
```
00000002 \[acc1=00000000\]\[acc2=00000000\]: load("acc1", 0)
00000006 \[acc1=00000000\]\[acc2=00000000\]: push(acc1) = 0
00000008 \[acc1=00017488\]\[acc2=00000000\]: load("acc1", 17488)
00000016 \[acc1=00017488\]\[acc2=00000000\]: push(acc1) = 17488
00000018 \[acc1=00016758\]\[acc2=00000000\]: load("acc1", 16758)
00000026 \[acc1=00016758\]\[acc2=00000000\]: push(acc1) = 16758
00000028 \[acc1=00016599\]\[acc2=00000000\]: load("acc1", 16599)
00000036 \[acc1=00016599\]\[acc2=00000000\]: push(acc1) = 16599
00000038 \[acc1=00016285\]\[acc2=00000000\]: load("acc1", 16285)
...
00000386 \[acc1=00000389\]\[acc2=00000001\]: push(acc2) = 1
00000388 \[acc1=00000389\]\[acc2=00000001\]: jump_to(Label04) @1040
00001041 \[acc1=00000002\]\[acc2=00000001\]: load("acc1", 2)
00001045 \[acc1=00000002\]\[acc2=00000001\]: push(acc1) = 2
00001048 \[acc1=00000002\]\[acc2=00000001\]: jump_to(Label08) @1098
00001099 \[acc1=00000002\]\[acc2=00000001\]: clone() = 2
00001100 \[acc1=00000002\]\[acc2=00000001\]: load("acc1", 2)
00001104 \[acc1=00000002\]\[acc2=00000001\]: push(acc1) = 2
00001107 \[acc1=00000002\]\[acc2=00000001\]: sub(b=2, a=2) = 0
00001108 \[acc1=00000002\]\[acc2=00000001\]: if_zero() = 0
00001109 \[acc1=00000002\]\[acc2=00000001\]: pop_out() // 0
00001110 \[acc1=00000001\]\[acc2=00000001\]: load("acc1", 1)
00001114 \[acc1=00000001\]\[acc2=00000001\]: push(acc1) = 1
00001115 \[acc1=00000001\]\[acc2=00000001\]: end_if = 🏀
00001115 \[acc1=00000001\]\[acc2=00000001\]: …cont… if_zero()
00001116 \[acc1=00000001\]\[acc2=00000001\]: jump_to(Label05) @1050
00001051 \[acc1=00000001\]\[acc2=00000001\]: if_zero() = 1
00001055 \[acc1=00000001\]\[acc2=00000001\]: end_if
00001057 \[acc1=00000001\]\[acc2=00000001\]: pop_out() // 1
...
```
There are still a few emojis left, but I did not care about them. With the trace log I could observe the program being executed and calculating the URL, or at least see the trace part where the `print_top` of the characters happens.
```
00001076 \[acc1=00000002\]\[acc2=00000001\]: if_zero() = 0
00001077 \[acc1=00000002\]\[acc2=00000001\]: pop_out() // 0
00001078 \[acc1=00000002\]\[acc2=00000389\]: pop(acc2) = 389
00001080 \[acc1=00000002\]\[acc2=00000389\]: push(acc1) = 2
00001082 \[acc1=00000002\]\[acc2=00000389\]: push(acc2) = 389
00001083 \[acc1=00000002\]\[acc2=00000389\]: end_if = ⛰
00001083 \[acc1=00000002\]\[acc2=00000389\]: …cont… if_zero()
**00001084 \[acc1=00000002\]\[acc2=00000389\]: jump_top() @389
00000390 \[acc1=00000002\]\[acc2=00000389\]: xor(b=106, a=2) = 104**
00000391 \[acc1=00000002\]\[acc2=00000389\]: print_top("h")
00000392 \[acc1=00000001\]\[acc2=00000389\]: load("acc1", 1)
00000396 \[acc1=00000001\]\[acc2=00000389\]: push(acc1) = 1
00000398 \[acc1=00000001\]\[acc2=00000389\]: add(a=1, b=1) = 2
00000399 \[acc1=00000001\]\[acc2=00000002\]: pop(acc2) = 2
00000401 \[acc1=00000001\]\[acc2=00000002\]: if\_not\_zero() = 119
00000401 \[acc1=00000001\]\[acc2=00000002\]: end_if = 🏀
00000401 \[acc1=00000001\]\[acc2=00000002\]: …cont… if_zero()
00000402 \[acc1=00000001\]\[acc2=00000002\]: jump_to(Label01) @371
```
The `print_top` instruction takes the item from the top of the stack and prints it out. The stack only stores numbers, so the number is converted into a character before output. Right before the `print_top` is a `xor`.
The `xor` takes the two top items from the stack to get the result of '104' which is the letter "h". The number '106' was pushed to the stack in the beginning, but where does the '2' come from? This took be a while to find out. But only after letting the program run bit longer.
``` bash
$ grep -A1 xor trace.log
00000390 \[acc1=00000002\]\[acc2=00000389\]: xor(b=106, a=2) = 104
00000391 \[acc1=00000002\]\[acc2=00000389\]: print_top("h")
00000390 \[acc1=00000003\]\[acc2=00000389\]: xor(b=119, a=3) = 116
00000391 \[acc1=00000003\]\[acc2=00000389\]: print_top("t")
00000390 \[acc1=00000005\]\[acc2=00000389\]: xor(b=113, a=5) = 116
00000391 \[acc1=00000005\]\[acc2=00000389\]: print_top("t")
00000390 \[acc1=00000007\]\[acc2=00000389\]: xor(b=119, a=7) = 112
00000391 \[acc1=00000007\]\[acc2=00000389\]: print_top("p")
00000390 \[acc1=00000011\]\[acc2=00000389\]: xor(b=49, a=11) = 58
00000391 \[acc1=00000011\]\[acc2=00000389\]: print_top(":")
00000390 \[acc1=00000101\]\[acc2=00000389\]: xor(b=74, a=101) = 47
00000391 \[acc1=00000101\]\[acc2=00000389\]: print_top("/")
00000390 \[acc1=00000131\]\[acc2=00000389\]: xor(b=172, a=131) = 47
00000391 \[acc1=00000131\]\[acc2=00000389\]: print_top("/")
00000390 \[acc1=00000151\]\[acc2=00000389\]: xor(b=242, a=151) = 101
00000391 \[acc1=00000151\]\[acc2=00000389\]: print_top("e")
00000390 \[acc1=00000181\]\[acc2=00000389\]: xor(b=216, a=181) = 109
00000391 \[acc1=00000181\]\[acc2=00000389\]: print_top("m")
00000390 \[acc1=00000191\]\[acc2=00000389\]: xor(b=208, a=191) = 111
00000391 \[acc1=00000191\]\[acc2=00000389\]: print_top("o")
00000390 \[acc1=00000313\]\[acc2=00000389\]: xor(b=339, a=313) = 106
00000391 \[acc1=00000313\]\[acc2=00000389\]: print_top("j")
00000390 \[acc1=00000353\]\[acc2=00000389\]: xor(b=264, a=353) = 105
00000391 \[acc1=00000353\]\[acc2=00000389\]: print_top("i")
00000390 \[acc1=00000373\]\[acc2=00000389\]: xor(b=344, a=373) = 45
00000391 \[acc1=00000373\]\[acc2=00000389\]: print_top("-")
00000390 \[acc1=00000383\]\[acc2=00000389\]: xor(b=267, a=383) = 116
00000391 \[acc1=00000383\]\[acc2=00000389\]: print_top("t")
```
Again after a long round of starring at the output, it hit me. The argument `a` is always a prime number, but these are special primes. All primes are palindromes. The argument `b` is the value from the stack.
In my next step I wrote a script to calculate the palindrome primes and xor them with the values from the stack. I also discarded the idea to optimize the one of the components to solve this challenge.
As my final solution does not use the next code blocks anymore I will only highlight some ideas and problems I encountered.
I found a algorithm to calculate palindrome prime numbers on [Stackoverflow](https://stackoverflow.com/questions/22699625/palindromic-prime-number-in-python) and modified it to my needs.
``` python
def gen\_pal\_prime(a, b):
for i in range(a, b):
y = True
if str(i) == str(i)\[::-1\]:
if(i > 2):
for a in range(2, i):
if i % a == 0:
y = False
break
if y:
yield i
palindromes = \[_ for _ in gen\_pal\_prime(0, 999999)\]
```
The problem with this was, depending on the second parameter it takes a long time to calculate all primes and the other problem was, it did not work. Or it stopped working after the 39th character.
The algorithm failed to calculate the correct xor value for '93766'. As the string read until it broke "http://emoji-t0anaxnr3nacpt4na.web.ctfco" my guess was, that the next character has to be a 'm' (ctfcompetition).
Brute forcing the prime number for '93766' returned '93739'. What left me puzzled again. The previous prime number was '17471'. So I split up the whole blocks of pushing numbers to the stack into three blocks.
```
+-----------+-----------+-----------+
| Block 1 | Block 2 | Block3 |
+-----------+-----------+-----------+
| 17488 | 98426 | 101141058 |
| 16758 | 97850 | 101060206 |
| 16599 | 97604 | 101030055 |
| 16285 | 97280 | 100998966 |
| 16094 | 96815 | 100887990 |
| 15505 | 96443 | 100767085 |
| 15417 | 96354 | 100707036 |
| 14832 | 95934 | 100656111 |
| 14450 | 94865 | 100404094 |
| 13893 | 94952 | 100160922 |
| 13926 | 94669 | 100131019 |
| 13437 | 94440 | 100111100 |
| 12833 | 93969 | 100059926 |
| 12741 | 93766 | 100049982 |
| 12533 | 99 | 100030045 |
| 11504 | | 9989997 |
| 11342 | | 9981858 |
| 10503 | | 9980815 |
| 10550 | | 9978842 |
| 10319 | | 9965794 |
| 975 | | 9957564 |
| 1007 | | 9938304 |
| 892 | | 9935427 |
| 893 | | 9932289 |
| 660 | | 9931494 |
| 743 | | 9927388 |
| 267 | | 9926376 |
| 344 | | 9923213 |
| 264 | | 9921394 |
| 339 | | 9919154 |
| 208 | | 9918082 |
| 216 | | 9916239 |
| 242 | | 765 |
| 172 | | |
| 74 | | |
| 49 | | |
| 119 | | |
| 113 | | |
| 119 | | |
| 106 | | |
| 1 | | |
+-----------+-----------+-----------+
```
The purpose of the last number of each block opened up to me, when I finally found the correct prime for the third block. To decode the correct URL I ignored these numbers ('1', '99', '765') and started building special cases into my decoding function.
The code below almost worked fine. Each block would be separately being decoded, after a certain number of iterations (`i`). I tried to make some sense of these numbers at the bottom of each block.
``` python
print('Palindrome Primes #1')
palindromes1 = \[_ for _ in gen\_pal\_prime(1, 18000)\]
palindromes1.insert(0, 2) # manually add the number 2.
print('Palindrome Primes #2')
palindromes2 = \[_ for _ in gen\_pal\_prime(93766 - 99, 999999)\]
print('Palindrome Primes #3')
palindromes3 = \[_ for _ in gen\_pal\_prime(9916239 - 765, 19916239)\]
palindromes = palindromes1
stack.reverse()
for i, val in enumerate(stack):
if i == 40:
mode = 'stack2'
palindromes = palindromes2
if mode == 'stack2':
i -= 40
if i == 14:
mode = 'stack3'
palindromes = palindromes3
if mode == 'stack3':
i -= 13
c = val ^ palindromes\[i\]
print(f'{i:<8d}| {val:8d} ^ {palindromes\[i\]:<8} = {c:3d}', chr(c))
```
While my program ran, I encountered yet again a problem but this time during decoding the third block of numbers. The calculation of my palindrome primes took quite some time and did not result in printable/human readable characters.
Talking to a colleague of mine, he came up with the idea to look up lists of precalculated prime numbers and I found a website which provides lists of the first 2 billion prime numbers as downloadable files.
The site [http://www.primos.mat.br/2T_en.html](http://www.primos.mat.br/2T_en.html) provides individual compressed text files, with 10 million primes each file. For this challenge the prime numbers from 2 to 179424673 should suffice.
After decompressing the file I had to convert the file from columns separated by tabs to a easier to read format for my Python programs. To remove the columns and only have one prime per line I used the program `tr`.
``` bash
$ tr '\\t' '\\n' < 2T_part1.txt > primes.txt
```
I wrote a function to read this file to only return the palindrome primes as a list. The `str(_.rstrip()) == str(_.rstrip())[::-1]` part of the condition will check if the number is a palindrome, by comparing the number as string against it reversed counterpart.
``` python
def load_primes(filename):
with open(filename, 'rt') as handle:
return \[int(_) for _ in handle.readlines()
if str(_.rstrip()) == str(_.rstrip())\[::-1\]\]
```
With this list of palindrome primes I wrote a short brute force solution to find the correct prime number to decode the third block, or to be more precise, where in this list of primes can I find it.
As a constraint I iterated through all primes until the prime `p` from `primes` is greater than the number ('9916239') I am looking for. Then I know, that my prime had to be within the first 765 primes.
``` python
>>\> primes = solver.load_primes('primes.txt')
>>\> for i, p in enumerate(primes):
... if p > 9916239:
... print(i)
... break
...
765
```
At this point the 3 numbers I could not figure out until now, now made sense. These are the n-th number prime from a list of consecutive palindrome primes. The first block begins at the the 1st prime from my list of primes, the second block begins at the 99th prime number and the third block at the 765th prime number from my list.
And now it also makes sense, why `program` becomes slower with each iteration. The code block (see the call graph above) calculates palindrome prime numbers, which becomes more and more of a problem regarding performance when it hits greater numbers.
How does my final solution look like? I wrote a script called `solver.py`, put all numbers from all three blocks into a single list and wrote my decryption function.
``` python
#! /usr/bin/env python
#\-\*\- coding: utf-8 -*-
stack = \[101141058, 101060206, 101030055, 100998966, 100887990,
100767085, 100707036, 100656111, 100404094, 100160922,
100131019, 100111100, 100059926, 100049982, 100030045,
9989997, 9981858, 9980815, 9978842, 9965794, 9957564,
9938304, 9935427, 9932289, 9931494, 9927388, 9926376,
9923213, 9921394, 9919154, 9918082, 9916239, # Block 3
98426, 97850, 97604, 97280, 96815, 96443, 96354, 95934,
94865, 94952, 94669, 94440, 93969, 93766, # Block 2
17488, 16758, 16599, 16285, 16094, 15505, 15417, 14832,
14450, 13893, 13926, 13437, 12833, 12741, 12533, 11504,
11342, 10503, 10550, 10319, 975, 1007, 892, 893, 660,
743, 267, 344, 264, 339, 208, 216, 242, 172, 74, 49, 119,
113, 119, 106\] # Block 1
def load_primes(filename):
with open(filename, 'rt') as handle:
return \[int(_) for _ in handle.readlines()
if str(_.rstrip()) == str(_.rstrip())\[::-1\]\]
if \_\_name\_\_ == '\_\_main\_\_':
palindromes = load_primes('primes.txt')
stack.reverse()
offset = 0
for i, val in enumerate(stack):
if i == 40:
offset = 98 - 40
if i == 54:
offset = 764 - 54
c = val ^ palindromes\[i + offset\]
print(chr(c), end='')
print()
```
Running this script will produce the URL "`http://emoji-t0anaxnr3nacpt4na.web.ctfcompetition.com/humans_and_cauliflowers_network/`". Visiting this URL gives a choice for three sub pages of different people. The flag is stored in the personal page of Amber within a picture. The flag reads "`CTF{Peace_from_Cauli!}`".
Lessons learned
---------------
Doing CTFs sometimes require you to think out of the box and/or ignore the first possible solutions which might seem to be the obvious ones, but might lead you nowhere or are just there to keep you side tracked.
This challenge first got me thinking about modifying and changing the behavior of the provided files `program` and `vm.py`. While working through the challenge, which kept me busy for quite some time, I found a different solution.
The previous tries to solve this challenge were not for nothing, especially the addition of my trace log addition, which finally helped me understanding the problem and getting my on the right track to the solution.

View File

@ -0,0 +1,18 @@
---
title: 'Hack back during #cyberwar'
url: 25.html
id: 25
categories:
- cyber
- brain fart
date: 2019-02-05 18:45:08
tags:
---
According this [article](https://www.golem.de/news/digitaler-gegenschlag-mehrheit-befuerwortet-hackbacks-im-cyberkrieg-1902-139338.html) people want us to hack back, and the government is like:
![](https://dl.goatpr0n.events/$/4vfbw)
The GIF is probably copyrighted material by the The Fine Brothers. Plz Don't sue me. I no make cyber moneyz with this blog
KTHXBYE.

View File

@ -0,0 +1,41 @@
---
title: Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)
tags:
- hacking
- hardware
- jtag
categories:
- cyber
- hardware
- reverse engineering
date: 2019-09-25 15:22:58
---
TL;DR; Short the ERASE pin with VDDCORE, if ERASE == PIN\_55 && VDDCORE == PIN\_54
According to complains in the internet, users report bricking their Proxmark3 EASY, when they try to flash the latest firmware with the 'flasher' software tool.
Sometimes flashing process of firmware can go wrong, but it can often be recovered with JTAG programmers, or similar programmers.
I will not about setting up the environment to build, and flash the firmware, but I will tell you what you might be missing out and why it might be not working.
If you do not know where to start with flashing your Proxmark3, than have a look [here](https://github.com/Proxmark/proxmark3/wiki/flashing), [here](https://github.com/Proxmark/proxmark3/wiki/Debricking-Proxmark3-with-buspirate), [here](https://github.com/Proxmark/proxmark3/wiki/De-Bricking-Segger) or [here](https://joanbono.github.io/PoC/Flashing_Proxmark3.html). The first link describes the standard way of upgrading your firmware, which can fail, if you are unlucky. The other three links describe ways to recover your Proxmark3.
Why can upgrading the firmware fail? There are quite some reasons it can go wrong.
* bad firmware image
* wrong parameters
* power loss
* chip security measurements
With the Proxmark3 EASY it seems, that some devices have the _Security Bit_ of the AT91SAM7S512 processor set. The [datasheet](http://ww1.microchip.com/downloads/en/DeviceDoc/doc6175.pdf) (see page 113, paragraph 19.2.4.5) says: "The goal of the security bit is to prevent external access to the internal bus system. \[...\] JTAG, Fast Flash Programming and Flash Serial Test Interface features are disabled. Once set,this bit can be reset only by an external hardware ERASE request to the chip. \[...\]".
To unlock the chip again we can find interesting information in [this document](http://www.equinox-tech.com/downloads/equinox/ApplicationNotes/AN122%20Atmel%20AT91SAM7%20ISP%20Programming_V1-13_250110.pdf) on page 20 in paragraph 2.5. Which describes the unlocking the chip by applying _Vcc_ to the _ERASE_ pin. Applying voltage to the pin will wipe the security bit, but also all contents of the flash!
Unfortunately the ERASE pin, which is pin number 55 on the AT91SAM7S512, has no connection. The first idea was to solder a jumper wire to _Vcc_. On second guess and looking at the datasheets again, reveals pin 54 is _VDDCORE_, which applies 1.65V to 1.95V (1.8V typical) to the CPU for operation.
To erase and reset the Proxmark, I shortened pin 54 and pin 55 with the tip of a multimeter, applied power via USB to the Proxmark3. After >300ms the flash and security bit is erased and the device can be powered off.
The JTAG interface is now enabled again. Next I flashed the bootloader, and the fullimage using the Bus Pirate v4 using as described in one of the first links mentioned above.
#hackinghackertools

View File

@ -0,0 +1,338 @@
---
title: 'Reverse Engineering of a Flash Programmer :: EZP2010'
tags:
- flasher
- ghidra
- hacking
- hardware
- programmer
- reverse engineering
- rom
categories:
- hardware
- reverse engineering
date: 2019-11-28 12:01:53
---
Preface
-------
In today's adventure I like to take you with me on my journey of reverse engineering [another](https://goatpr0n.farm/?p=35) USB device. The EZP2010 is an USB programmer for flash memory as used by mainboard manufactures to store the BIOS, or embedded devices to store the firmware (or settings). When it comes to data recovery on hard drives, or similar storage devices, these flashers can also become handy.
![](https://dl.goatpr0n.events/$/7KvdF)
EZP2010 USB-Highspeed programmer
This particular programmer can be bought on many Chinese store or Amazon. The prize range varies form $8 to $24. Unfortunately the software and drivers which come with this programmer are windows only.
The micro controller unit (_MCU_) used is the [C8051F340](https://www.silabs.com/documents/public/data-sheets/C8051F34x.pdf). It was easily identified by opening the enclosure and looking at the markings of the _MCU_.
Start of an adventure
---------------------
![](https://dl.goatpr0n.events/$/Ulrgo)
Realistic representation of me, being outside and enjoining it. But without the running and the joy. I also have shoes and longer trousers.
As already mentioned, this adventure will be about reversing the USB protocol of this programmer.
To start with analyzing the programmer a virtual machine would be an easy solution. And here I came across another problem this programmer has. It is not necessarily the fault of the hardware, but of the drivers and software provided to use it.
I worked on this project on different host machines and different versions of a virtual machine. The main difference was the architecture used. One VM was a 64bit Windows 10 and the other a 32bit Windows 10. Trying to run the software on a 32bit system failed, the software was unable to connect to the programmer, but I could not find any drawback in using a 64bit Windows.
### Information Gathering
![](https://dl.goatpr0n.events/$/4vfbw)
Me looking for information.
The most obvious things to do are `lsusb` and opening up the enclosure. `Lsusb` will output all connected USB devices connected on a Linux machine and get the description, as well as the vendor id and product id for device identification.
The output of `lsusb` gives information on how to talk to the device. With the product and vendor id the verbose output of `lsusb` can be limited to display only the device of interest. USB devices have separate input and output "endpoints". On this particular device the endpoint to send our data to is `0x02 EP 2 OUT` and `0x81 EP 1 IN` where I can receive the responses and incoming data.
``` bash
$ lsusb
\[...\]
Bus 003 Device 027: ID 10c4:f5a0 Cygnal Integrated Products, Inc.
\[...\]
$ lsusb -v -d 10c4:f5a0
Bus 003 Device 027: ID 10c4:f5a0 Cygnal Integrated Products, Inc.
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
** idVendor 0x10c4 Cygnal Integrated Products, Inc.
idProduct 0xf5a0**
bcdDevice 0.00
iManufacturer 0
iProduct 0
iSerial 0
**bNumConfigurations 1**
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0020
**bNumInterfaces 1**
bConfigurationValue 1
**iConfiguration 0**
bmAttributes 0x80
(Bus Powered)
MaxPower 480mA
Interface Descriptor:
bLength 9
bDescriptorType 4
**bInterfaceNumber 0**
bAlternateSetting 0
**bNumEndpoints 2**
bInterfaceClass 0
bInterfaceSubClass 0
bInterfaceProtocol 0
**iInterface 0**
Endpoint Descriptor:
bLength 7
bDescriptorType 5
**bEndpointAddress 0x81 EP 1 IN**
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 5
Endpoint Descriptor:
bLength 7
bDescriptorType 5
**bEndpointAddress 0x02 EP 2 OUT**
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 5
```
In the beginning of this post, I already mentioned the used MCU for this programmer. It will not be of much of significance for this project but information is always nice to have. So the _C8051F340_ by Silicon Labs can do different things, but the most important ones are Universal Serial Bus (USB) Controller and the Serial Peripheral Interface (SPI). The USB connection manages the communication between the host (PC) and the device. The SPI will manage the programming of the flash memory.
### VM Setup
As previously told, I have used a 64bit Windows 10 virtual machine. For capturing the USB traffic I used [Wireshark and USBPcap](https://wiki.wireshark.org/CaptureSetup/USB#Windows). The workflow is the same as it is with network packet capturing. Instead of selecting a network interface, a USB root hub is selected where the device of interest is connected.
### Packet Capturing
At first I setup the packet capturing with Wireshark and select the USB root hub I want to monitor - and where I connect the programmer.
The next steps include a straight forward workflow, after Wireshark was configured and running. I started the programmer software. If Wireshark is configured correctly it reports the first packets captured during device initialization and opening the device by the software.
As there are not special device specific commands transferred during device and software initialization, these steps won't be necessary to cover here.
Now, if I press any button in the software to interact with the programmer, a corresponding reaction should be captured in Wireshark. To keep track which action resulted in which packets, Wireshark supports _comments_ for their _pcapng_ fileformat. When I press a button in the software, I comment the first packet captured and the last packet incoming.
![](https://dl.goatpr0n.events/$/ijnRU)
Firmware version read from programmer device.
To keep it simple, I will illustrate this on the command to request the firmware version of the device. The button is labeled "Ver" in the toolbar. When clicked, two messages are transmitted between the host and the device which are captured by Wireshark.
![](https://dl.goatpr0n.events/$/Pmke9)
Request and response packet content.
In the screen shot above, I commented the outgoing packet from the host to the programmer and labeled it "Request firmware". The answer - which came immediately after the outgoing message. I labeled the packet as "Request firmware: Answer". When I look into this dump a few days later, I will still be able to figure out what the cause of these packets were.
The firmware version request command are two bytes (_Leftover Capture Data_ in the Wireshark window) `0x17 0x00`. The answer will be the version string `EZP2010 V3.0` and a few more bytes.
This way I worked through every function provided by the software to capture all possible commands. The "Read" and "Prog" ROM commands will produce a few more packets depending on the size of the flash chip. The outgoing or incoming packets either be the contents read from the flash chip or the data going to be written to the flash chip.
While capturing the packets should be almost enough, a look at the decompiled code of the program can help finding possible pitfalls.
### Reversing the Programmer Windows Software
This part was not really necessary, but helped in the process of packet analysis as well in matching the captured command packets with a function in the disassembled program.
![](https://dl.goatpr0n.events/$/SeDcb)
Functions interacting with the programmer.
Each command supported by the programmer has a corresponding function. Matching all functions and command codes, I could see if I had found and captured all available commands the programmer hardware supports.
Refactoring the code generated by [Ghidra](https://ghidra-sre.org/), the result of reversing engineering a function could look like this. I am going through the code to request the firmware version.
![](https://dl.goatpr0n.events/$/pKHQO)
Example of a reversed function to query the firmware version.
The code in the screenshot above sends two bytes to the programmer and than tries to read 23 (0x17) bytes as answer. The while loop at the bottom copies the contents of the `bufferIn` variable into the output argument variable `version`.
Just to clarify, the variables are pointers to a memory location at this point. the variable will store the address where the value (version string) is stored.
### Writing a POC
![](https://dl.goatpr0n.events/$/DQSgq)
Actual video of me coding a POC.
#### Python POC
I often try to build my first proof of concept, or to validate my ideas, with a small Python program.
The code is based on the tutorial example provided by [PyUSB](https://github.com/walac/pyusb/blob/master/docs/tutorial.rst). I just added the other endpoint to read the responses from the programmer.
``` python
#!/usr/bin/env python
import usb.core
import usb.util
dev = usb.core.find(idVendor=0x10c4, idProduct=0xf5a0)
dev.set_configuration()
cfg = dev.get\_active\_configuration()
intf = cfg\[(0, 0)\]
epo = usb.util.find\_descriptor(intf, custom\_match=lambda e:
usb.util.endpoint_direction(e.bEndpointAddress)
== usb.util.ENDPOINT_OUT)
epi = usb.util.find\_descriptor(intf, custom\_match=lambda e:
usb.util.endpoint_direction(e.bEndpointAddress)
== usb.util.ENDPOINT_IN)
epo.write(\[0x17, 0x00\])
s_buf = ''.join(\[chr(c) for c in epi.read(256)\])
print(s_buf)
```
Executing the test program will give something like "`EZP2010 V3.0`" and a few more additional bytes. Which should be expected, as the receiving buffer is defined with a size of 0x17 (23 bytes).
At the moment I have not looked into the remaining bytes and their purpose. The original software does not display any more information, but the version string.
#### C POC
Doing it in C requires a bit more work. Below is the whole POC program source I have used to verify my work. The main part of the program is the USB device tree traversal to open and configure our target device. There is an easier to use function to do this with [libusb](https://libusb.info/).
But the function [`libusb_open_device_with_vid_pid()`](http://libusb.sourceforge.net/api-1.0/group__libusb__dev.html#ga11ba48adb896b1492bbd3d0bf7e0f665) gave me a bit of a trouble, as I was not able to configure the device properly to write and read data.
``` c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <libusb-1.0/libusb.h>
#define EZP2010_VID 0x10c4
#define EZP2010_PID 0xf5a0
static libusb_device_handle *devh = NULL;
libusb_device_handle *open_ezp2010()
{
ssize_t devc;
libusb_device **dev_list;
static libusb_device *dev = NULL;
struct libusb_device_descriptor dev_desc;
struct libusb_config_descriptor *dev_cfg = NULL;
const struct libusb_interface *intf = NULL;
const struct libusb_interface_descriptor *intf_desc = NULL;
int r = 0;
devc = libusb_get_device_list(NULL, &dev_list);
if (devc < 1)
return NULL;
for (int i = 0; i < devc; i++) {
dev = dev_list[i];
if (libusb_get_device_descriptor(dev, &dev_desc))
continue;
if ((dev_desc.idVendor != EZP2010_VID || dev_desc.idProduct != EZP2010_PID))
continue;
r = libusb_open(dev, &devh);
if (r < 0) {
perror("libusb_open");
return NULL;
}
for (int j = 0; j < dev_desc.bNumConfigurations; j++) {
if (libusb_get_config_descriptor(dev, j, &dev_cfg))
continue;
for (int k = 0; k < dev_cfg->bNumInterfaces; k++) {
intf = &dev_cfg->interface[k];
for (int l = 0; l < intf->num_altsetting; l++) {
intf_desc = &intf->altsetting[l];
if (libusb_kernel_driver_active(devh, intf_desc->bInterfaceNumber))
libusb_detach_kernel_driver(devh, intf_desc->bInterfaceNumber);
libusb_set_configuration(devh, dev_cfg->bConfigurationValue);
libusb_claim_interface(devh, intf_desc->bInterfaceNumber);
int e = 0;
while (libusb_claim_interface(devh, intf_desc->bInterfaceNumber) \
&& (e < 10)) {
sleep(1);
e++;
}
}
}
libusb_free_config_descriptor(dev_cfg);
}
return devh;
}
devh = NULL;
return NULL;
}
int main(int argc, char *argv[])
{
int r = 0;
int transferred = 0;
unsigned char buf[256];
r = libusb_init(NULL);
if (r < 0)
return 1;
open_ezp2010();
buf[0] = '\x17';
buf[1] = '\x0';
r = libusb_bulk_transfer(devh, 0x2, buf, 2, &transferred, 500);
if (r < 0) {
perror("libusb_claim_interface");
fprintf(stderr, "Error: %s\n", libusb_strerror(r));
}
printf("Bytes sent: %d\n", transferred);
r = libusb_bulk_transfer(devh, 0x81, buf, 0x20, &transferred, 500);
if (r < 0) {
perror("libusb_claim_interface");
fprintf(stderr, "Error: %s\n", libusb_strerror(r));
}
printf("Bytes received: %d\n", transferred);
printf("Packet: %s\n", buf);
libusb_release_interface(devh, 0);
libusb_reset_device(devh);
libusb_close(devh);
libusb_exit(NULL);
return 0;
}
```
### Future Work
My idea is to integrate it into existing programmer software, or to implement a small standalone tool for this programmer.
There is also still some research to do on the support for different flash chips. The original software provides a database with known and supported flash chips.
Looking at the code and figuring out the database structure might be the next step in further reverse engineering and developing further support for this programmer.

View File

@ -0,0 +1,414 @@
---
title: Reverse Engineering of the SkyRC MC3000 Battery Charger USB Protocol
categories:
- reverse engineering
date: 2019-03-18 16:49:39
tags:
- hardware
- reverse engineering
---
Software Requirements
---------------------
Decompiler for .NET programs
* [dotPeek](https://www.jetbrains.com/decompiler/)
The implementation of the protocol is then written in _Python_. Let's hear what the curator has to say:
Tell me about _Python_.
> Wow. Much Snake. Easy programming!
>
> \- Doge
Tell me about _dotPeek_.
> Easy decompilation. Readable syntax. Very easy.
>
> \- Doge
Analyzing MC3000_Monitor
------------------------
### Decompiling
Start _dotPeek_ and use Drag'n'Drop to load the Application. Or uSe **CtRL+O** anD LoCATe tHe fILe uSiNg ThE bOrwsEr. I am not your mother! The file will show up in the _Assembly Explorer_. You can expand and collapse nodes within the tree. Familiarize yourself with the program structure. Try to find the entry point or other "important" functions, modules or resources.
![](https://dl.goatpr0n.events/$/dQCmQ)
If you right click the **MC3000_Monitor** node you can export the project with individual source files. This project is stored as _*.cs_ source files.
You should now have either the project loaded into _dotPeek_ or - in addition - saved it as project and/or loaded it into _Visual Studio (VS)_ (Not covered here). I cannot afford _VS_. Still saving money to upgrade my IDA Pro license.
Intermission:
This is the curator speaking, and I command you to stop whining, 'JPK'.
As you can see, a lot of professionalism.
### Exploring the code
For me the easiest way to begin, is to find parts of code where user interaction is required. Run the program and look at the user interface. In this particular case we have four buttons next to a label each.
Lets explore the code in _dotPeek_ and see if we can find some code that might look familiar.
![](https://dl.goatpr0n.events/$/yWSxh)
Pressing one of the buttons opens another window where you can configure the charger slot. By further reading through the different functions you might come across the function `InitializeComponents():void`. Each window element gets setup and function callbacks/events are registered.
You eventually find something like this (see the picture below).
![](https://dl.goatpr0n.events/$/lRBYC)
Let's put on our smart looking spec ticals and read line 3468 and 3470. Line 3468 is the creation of the button text, which should look familiar. If not, search for hints on [this page](https://goatpr0n.farm). Line 3470 binds a function to the button press. With a **Ctrl+Left click** we jump to the function definition in _dotPeek_.
The function `private void button1_Click_1(object sender, EventArgs e)` is pretty simple to read. When the button is clicked, get the button name (e.g. "button1" \[1\]) and check if there is either the number `1`, `2`, `3` or `4` in the name.
![](https://dl.goatpr0n.events/$/Wul71)
Can you see the problem here? There is no error handling if button number is smaller than one or greater four. As an array is indexed, the program will probably crash. At this point we don't care. We want to make our own library, to make it better or different. After the name checking to know which slot is addressed, it calls a function `public void Set_Battery_Type_Caps(ChargerData[]data, int index)`. The functions sets the parameters of each battery slot and saves the values to an array.
This function sums up all parameters we need to know to setup a charger slot by or self. And we now know the default values. The below listing is the exception code, if anything goes wrong in the code above, but not when using an index outside bounds.
// Battery.cs:1195
data[index].Type = 0;
data[index].Caps = 2000;
data[index].Mode = 0;
data[index].Cur = 1000;
data[index].dCur = 500;
data[index].End_Volt = 4200;
data[index].Cut_Volt = 3300;
data[index].End_Cur = 100;
data[index].End_dCur = 400;
data[index].Cycle_Mode = 0;
data[index].Cycle_Count = 1;
data[index].Cycle_Delay = 10;
data[index].Peak_Sense = 3;
data[index].Trickle = 50;
data[index].Hold_Volt = 4180;
data[index].CutTemp = 450;
data[index].CutTime = 180;
The data structure `ChargerData` can be looked up as well, but the above listing is a little bit easier to read.
What we haven't seen at this point were bytes transferred to or from the device.
![](https://dl.goatpr0n.events/$/DVfA2)
At this point, there are multiple ways to get a good starting point on finding the functions where data is transmitted or received. One option is to look at the Assembly Explorer again for functions names of possible interest.
![](https://dl.goatpr0n.events/$/WJAOM)
These convenient looking functions. Or should I say obvious function names are obvious, are used to handle the USB device communication. Try right clicking a function to find out where it is used. I have used `usbOnDataRecieved`. In the below window with search results you can find a reference located in the constructor \[2\] of the class `FormLoader`.
// FormLoader.cs:352
this.usb = new UsbHidPort();
this.usb.ProductId = 1;
this.usb.VendorId = 0;
this.usb.OnSpecifiedDeviceArrived += new EventHandler(this.usbOnSpecifiedDeviceArrived);
this.usb.OnSpecifiedDeviceRemoved += new EventHandler(this.usbOnSpecifiedDeviceRemoved);
this.usb.OnDeviceArrived += new EventHandler(this.usbOnDeviceArrived);
this.usb.OnDeviceRemoved += new EventHandler(this.usbOnDeviceRemoved);
this.usb.OnDataRecieved += new DataRecievedEventHandler(this.usbOnDataRecieved);
this.usb.OnDataSend += new EventHandler(this.usbOnDataSend);
These lines above register event handlers with an instance of `UsbHidPort`. An event might be connecting or disconnecting the device (line: 355-358) or transferred data (line: 359-360). There is nothing special about the connect functions, except for `usbOnSpecifiedDevice...` ones. There is a call to stop and stop the `timer2` instance. We will look at this object in a second, but first we have a look at `usbOnDataSend` and `usbOnDataRecieved`.
// FormLoader.cs:513
private void usbOnDataRecieved(object sender, DataRecievedEventArgs args)
{
if (this.InvokeRequired)
{
try
{
this.Invoke((Delegate) new DataRecievedEventHandler(this.usbOnDataRecieved), sender, (object) args);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
else
{
++this.packet_counter;
for (int index = 0; index < 65; ++index)
this.inPacket[index] = args.data[index];
this.dataReceived = true;
}
}
...
// FormLoader.cs:580
private void usbOnDataSend(object sender, EventArgs e)
{
this.Text = "ChargeMonitor V2 Connect";
this.label_usb_status.Text = "USB ON";
this.label_usb_status.ForeColor = Color.Green;
}
The `usbOnDataSend` function is boring, and we can ignore it. There is no active sending of data to the usb device. `UsbOnDataReceived` on the other hand is actually doing something with an buffer of 64 bytes (line: 528-531).
When data is received an internal `packet_counter` is increased. Each packet has a size of 64 bytes (line: 529). The packet is copied into the `inPacket` array, and the `dataReceived` variable is set to true.
My guess is, that somewhere, something, somehow, might be, is waiting for a packet to arrive and waits until `dataReceived` is true. In _dotPeek_ we can use the magic function "Find Usages" again, to find out more.
![](https://dl.goatpr0n.events/$/HdRfX)
### Prototyping and understanding the program
Remember the `timer2` instance mentioned before? No, try to find the hint on [this page](https://goatpr0n.farm).
// Formload.cs:1219
private void timer2_Tick(object sender, EventArgs e)
{
byte num1 = 0;
if (!this.dataReceived)
return;
this.dataReceived = false;
if ((int) this.inPacket[1] == 240)
{
if (this.bwrite_chrager_data)
return;
int num2 = (int) MessageBox.Show("OK!");
}
else if ((int) this.inPacket[1] == 95)
this.Get_Charge_Data((int) this.inPacket[2]);
else if ((int) this.inPacket[1] == 90)
{
this.Get_System_Data((int) this.inPacket[3]);
}
else
{
if ((int) this.inPacket[1] != 85)
return;
for (int index = 1; index < 64; ++index)
num1 += this.inPacket[index];
if ((int) num1 != (int) this.inPacket[64])
return;
The `timer2` will process incoming data send from the device to the connected computer. The code begins with comparing index 1 of the `inPacket` with a series of values.
By looking at the code we might be able to assume we are looking at the first bytes necessary to communicate with the device. Here are some guesses:
Value Description
240 (0xf0) Confirmation sent by charger.
95 (0x5f) Get charger data by information provided in index 2,
which is an number \[4\].
90 (0x5a) Get system data by information provided in index 3,
which is a number.
85 (0x55) Do not process the packet here. Otherwise calculate
the sum of all bytes in `num1` and compare it to the
information stored in index 64.
If these checks do not result in an premature `return`, the values from `inPacket` are copied into variables. Some variable names are recognizable and help in our guessing game to find out what this function does.
![](https://dl.goatpr0n.events/$/nRAoH)
With the looks of it we are reading battery information. As an example on how the packet is decoded, we will have a look at the following code:
this.Current[j] = (int) this.inPacket[11] * 256 + (int) this.inPacket[12];
The contents of `inPacket` index 11 and 12 is assigned the the variable `Current` at index `j`. Which is irrelevant at this point. But we need to understand what is happing with this multiplication and addition.
The multiplication by 256 is just a different way to express a left shift by 8. What happens, when we take the value 1 and multiply it by 256 or do a left shift by 8? In binary representation it will become very easy to understand.
1 => 0b1
256 => 0b100000000
So what if we take 256 times 1?
256 => 0b100000000
And if we take the value `0b1` and move the `1` exactly 8 positions to the left, like a left shift, _duh_?
1 << 0 = 0b1
1 << 1 = 0b10
1 << 2 = 0b100
1 << 3 = 0b1000
1 << 4 = 0b10000
1 << 5 = 0b100000
1 << 6 = 0b1000000
1 << 7 = 0b10000000
1 << 8 = 0b100000000
This is just a step by step illustration. Computer do fast. Computer do in single step.
After the left shift, the second value is added to the variable. In other words, we are reading two bytes and concatenate it to have a word (2 bytes).
The same applies to the other functions `Get_Charge_Data` and `Get_System_Data` where the `inPacket` is read.
But how am I supposed to create my own library with this?
![](https://dl.goatpr0n.events/$/ga4cq)
This is the part, where you take your favorite language, or a language good for prototyping and begin coding. First challenge would be to connect to the USB device. I am using the `pyusb` module with _Python_.
To connect an USB device we want to make sure we are using the right one. To do so, the USB devices can be identified by different properties, and one of them is the vendor and product id. The source of the program might give us enough information we need, as it needs to connect to the charger as well.
The product and vendor id can be found in the function `private void usbSendConnectData()` and is defined as:
Field Value
Vendor ID 0
Product ID 1
#### Reading Data
The people writing the firmware for the charger, did not care to give it some nice values, on the other hand 0 and 1 are nice. With these identifiers, it is possible to connect to our charger.
``` python
import usb
usb.core.find(idVendor=0, idProduct=1)
```
This will return a list of devices, even when the list is empty or contains just one element. Set up the USB device further and start building your first packet to send. Before blindly sending commands to the charger, what would be the most destructive - errr - non destructive command: getting device information.
Do some reads on the device without sending anything to it. Eventually you will receive a packet.
In this scenario the packets have a common format for receiving and sending. You might notice a `0x0f` at the beginning of each packet. As _dotPeek_ is unable to tell you where it comes from and where it is designed, I am going to spoil it for you.
In file `FormLoader.cs` in line 201 we find the following definition:
public const byte UART_DATA_START = 15;
The UART \[6\] we are basically telling the charger we are coming over USB. There is also a mobile application to send commands via Bluetooth, but I haven't done this one, yet.
There is function called `Get_System_Data`. When we look at the definition of the function the code is very messy.
![](https://dl.goatpr0n.events/$/JP7Lc)
Alot \[5\]_ of constant values are assigned to variables, which are assigned to variables and then used as index. This looks confusing but the best way is to just begin prototyping it the same way.
num1 = 0
str1 = ''
num2 = 4
# Do not kown this yet
inPacket = raw_packet # raw_packet is the contents read by pyusb.
index1 = num2
num3 = 1
num4 = index1 + num3
num5 = int(inPacket[index1], 16) # Python 3: probably bytes as input.
...
And so on. After building your prototyped function you will see parts which can be optimized, but do not care about it too much in the beginning. Try to understand how packets are constructed and what they contain. But for example the `num2 = 4` could be removed and replaced with `index1 = 4`, as `num2` is not used after that point.
By breaking the packet down, byte by byte (there are only 64 bytes), we then try to create data structures from it, like the one mentioned in the beginning. Each information gathered so far helps in decoding packets received and to later send packets.
For decoding packets I personally use the `[Python struct](https://docs.python.org/3/library/struct.html)` module. By reading the definition of `Get_System_Data` we define a system class, and `machine_info` as `FormLoader.cs` calls it.
With `struct` we define a data structure which can parse the 64 bytes each packet has and apply it to a named tuple in _Python_. After reading the original decompiled code, I came up with this definition:
#: Machine response data
MACHINE_INFO_STRUCT = '>3xBBBBBBBBBBBBB6sBBhBBBBbB'
#: Tuple for device information
MachineInfo = namedtuple('machine_info',
['Sys_Mem1', 'Sys_Mem2', 'Sys_Mem3', 'Sys_Mem4',
'Sys_Advance', 'Sys_tUnit', 'Sys_Buzzer_Tone',
'Sys_Life_Hide', 'Sys_LiHv_Hide',
'Sys_Eneloop_Hide', 'Sys_NiZn_Hide', 'Sys_Lcd_time',
'Sys_Min_Input', 'core_type', 'upgrade_type',
'is_encrypted', 'customer_id', 'language_id',
'software_version_hi', 'software_version_lo',
'hardware_version', 'reserved', 'checksum',
'software_version', 'machine_id'])
The struct definition `MACHINE_INFO_STRUCT` describes how each byte of the packet should be interpreted. In words:
* We decode it as big-endian.
* Ignore 3 bytes as these are protocol commands.
* Read 14 unsigned bytes (0..255), each into a separate variable.
* Read 6 characters or a string of length 6.
* Read 2 individual bytes.
* Read a short (2 bytes).
* Read 4 individual unsigned bytes.
* Read a signed byte (-128..127).
* Read a unsigned byte.
The `MachineInfo` is a `[namedtuple](https://docs.python.org/3/library/collections.html#collections.namedtuple)`, to make it very easy to assign and access values. When we receive a packet and we have determined the type, we can do something like this:
data = unpack(MACHINE_INFO_STRUCT, response[:32])
machine = MachineInfo(\*data, 0, machine_id)
#### Sending Data
While reading data is one side, we also need send commands. When optimizing the code the `private bool Send_USB_CMD(int Solt, byte CMD)` function can be annoying, but refactoring the prototype code will very quickly tell you where to place your bytes.
Whilst the original code is hiding the `CMD` parameter position behind some index calculations (which lies in nature of decompilation) we can translate the following code:
![](https://dl.goatpr0n.events/$/JEIdW)
To a single byte-string if we use the `Get_System_Data` CMD code 95:
\x0f\x00\x5a\x00
One really annoying thing is the index counting. The program starts filling the `outPacket` at offset 1. Which is actually 0, which is always set to `0x0f`. It is protocol definition.
Tricky thing is the real offset 1. It has to be set to a specific value. To find out which one, we have to further investigate the code. This changes depending on the operation you want to call.
![](https://dl.goatpr0n.events/$/JYRNp)
Going further through the code, we might find a location where it sets the offset 1 to a other value than 0. Eventually the offset becomes 4. The command so far is now:
\x0f\x03\x5a\x00
Sending this to the device returns no result, therefore we are still missing something. Somewhere was a loop adding up all bytes of packet. This could be a checksum and/or the command is still incomplete. Let's look at the `Send_USB_CMD` again. When working through the code, it is help full to take notes.
_I have removed a switch-case statement for your convenience._
![](https://dl.goatpr0n.events/$/tkE9j)
After working through the code, taking notes. the resulting packet for `CMD=95, Solt=0` \[7\] should look like this:
\x00\x0f\x03\x5a\x00\x00\x5d\xff\xff
The two bytes of `\xff` (255) at the end define the end a packet. Every packet is produced after this schema.
Byte Description
1 It is always 0, you will learn soon enough why! _ARRGHGGHG_
2 Start of message (Always 0x0f (15)).
3 Calculate the value based on the index.
4 The command op code.
5 It is 0.
6 The slot index (0 to 3 (4 Slots)).
7 The sum of the variable data (Byte 3 to 6)
8 Is always 0xff (255)
9 Is always 0xff (255)
Sending this to the device is still not correct, why? To find out why, delving deeper into the nested classes we find an abomination. The decompiled code for SpecifiedOutputReport.cs in `class UsbLibrary.SpecifiedOutputReport`, there is this one function:
public bool SendData(byte[] data)
{
byte[] buffer = this.Buffer;
for (int index = 1; index < buffer.Length; ++index)
buffer[index] = data[index];
return true;
}
The line 19 defines a loop starting at index 1…
![](https://dl.goatpr0n.events/$/N97jA)
With all this knowledge collected the final valid packet to send to your device is:
\x0f\x03\x5a\x00\x00\x5d\xff\xff
That's it. We have done it.
KTHXBYE!
1. BTW, giving descriptive names for your variables is totally over rated.
2. Bob, is it you? \[3\]
3. Stupidest joke so far. He is no constructor, he is a builder.
4. As you might have noticed. I am just reading and translating the code.
5. |alot| this was an intentional typo.
6. Universal Asynchronous Receiver/Transmitter
7. Solt _\[SIC\]_

View File

@ -0,0 +1,37 @@
---
title: '[Teaser] How to reverse engineer communication protocols of embedded devices'
categories:
- cyber
- reverse engineering
date: 2019-02-16 01:25:34
tags:
---
Sneak Preview
-------------
![](https://dl.goatpr0n.events/$/aAdcT)
These letters. Such announcement. Many words.
In the next few days I will publish two - not one - but two articles on how to approach a problem on how to reverse engineer protocols. There have been to applications I looked into to code a library for my home uses.
#1 - MC3000 Charger
-------------------
[MC3000_Charger](https://www.skyrc.com/MC3000_Charger) provides an USB and Bluetooth (BT) interface (Spoiler: I am not covering the BT interface. Not yet). The USB interface is used to update the firmware and to program and interact with the charger during charging.
The Windows software provided by SkyRC can program each slot individually to support different types of batteries with different charging capacities.
As a result of my analysis, and this will be one of the upcoming articles, I reversed the application and wrote a Python library. To do so I dissected a .NET application. So no big magic here!
#2 - LW12 WiFi LED Controller
-----------------------------
This was a tricky one. It is a low budget Chinese WiFi LED controlled with a mobile app. The Android app I looked at was encrypted using a separate VM layer on-top of the Dalvik engine. (Spoiler: No need to reverse this, and I did not do it.)
Sometimes there are simpler solutions. This is what the second article will be about.
The controller itself comes by many names: [Foxnovo](https://www.amazon.de/Foxnovo-Wireless-Strip-Regler-Smartphone-Tabletten/dp/B00Q6FKPZI) and I remember buying it as a [Lagute](https://www.amazon.de/LAGUTE-Strips-Controller-Android-System/dp/B00G55329A).
KTHXBYE.

View File

@ -0,0 +1,15 @@
---
title: There is not enough cyber in the world
categories:
- cyber
- Uncategorized
date: 2019-01-21 15:21:23
tags:
---
My recent favuorite hash tags in social networks are:
- cyberwar / cyberkrieg
- cold-cyberwar / kalter cyberkrieg
KTHXBYE

View File

@ -0,0 +1,9 @@
---
title: Welcome to the farm!
categories:
- Uncategorized
date: 2019-02-05 18:17:12
tags:
---
This magnificent piece of blog is now available under [https://goatpr0n.farm/](https://goatpr0n.farm/). Marvelous!

View File

@ -0,0 +1,74 @@
---
title: What if the cult of dd is right?
categories:
- cyber
- Uncategorized
date: 2019-01-23 00:47:15
tags:
---
Are you a believer?
-------------------
There are articles out there talking about the useless usage of `dd` and why `cat` is better. `Cat` is faster because it automatically adjusts the blocksize and `dd` is slow because it internally only works with 512 byte blocks. [This](https://eklitzke.org/the-cult-of-dd) and [That](https://www.vidarholen.net/contents/blog/?p=479).
I did some simple tests with `time`, `dd` and `cat`, added some obscure parameters to `dd`, because `cat` is better.
### Testing `dd` with status and specific blocksize
$ time dd if=/dev/sdd of=test.dd status=progress bs=8M
15921577984 bytes (16 GB, 15 GiB) copied, 878 s, 18.1 MB/s
1899+1 records in
1899+1 records out
15931539456 bytes (16 GB, 15 GiB) copied, 879.018 s, 18.1 MB/s
0.04s user 23.33s system 2% cpu 14:39.03 total
### Testing `dd`
$ dd if=/dev/sdd of=test.dd
31116288+0 records in
31116288+0 records out
15931539456 bytes (16 GB, 15 GiB) copied, 869.783 s, 18.3 MB/s
16.13s user 159.22s system 20% cpu 14:29.80 total
### Testing`cat` with `pv`
$ time cat /dev/sdd | pv > test.raw
14.8GiB 0:14:43 [17.2MiB/s] [ <=> ]
0.28s user 25.84s system 2% cpu 14:43.18 total
### Testing `cat`
$ time dd if=/dev/sdd of=test.dd status=progress bs=8M
15921577984 bytes (16 GB, 15 GiB) copied, 878 s, 18.1 MB/s
1899+1 records in
1899+1 records out
15931539456 bytes (16 GB, 15 GiB) copied, 879.018 s, 18.1 MB/s
0.04s user 23.33s system 2% cpu 14:39.03 total
### Testing `dd`
$ dd if=/dev/sdd of=test.dd
31116288+0 records in
31116288+0 records out
15931539456 bytes (16 GB, 15 GiB) copied, 869.783 s, 18.3 MB/s
16.13s user 159.22s system 20% cpu 14:29.80 total
### Testing `cat`with `pv`
$ time cat /dev/sdd | pv > test.raw
14.8GiB 0:14:43 [17.2MiB/s] [ <=> ]
0.28s user 25.84s system 2% cpu 14:43.18 total
### Testing `cat`
$ time cat /dev/sdd > test.raw
0.18s user 21.21s system 2% cpu 14:42.25 total
### Y U DO IT WRONG
Somehow my `cat` is not as fast as `dd`.
KTHBYE

10
deploy Executable file
View File

@ -0,0 +1,10 @@
#!/bin/sh
USER=root
HOST=10.0.0.20
DIR=/srv/http/blog
# hugo && rsync -avz --delete -e "ssh -vv -i ssh_id_hexo" public/ ${USER}@${HOST}:{DIR}
hugo && rsync -avz --delete public/ ${USER}@${HOST}:${DIR}
exit 0

103
layouts/404.html Normal file
View File

@ -0,0 +1,103 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>404 Not Found</title>
<style>
body {
background-color: black;
background-image: radial-gradient(
rgba(0, 150, 0, 0.75), black 120%
);
height: 97vh;
color: white;
font: 1.3rem Inconsolata, monospace;
text-shadow: 0 0 5px #C8C8C8;
}
body::after {
content: "";
position: absolute;
top: 0;
left: 0;
width: 97vh;
height: 97vh;
background: repeating-linear-gradient(
0deg,
rgba(black, 0.15),
rgba(black, 0.15) 1px,
transparent 1px,
transparent 2px
);
}
::selection {
background: #0080FF;
text-shadow: none;
}
h1::before {
content: "$ ./";
}
h2::after {
content: "_";
animation: blink 1s linear infinite;
}
span {
color: yellow;
text-decoration: overline underline;
animation: blink 2s linear infinite;
}
@keyframes blink {
from {
opacity: 0.75;
}
to {
opacity: 1;
}
}
</style>
</head>
<body>
<pre>
00000000 88 f5 d3 f4 dc b3 64 16 10 99 86 79 b7 2c 3f 8e |......d....y.,?.|
00000010 f1 ad 59 8f 68 06 60 6f 39 db 52 b6 a3 ec f9 40 |..Y.h.`o9.R....@|
00000020 58 c5 58 10 24 de a7 9a b2 c8 e9 cf 9f 3b dc 48 |X.X.$........;.H|
00000030 38 b3 07 <span>50 41 47 45 20 4e 4f 54 20 46 4f 55 4e</span> |8..<span>PAGE NOT FOUN</span>|
00000040 <span>44</span> 73 95 a7 37 a1 25 b6 d2 ea b8 fc 67 d4 47 03 |<span>D</span>s..7.%.....g.G.|
00000050 a3 00 90 7f 91 69 23 a3 b3 07 3b 70 4f ef b4 e9 |.....i#...;pO...|
00000060 c0 52 bd 22 7d a3 fc 9e 6f f1 23 80 16 d4 aa 3b |.R."}...o.#....;|
00000070 95 94 39 b2 31 25 86 ea 05 68 46 bf 00 7b 70 9c |..9.1%...hF..{p.|
00000080 cf e4 a1 ac 32 06 5a 12 2e ad 95 21 e6 13 a8 20 |....2.Z....!... |
00000090 8b b8 77 38 b1 77 7d 36 a3 77 31 6f 94 ed 96 30 |..w8.w}6.w1o...0|
000000a0 de 9b 1d 8a 0f d7 8f 04 95 64 e7 aa 34 aa 6b b5 |.........d..4.k.|
000000b0 e2 6c f1 12 17 34 a6 e3 84 1f f7 06 d3 06 fb fe |.l...4..........|
000000c0 df c4 52 3d fa 2f d0 78 66 0d 4f 5f b0 77 bd 65 |..R=./.xf.O_.w.e|
000000d0 72 56 c0 e3 17 5e f4 54 b0 30 d1 18 3d 4e e9 07 |rV...^.T.0..=N..|
000000e0 d5 dd d4 8c 8f 42 b9 0a 44 11 59 7d 88 52 0c 17 |.....B..D.Y}.R..|
000000f0 3a 7b 3b 7b 89 52 ef c5 c3 6a 91 7c 1f c6 32 50 |:{;{.R...j.|..2P|
00000100 84 0f 99 fa 90 de 11 ec 55 79 73 37 cc 16 a5 14 |........Uys7....|
00000110 63 4a 37 4c 97 c2 00 e9 f2 d3 8d 15 50 e2 dc 4c |cJ7L........P..L|
00000120 d7 b3 fe c7 f6 f1 f3 89 27 2d 6e <span>48 54 54 50 20</span> |........'-ny<span>HTTP</span>|
00000130 <span>53 54 41 54 55 53 3a 20 34 30 34</span> 0a 00 9e 51 b6 |<span>STATUS: 404</span>...Q.|
00000140 cd 0b e5 94 fd 53 49 89 e8 88 43 40 c5 83 14 c7 |.....SI...C@....|
00000150 40 8f c2 9e 3b 71 7e be 95 42 b7 48 a9 06 1e 94 |@...;q~..B.H....|
00000160 c9 97 3d 5c 83 88 66 b9 bb b5 10 e9 70 84 05 ea |..=\..f.....p...|
00000170 37 bf 69 b2 91 83 59 73 a6 1f 2a cf 4c 8c e8 2b |7.i...Ys..*.L..+|
00000180 cc 66 b8 99 cc fa 1a b1 24 a2 34 39 00 de 83 d7 |.f......$.49....|
00000190 00 13 17 a7 36 9b c4 73 f3 7b 0b 55 53 ba 58 4e |....6..s.{.US.XN|
000001a0 5d 73 ab 8c c5 59 bd 51 d6 c3 d6 71 98 72 51 e8 |]s...Y.Q...q.rQ.|
000001b0 09 6d a0 05 25 00 e5 05 19 3b 7c c6 41 45 90 1c |.m..%....;|.AE..|
000001c0 80 f0 ac ac fd d9 ab 00 52 61 b2 36 0a 63 f5 e5 |........Ra.6.c..|
000001d0 2f e0 ec dd 85 5b b6 9e 84 a2 eb ee 09 85 e4 72 |/....[.........r|
000001e0 9f ef 92 53 7b d8 11 85 b7 7f 83 79 5b 14 fc e7 |...S{......y[...|
000001f0 de d3 29 a3 8e 74 15 91 66 ee 0a 18 bb c3 b0 39 |..)..t..f......9|
</pre>
</body>
</html>

99
public/25.html Normal file
View File

@ -0,0 +1,99 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<div class="row-fluid navmargin">
<div class="page-header">
<h1>Hack back during #cyberwar - Tue, Feb 5, 2019</h1>
</div>
<p class="lead"></p>
<p>According this <a href="https://www.golem.de/news/digitaler-gegenschlag-mehrheit-befuerwortet-hackbacks-im-cyberkrieg-1902-139338.html">article</a> people want us to hack back, and the government is like:</p>
<p><img src="https://dl.goatpr0n.events/$/4vfbw" alt=""></p>
<p>The GIF is probably copyrighted material by the The Fine Brothers. Plz Don&rsquo;t sue me. I no make cyber moneyz with this blog</p>
<p>KTHXBYE.</p>
<h4><a href="https://goatpr0n.farm/">Back to Home</a></h4>
</div>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

103
public/404.html Normal file
View File

@ -0,0 +1,103 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>404 Not Found</title>
<style>
body {
background-color: black;
background-image: radial-gradient(
rgba(0, 150, 0, 0.75), black 120%
);
height: 97vh;
color: white;
font: 1.3rem Inconsolata, monospace;
text-shadow: 0 0 5px #C8C8C8;
}
body::after {
content: "";
position: absolute;
top: 0;
left: 0;
width: 97vh;
height: 97vh;
background: repeating-linear-gradient(
0deg,
rgba(black, 0.15),
rgba(black, 0.15) 1px,
transparent 1px,
transparent 2px
);
}
::selection {
background: #0080FF;
text-shadow: none;
}
h1::before {
content: "$ ./";
}
h2::after {
content: "_";
animation: blink 1s linear infinite;
}
span {
color: yellow;
text-decoration: overline underline;
animation: blink 2s linear infinite;
}
@keyframes blink {
from {
opacity: 0.75;
}
to {
opacity: 1;
}
}
</style>
</head>
<body>
<pre>
00000000 88 f5 d3 f4 dc b3 64 16 10 99 86 79 b7 2c 3f 8e |......d....y.,?.|
00000010 f1 ad 59 8f 68 06 60 6f 39 db 52 b6 a3 ec f9 40 |..Y.h.`o9.R....@|
00000020 58 c5 58 10 24 de a7 9a b2 c8 e9 cf 9f 3b dc 48 |X.X.$........;.H|
00000030 38 b3 07 <span>50 41 47 45 20 4e 4f 54 20 46 4f 55 4e</span> |8..<span>PAGE NOT FOUN</span>|
00000040 <span>44</span> 73 95 a7 37 a1 25 b6 d2 ea b8 fc 67 d4 47 03 |<span>D</span>s..7.%.....g.G.|
00000050 a3 00 90 7f 91 69 23 a3 b3 07 3b 70 4f ef b4 e9 |.....i#...;pO...|
00000060 c0 52 bd 22 7d a3 fc 9e 6f f1 23 80 16 d4 aa 3b |.R."}...o.#....;|
00000070 95 94 39 b2 31 25 86 ea 05 68 46 bf 00 7b 70 9c |..9.1%...hF..{p.|
00000080 cf e4 a1 ac 32 06 5a 12 2e ad 95 21 e6 13 a8 20 |....2.Z....!... |
00000090 8b b8 77 38 b1 77 7d 36 a3 77 31 6f 94 ed 96 30 |..w8.w}6.w1o...0|
000000a0 de 9b 1d 8a 0f d7 8f 04 95 64 e7 aa 34 aa 6b b5 |.........d..4.k.|
000000b0 e2 6c f1 12 17 34 a6 e3 84 1f f7 06 d3 06 fb fe |.l...4..........|
000000c0 df c4 52 3d fa 2f d0 78 66 0d 4f 5f b0 77 bd 65 |..R=./.xf.O_.w.e|
000000d0 72 56 c0 e3 17 5e f4 54 b0 30 d1 18 3d 4e e9 07 |rV...^.T.0..=N..|
000000e0 d5 dd d4 8c 8f 42 b9 0a 44 11 59 7d 88 52 0c 17 |.....B..D.Y}.R..|
000000f0 3a 7b 3b 7b 89 52 ef c5 c3 6a 91 7c 1f c6 32 50 |:{;{.R...j.|..2P|
00000100 84 0f 99 fa 90 de 11 ec 55 79 73 37 cc 16 a5 14 |........Uys7....|
00000110 63 4a 37 4c 97 c2 00 e9 f2 d3 8d 15 50 e2 dc 4c |cJ7L........P..L|
00000120 d7 b3 fe c7 f6 f1 f3 89 27 2d 6e <span>48 54 54 50 20</span> |........'-ny<span>HTTP</span>|
00000130 <span>53 54 41 54 55 53 3a 20 34 30 34</span> 0a 00 9e 51 b6 |<span>STATUS: 404</span>...Q.|
00000140 cd 0b e5 94 fd 53 49 89 e8 88 43 40 c5 83 14 c7 |.....SI...C@....|
00000150 40 8f c2 9e 3b 71 7e be 95 42 b7 48 a9 06 1e 94 |@...;q~..B.H....|
00000160 c9 97 3d 5c 83 88 66 b9 bb b5 10 e9 70 84 05 ea |..=\..f.....p...|
00000170 37 bf 69 b2 91 83 59 73 a6 1f 2a cf 4c 8c e8 2b |7.i...Ys..*.L..+|
00000180 cc 66 b8 99 cc fa 1a b1 24 a2 34 39 00 de 83 d7 |.f......$.49....|
00000190 00 13 17 a7 36 9b c4 73 f3 7b 0b 55 53 ba 58 4e |....6..s.{.US.XN|
000001a0 5d 73 ab 8c c5 59 bd 51 d6 c3 d6 71 98 72 51 e8 |]s...Y.Q...q.rQ.|
000001b0 09 6d a0 05 25 00 e5 05 19 3b 7c c6 41 45 90 1c |.m..%....;|.AE..|
000001c0 80 f0 ac ac fd d9 ab 00 52 61 b2 36 0a 63 f5 e5 |........Ra.6.c..|
000001d0 2f e0 ec dd 85 5b b6 9e 84 a2 eb ee 09 85 e4 72 |/....[.........r|
000001e0 9f ef 92 53 7b d8 11 85 b7 7f 83 79 5b 14 fc e7 |...S{......y[...|
000001f0 de d3 29 a3 8e 74 15 91 66 ee 0a 18 bb c3 b0 39 |..)..t..f......9|
</pre>
</body>
</html>

View File

@ -0,0 +1 @@
<!DOCTYPE html><html><head><title>https://goatpr0n.farm/posts/</title><link rel="canonical" href="https://goatpr0n.farm/posts/"/><meta name="robots" content="noindex"><meta charset="utf-8" /><meta http-equiv="refresh" content="0; url=https://goatpr0n.farm/posts/" /></head></html>

1
public/blog/index.html Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html><html><head><title>https://goatpr0n.farm/posts/</title><link rel="canonical" href="https://goatpr0n.farm/posts/"/><meta name="robots" content="noindex"><meta charset="utf-8" /><meta http-equiv="refresh" content="0; url=https://goatpr0n.farm/posts/" /></head></html>

View File

@ -0,0 +1,104 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>brain fart</h1>
</header>
</article>
<ul>
<li>
<a href="/25.html">2019-02-05 | Hack back during #cyberwar</a>
</li>
<li>
<a href="/posts/can-i-haz-ur-dataz/">2019-02-01 | Can I haz ur dataz</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>brain fart on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/categories/brain-fart/</link>
<description>Recent content in brain fart on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Tue, 05 Feb 2019 18:45:08 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/categories/brain-fart/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Hack back during #cyberwar</title>
<link>https://goatpr0n.farm/25.html</link>
<pubDate>Tue, 05 Feb 2019 18:45:08 +0000</pubDate>
<guid>https://goatpr0n.farm/25.html</guid>
<description>According this article people want us to hack back, and the government is like:
The GIF is probably copyrighted material by the The Fine Brothers. Plz Don&amp;rsquo;t sue me. I no make cyber moneyz with this blog
KTHXBYE.</description>
</item>
<item>
<title>Can I haz ur dataz</title>
<link>https://goatpr0n.farm/posts/can-i-haz-ur-dataz/</link>
<pubDate>Fri, 01 Feb 2019 09:55:07 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/can-i-haz-ur-dataz/</guid>
<description>Remote data acquisitions over ssh To get your data trough ssh to your local storage, you simply use pipes. It does not matter if you use cat, dd or any other command line tool which outputs the data on standard output (stdout).
Using cat When using cat the there is no need to add any additional parameters in your command chain. A simple cat &amp;lt;input&amp;gt; will suffice.
Cat does not have any progress information during read operations.</description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,100 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>CTF</h1>
</header>
</article>
<ul>
<li>
<a href="/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/">2019-07-24 | Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>CTF on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/categories/ctf/</link>
<description>Recent content in CTF on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Wed, 24 Jul 2019 12:19:47 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/categories/ctf/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</title>
<link>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</link>
<pubDate>Wed, 24 Jul 2019 12:19:47 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</guid>
<description>#MemeFreeEdition
The Challenge You are provided a zip file containing two files.
program vm.py The file program contains instructions encoded as emojis for a virtual machine called vm.py. At the bottom of vm.py I found a list, or lets call it a translation table, with emojis and their function name counter part.
OPERATIONS = { &amp;#39;🍡&amp;#39;: add, &amp;#39;🤡&amp;#39;: clone, &amp;#39;📐&amp;#39;: divide, &amp;#39;😲&amp;#39;: if_zero, &amp;#39;😄&amp;#39;: if_not_zero, &amp;#39;🏀&amp;#39;: jump_to, &amp;#39;🚛&amp;#39;: load, &amp;#39;📬&amp;#39;: modulo, &amp;#39;⭐&amp;#39;: multiply, &amp;#39;🍿&amp;#39;: pop, &amp;#39;📤&amp;#39;: pop_out, &amp;#39;🎤&amp;#39;: print_top, &amp;#39;📥&amp;#39;: push, &amp;#39;🔪&amp;#39;: sub, &amp;#39;🌓&amp;#39;: xor, &amp;#39;⛰&amp;#39;: jump_top, &amp;#39;⌛&amp;#39;: exit } To execute program with vm.</description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,124 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>cyber</h1>
</header>
</article>
<ul>
<li>
<a href="/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/">2019-09-25 | Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</a>
</li>
<li>
<a href="/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/">2019-07-24 | Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</a>
</li>
<li>
<a href="/posts/teaser-how-to-reverse-engineer-communication-protocols-of-embedded-devices/">2019-02-16 | [Teaser] How to reverse engineer communication protocols of embedded devices</a>
</li>
<li>
<a href="/25.html">2019-02-05 | Hack back during #cyberwar</a>
</li>
<li>
<a href="/posts/can-i-haz-ur-dataz/">2019-02-01 | Can I haz ur dataz</a>
</li>
<li>
<a href="/posts/what-if-the-cult-of-dd-is-right/">2019-01-23 | What if the cult of dd is right?</a>
</li>
<li>
<a href="/posts/there-is-not-enough-cyber-in-the-world/">2019-01-21 | There is not enough cyber in the world</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>cyber on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/categories/cyber/</link>
<description>Recent content in cyber on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Wed, 25 Sep 2019 15:22:58 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/categories/cyber/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</title>
<link>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</link>
<pubDate>Wed, 25 Sep 2019 15:22:58 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</guid>
<description>TL;DR; Short the ERASE pin with VDDCORE, if ERASE == PIN_55 &amp;amp;&amp;amp; VDDCORE == PIN_54
According to complains in the internet, users report bricking their Proxmark3 EASY, when they try to flash the latest firmware with the &amp;lsquo;flasher&amp;rsquo; software tool.
Sometimes flashing process of firmware can go wrong, but it can often be recovered with JTAG programmers, or similar programmers.
I will not about setting up the environment to build, and flash the firmware, but I will tell you what you might be missing out and why it might be not working.</description>
</item>
<item>
<title>Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</title>
<link>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</link>
<pubDate>Wed, 24 Jul 2019 12:19:47 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</guid>
<description>#MemeFreeEdition
The Challenge You are provided a zip file containing two files.
program vm.py The file program contains instructions encoded as emojis for a virtual machine called vm.py. At the bottom of vm.py I found a list, or lets call it a translation table, with emojis and their function name counter part.
OPERATIONS = { &amp;#39;🍡&amp;#39;: add, &amp;#39;🤡&amp;#39;: clone, &amp;#39;📐&amp;#39;: divide, &amp;#39;😲&amp;#39;: if_zero, &amp;#39;😄&amp;#39;: if_not_zero, &amp;#39;🏀&amp;#39;: jump_to, &amp;#39;🚛&amp;#39;: load, &amp;#39;📬&amp;#39;: modulo, &amp;#39;⭐&amp;#39;: multiply, &amp;#39;🍿&amp;#39;: pop, &amp;#39;📤&amp;#39;: pop_out, &amp;#39;🎤&amp;#39;: print_top, &amp;#39;📥&amp;#39;: push, &amp;#39;🔪&amp;#39;: sub, &amp;#39;🌓&amp;#39;: xor, &amp;#39;⛰&amp;#39;: jump_top, &amp;#39;⌛&amp;#39;: exit } To execute program with vm.</description>
</item>
<item>
<title>[Teaser] How to reverse engineer communication protocols of embedded devices</title>
<link>https://goatpr0n.farm/posts/teaser-how-to-reverse-engineer-communication-protocols-of-embedded-devices/</link>
<pubDate>Sat, 16 Feb 2019 01:25:34 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/teaser-how-to-reverse-engineer-communication-protocols-of-embedded-devices/</guid>
<description>Sneak Preview These letters. Such announcement. Many words.
In the next few days I will publish two - not one - but two articles on how to approach a problem on how to reverse engineer protocols. There have been to applications I looked into to code a library for my home uses.
#1 - MC3000 Charger MC3000_Charger provides an USB and Bluetooth (BT) interface (Spoiler: I am not covering the BT interface.</description>
</item>
<item>
<title>Hack back during #cyberwar</title>
<link>https://goatpr0n.farm/25.html</link>
<pubDate>Tue, 05 Feb 2019 18:45:08 +0000</pubDate>
<guid>https://goatpr0n.farm/25.html</guid>
<description>According this article people want us to hack back, and the government is like:
The GIF is probably copyrighted material by the The Fine Brothers. Plz Don&amp;rsquo;t sue me. I no make cyber moneyz with this blog
KTHXBYE.</description>
</item>
<item>
<title>Can I haz ur dataz</title>
<link>https://goatpr0n.farm/posts/can-i-haz-ur-dataz/</link>
<pubDate>Fri, 01 Feb 2019 09:55:07 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/can-i-haz-ur-dataz/</guid>
<description>Remote data acquisitions over ssh To get your data trough ssh to your local storage, you simply use pipes. It does not matter if you use cat, dd or any other command line tool which outputs the data on standard output (stdout).
Using cat When using cat the there is no need to add any additional parameters in your command chain. A simple cat &amp;lt;input&amp;gt; will suffice.
Cat does not have any progress information during read operations.</description>
</item>
<item>
<title>What if the cult of dd is right?</title>
<link>https://goatpr0n.farm/posts/what-if-the-cult-of-dd-is-right/</link>
<pubDate>Wed, 23 Jan 2019 00:47:15 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/what-if-the-cult-of-dd-is-right/</guid>
<description>Are you a believer? There are articles out there talking about the useless usage of dd and why cat is better. Cat is faster because it automatically adjusts the blocksize and dd is slow because it internally only works with 512 byte blocks. This and That.
I did some simple tests with time, dd and cat, added some obscure parameters to dd, because cat is better.
Testing dd with status and specific blocksize $ time dd if=/dev/sdd of=test.</description>
</item>
<item>
<title>There is not enough cyber in the world</title>
<link>https://goatpr0n.farm/posts/there-is-not-enough-cyber-in-the-world/</link>
<pubDate>Mon, 21 Jan 2019 15:21:23 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/there-is-not-enough-cyber-in-the-world/</guid>
<description>My recent favuorite hash tags in social networks are:
- cyberwar / cyberkrieg - cold-cyberwar / kalter cyberkrieg KTHXBYE</description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,104 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>hardware</h1>
</header>
</article>
<ul>
<li>
<a href="/posts/reverse-engineering-of-a-flash-programmer-ezp2010/">2019-11-28 | Reverse Engineering of a Flash Programmer :: EZP2010</a>
</li>
<li>
<a href="/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/">2019-09-25 | Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>hardware on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/categories/hardware/</link>
<description>Recent content in hardware on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Thu, 28 Nov 2019 12:01:53 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/categories/hardware/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Reverse Engineering of a Flash Programmer :: EZP2010</title>
<link>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</guid>
<description>Preface In today&amp;rsquo;s adventure I like to take you with me on my journey of reverse engineering another USB device. The EZP2010 is an USB programmer for flash memory as used by mainboard manufactures to store the BIOS, or embedded devices to store the firmware (or settings). When it comes to data recovery on hard drives, or similar storage devices, these flashers can also become handy.
EZP2010 USB-Highspeed programmer
This particular programmer can be bought on many Chinese store or Amazon.</description>
</item>
<item>
<title>Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</title>
<link>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</link>
<pubDate>Wed, 25 Sep 2019 15:22:58 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</guid>
<description>TL;DR; Short the ERASE pin with VDDCORE, if ERASE == PIN_55 &amp;amp;&amp;amp; VDDCORE == PIN_54
According to complains in the internet, users report bricking their Proxmark3 EASY, when they try to flash the latest firmware with the &amp;lsquo;flasher&amp;rsquo; software tool.
Sometimes flashing process of firmware can go wrong, but it can often be recovered with JTAG programmers, or similar programmers.
I will not about setting up the environment to build, and flash the firmware, but I will tell you what you might be missing out and why it might be not working.</description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,120 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>Categories</h1>
</header>
</article>
<ul>
<li>
<a href="https://goatpr0n.farm/categories/hardware/">2019-11-28 | hardware</a>
</li>
<li>
<a href="https://goatpr0n.farm/categories/reverse-engineering/">2019-11-28 | reverse engineering</a>
</li>
<li>
<a href="https://goatpr0n.farm/categories/cyber/">2019-09-25 | cyber</a>
</li>
<li>
<a href="https://goatpr0n.farm/categories/ctf/">2019-07-24 | CTF</a>
</li>
<li>
<a href="https://goatpr0n.farm/categories/brain-fart/">2019-02-05 | brain fart</a>
</li>
<li>
<a href="https://goatpr0n.farm/categories/uncategorized/">2019-02-05 | Uncategorized</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Categories on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/categories/</link>
<description>Recent content in Categories on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Thu, 28 Nov 2019 12:01:53 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/categories/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>hardware</title>
<link>https://goatpr0n.farm/categories/hardware/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/categories/hardware/</guid>
<description></description>
</item>
<item>
<title>reverse engineering</title>
<link>https://goatpr0n.farm/categories/reverse-engineering/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/categories/reverse-engineering/</guid>
<description></description>
</item>
<item>
<title>cyber</title>
<link>https://goatpr0n.farm/categories/cyber/</link>
<pubDate>Wed, 25 Sep 2019 15:22:58 +0000</pubDate>
<guid>https://goatpr0n.farm/categories/cyber/</guid>
<description></description>
</item>
<item>
<title>CTF</title>
<link>https://goatpr0n.farm/categories/ctf/</link>
<pubDate>Wed, 24 Jul 2019 12:19:47 +0000</pubDate>
<guid>https://goatpr0n.farm/categories/ctf/</guid>
<description></description>
</item>
<item>
<title>brain fart</title>
<link>https://goatpr0n.farm/categories/brain-fart/</link>
<pubDate>Tue, 05 Feb 2019 18:45:08 +0000</pubDate>
<guid>https://goatpr0n.farm/categories/brain-fart/</guid>
<description></description>
</item>
<item>
<title>Uncategorized</title>
<link>https://goatpr0n.farm/categories/uncategorized/</link>
<pubDate>Tue, 05 Feb 2019 18:17:12 +0000</pubDate>
<guid>https://goatpr0n.farm/categories/uncategorized/</guid>
<description></description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,116 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>reverse engineering</h1>
</header>
</article>
<ul>
<li>
<a href="/posts/reverse-engineering-of-a-flash-programmer-ezp2010/">2019-11-28 | Reverse Engineering of a Flash Programmer :: EZP2010</a>
</li>
<li>
<a href="/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/">2019-09-25 | Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</a>
</li>
<li>
<a href="/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/">2019-07-24 | Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</a>
</li>
<li>
<a href="/posts/reverse-engineering-of-the-skyrc-mc3000-battery-charger-usb-protocol/">2019-03-18 | Reverse Engineering of the SkyRC MC3000 Battery Charger USB Protocol</a>
</li>
<li>
<a href="/posts/teaser-how-to-reverse-engineer-communication-protocols-of-embedded-devices/">2019-02-16 | [Teaser] How to reverse engineer communication protocols of embedded devices</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>reverse engineering on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/categories/reverse-engineering/</link>
<description>Recent content in reverse engineering on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Thu, 28 Nov 2019 12:01:53 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/categories/reverse-engineering/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Reverse Engineering of a Flash Programmer :: EZP2010</title>
<link>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</guid>
<description>Preface In today&amp;rsquo;s adventure I like to take you with me on my journey of reverse engineering another USB device. The EZP2010 is an USB programmer for flash memory as used by mainboard manufactures to store the BIOS, or embedded devices to store the firmware (or settings). When it comes to data recovery on hard drives, or similar storage devices, these flashers can also become handy.
EZP2010 USB-Highspeed programmer
This particular programmer can be bought on many Chinese store or Amazon.</description>
</item>
<item>
<title>Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</title>
<link>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</link>
<pubDate>Wed, 25 Sep 2019 15:22:58 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</guid>
<description>TL;DR; Short the ERASE pin with VDDCORE, if ERASE == PIN_55 &amp;amp;&amp;amp; VDDCORE == PIN_54
According to complains in the internet, users report bricking their Proxmark3 EASY, when they try to flash the latest firmware with the &amp;lsquo;flasher&amp;rsquo; software tool.
Sometimes flashing process of firmware can go wrong, but it can often be recovered with JTAG programmers, or similar programmers.
I will not about setting up the environment to build, and flash the firmware, but I will tell you what you might be missing out and why it might be not working.</description>
</item>
<item>
<title>Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</title>
<link>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</link>
<pubDate>Wed, 24 Jul 2019 12:19:47 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</guid>
<description>#MemeFreeEdition
The Challenge You are provided a zip file containing two files.
program vm.py The file program contains instructions encoded as emojis for a virtual machine called vm.py. At the bottom of vm.py I found a list, or lets call it a translation table, with emojis and their function name counter part.
OPERATIONS = { &amp;#39;🍡&amp;#39;: add, &amp;#39;🤡&amp;#39;: clone, &amp;#39;📐&amp;#39;: divide, &amp;#39;😲&amp;#39;: if_zero, &amp;#39;😄&amp;#39;: if_not_zero, &amp;#39;🏀&amp;#39;: jump_to, &amp;#39;🚛&amp;#39;: load, &amp;#39;📬&amp;#39;: modulo, &amp;#39;⭐&amp;#39;: multiply, &amp;#39;🍿&amp;#39;: pop, &amp;#39;📤&amp;#39;: pop_out, &amp;#39;🎤&amp;#39;: print_top, &amp;#39;📥&amp;#39;: push, &amp;#39;🔪&amp;#39;: sub, &amp;#39;🌓&amp;#39;: xor, &amp;#39;⛰&amp;#39;: jump_top, &amp;#39;⌛&amp;#39;: exit } To execute program with vm.</description>
</item>
<item>
<title>Reverse Engineering of the SkyRC MC3000 Battery Charger USB Protocol</title>
<link>https://goatpr0n.farm/posts/reverse-engineering-of-the-skyrc-mc3000-battery-charger-usb-protocol/</link>
<pubDate>Mon, 18 Mar 2019 16:49:39 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/reverse-engineering-of-the-skyrc-mc3000-battery-charger-usb-protocol/</guid>
<description>Software Requirements Decompiler for .NET programs
dotPeek The implementation of the protocol is then written in Python. Let&amp;rsquo;s hear what the curator has to say:
Tell me about Python.
&amp;gt; Wow. Much Snake. Easy programming! &amp;gt; &amp;gt; \- Doge Tell me about dotPeek.
&amp;gt; Easy decompilation. Readable syntax. Very easy. &amp;gt; &amp;gt; \- Doge Analyzing MC3000_Monitor Decompiling Start dotPeek and use Drag&amp;rsquo;n&amp;rsquo;Drop to load the Application. Or uSe CtRL+O anD LoCATe tHe fILe uSiNg ThE bOrwsEr.</description>
</item>
<item>
<title>[Teaser] How to reverse engineer communication protocols of embedded devices</title>
<link>https://goatpr0n.farm/posts/teaser-how-to-reverse-engineer-communication-protocols-of-embedded-devices/</link>
<pubDate>Sat, 16 Feb 2019 01:25:34 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/teaser-how-to-reverse-engineer-communication-protocols-of-embedded-devices/</guid>
<description>Sneak Preview These letters. Such announcement. Many words.
In the next few days I will publish two - not one - but two articles on how to approach a problem on how to reverse engineer protocols. There have been to applications I looked into to code a library for my home uses.
#1 - MC3000 Charger MC3000_Charger provides an USB and Bluetooth (BT) interface (Spoiler: I am not covering the BT interface.</description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,108 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>Uncategorized</h1>
</header>
</article>
<ul>
<li>
<a href="/posts/welcome-to-the-farm/">2019-02-05 | Welcome to the farm!</a>
</li>
<li>
<a href="/posts/what-if-the-cult-of-dd-is-right/">2019-01-23 | What if the cult of dd is right?</a>
</li>
<li>
<a href="/posts/there-is-not-enough-cyber-in-the-world/">2019-01-21 | There is not enough cyber in the world</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Uncategorized on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/categories/uncategorized/</link>
<description>Recent content in Uncategorized on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Tue, 05 Feb 2019 18:17:12 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/categories/uncategorized/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Welcome to the farm!</title>
<link>https://goatpr0n.farm/posts/welcome-to-the-farm/</link>
<pubDate>Tue, 05 Feb 2019 18:17:12 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/welcome-to-the-farm/</guid>
<description>This magnificent piece of blog is now available under https://goatpr0n.farm/. Marvelous!</description>
</item>
<item>
<title>What if the cult of dd is right?</title>
<link>https://goatpr0n.farm/posts/what-if-the-cult-of-dd-is-right/</link>
<pubDate>Wed, 23 Jan 2019 00:47:15 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/what-if-the-cult-of-dd-is-right/</guid>
<description>Are you a believer? There are articles out there talking about the useless usage of dd and why cat is better. Cat is faster because it automatically adjusts the blocksize and dd is slow because it internally only works with 512 byte blocks. This and That.
I did some simple tests with time, dd and cat, added some obscure parameters to dd, because cat is better.
Testing dd with status and specific blocksize $ time dd if=/dev/sdd of=test.</description>
</item>
<item>
<title>There is not enough cyber in the world</title>
<link>https://goatpr0n.farm/posts/there-is-not-enough-cyber-in-the-world/</link>
<pubDate>Mon, 21 Jan 2019 15:21:23 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/there-is-not-enough-cyber-in-the-world/</guid>
<description>My recent favuorite hash tags in social networks are:
- cyberwar / cyberkrieg - cold-cyberwar / kalter cyberkrieg KTHXBYE</description>
</item>
</channel>
</rss>

1127
public/css/bootstrap-responsive.css vendored Normal file

File diff suppressed because it is too large Load Diff

5893
public/css/bootstrap.css vendored Normal file

File diff suppressed because it is too large Load Diff

1
public/css/docs.css Normal file
View File

@ -0,0 +1 @@
body { visibility: hidden }

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,835 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg>
<metadata>
Created by FontForge 20090914 at Tue Jul 30 19:37:37 2013
By www-data
GPL, see http://www.gnu.org/licenses/gpl.txt
</metadata>
<defs>
<font id="FixedsysTTF" horiz-adv-x="550" >
<font-face
font-family="FixedsysTTF"
font-weight="600"
font-stretch="normal"
units-per-em="1000"
panose-1="2 0 0 9 0 0 0 0 0 0"
ascent="800"
descent="-200"
x-height="465"
cap-height="610"
bbox="-1 -288 550 813"
underline-thickness="50"
underline-position="-75"
unicode-range="U+0001-U+20AC"
/>
<missing-glyph
/>
<glyph glyph-name=".notdef"
/>
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001" unicode="&#x85;"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001" unicode="&#xa;"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="uni0001"
d="M67 600h400v-600h-400v600z" />
<glyph glyph-name="space" unicode=" "
/>
<glyph glyph-name="space" unicode="&#xa0;"
/>
<glyph glyph-name="exclam" unicode="!"
d="M226 130v-130h120v130h-120zM221 335l0.00195312 -125h130v125h65v205c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18
s0.166992 9.83398 1.5 12.501h-120c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-205h65z
" />
<glyph glyph-name="quotedbl" unicode="&#x22;"
d="M54 602v-200h130v200h-130v0zM324 602v-200h130v200h-130v0z" />
<glyph glyph-name="numbersign" unicode="#"
d="M119 135v-135h123v130h90v-130h127v135h69v70h-68v200h68v70h-69v135h-127v-130h-85v130h-128v-135h-69v-70h64v-200h-64v-70h69v0zM247 400h80v-190h-80v190v0z" />
<glyph glyph-name="dollar" unicode="$"
d="M187 1v-134h128v136h70v69l69 2v138h-68v69h-71v61h-69l-1 70h-59v141h129v-70h140v70h-69l-1 69h-70v139h-129v-139h-70v-71h-69v-138h70v-69h69v-61h60v-70l68 1v-142h-128v69h-141v-67h69c0 -12.667 0.166992 -24.5 0.5 -35.5s0.5 -22.833 0.5 -35.5
c2 -0.666992 6.33301 -1 13 -1h22h22c7.33301 0 12.333 -0.333008 15 -1z" />
<glyph glyph-name="percent" unicode="%"
d="M266 10v-65.002h205c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v130
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-205v-65h-55v-140h55zM341 144.998h60v-130h-60v130z
M71 214.998l0.00195312 -129.999h60c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5c0.666992 0.666992 4 1.5 10 2.5s12.5 1.83301 19.5 2.5s13.5 1.33398 19.5 2.00098s9.66699 1.66699 11 3c2 2 3.83301 6 5.5 12
s3 12.5 4 19.5s1.66699 13.667 2 20s-0.166992 10.833 -1.5 13.5h50c-1.33301 2.66699 -2 7 -2 13c0 6.66699 0.5 13.5 1.5 20.5s2.5 13.5 4.5 19.5s4 10 6 12s6 4 12 6s12.5 3.5 19.5 4.5s13.5 1.5 19.5 1.5c6.66699 0 11.334 -0.666992 14.001 -2v50
c2.66699 -1.33301 7.16699 -1.83301 13.5 -1.5s13 1 20 2s13.5 2.33301 19.5 4s10 3.5 12 5.5c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11c2 2 5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2
s9.83398 -0.166992 12.501 -1.5v130h-60c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5c-1.33301 -1.33301 -5 -2.33301 -11 -3s-12.5 -1.33398 -19.5 -2.00098s-13.5 -1.5 -19.5 -2.5
s-9.33301 -1.83301 -10 -2.5c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10c-1.33301 -1.33301 -5 -2.33301 -11 -3s-12.5 -1.33398 -19.5 -2.00098s-13.5 -1.5 -19.5 -2.5
s-9.33301 -1.83301 -10 -2.5c-2 -2 -3.83301 -5.83301 -5.5 -11.5s-3 -11.667 -4 -18s-1.66699 -12.333 -2 -18s0.166992 -9.83398 1.5 -12.501c-2 0.666992 -5.5 0.833984 -10.5 0.500977s-10.167 -1 -15.5 -2s-10.333 -2.16699 -15 -3.5s-7.66699 -3 -9 -5
s-2.83301 -5.33301 -4.5 -10s-3 -9.66699 -4 -15s-1.83301 -10.333 -2.5 -15s-0.333984 -8 0.999023 -10c-2.66699 1.33301 -6.83398 1.83301 -12.501 1.5s-11.667 -1 -18 -2s-12.333 -2.33301 -18 -4s-9.5 -3.5 -11.5 -5.5c-1.33301 -1.33301 -2.33301 -5 -3 -11
s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5zM1.00195 494.999c2.66699 1.33301 6.83398 1.83301 12.501 1.5
s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h190c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18
s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v130c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5
s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-190c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2
s-9.83398 0.166992 -12.501 1.5v-130zM141.002 624.999h60v-130h-60v130z" />
<glyph glyph-name="ampersand" unicode="&#x26;"
d="M56 70c2.66699 1.33301 6.83398 1.83398 12.501 1.50098s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h195v60h70v-60h135v65h-60v140h60v65h-270v-65
h60v-135h-120v265h120c-1.33301 2.66699 -1.83301 7.16699 -1.5 13.5s1 13 2 20s2.33301 13.5 4 19.5s3.5 10 5.5 12s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v130c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-190c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-135h60v-70h-60v-265zM196 540.001h50v-130h-50v130z" />
<glyph glyph-name="quotesingle" unicode="'"
d="M178 604v-200h120v200h-120v0z" />
<glyph glyph-name="parenleft" unicode="("
d="M282 -66v-65h135v65h-65v140h-65v340h65v140h65v65h-135v-65h-60v-140h-65v-340h65v-140h60v0z" />
<glyph glyph-name="parenright" unicode=")"
d="M165 -61l1 -68h121v65h75v140h65v340h-65v137h-70v68h-126l-1 -72h66l1 -133h55v-340h-55l-1 -137h-66z" />
<glyph glyph-name="asterisk" unicode="*"
d="M109 216v-65h125v60h70v-60h135v65h-60v70h130v60h-130v70h60v65h-135v-60h-70v60h-125v-65h60v-70h-130v-60h130v-70h-60v0z" />
<glyph glyph-name="plus" unicode="+"
d="M194 252v-135h130v135h135v60h-135v135h-130v-135h-135v-60h135v0z" />
<glyph glyph-name="comma" unicode=","
d="M200 -63l-0.000976562 -65.001h120c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v200h-190v-135h50v-70h-50z" />
<glyph glyph-name="minus" unicode="-"
d="M56 303v-50h400v50h-400z" />
<glyph glyph-name="period" unicode="."
d="M198 130v-130h190v130h-190v0z" />
<glyph glyph-name="slash" unicode="/"
d="M87 -64h99l301 631v49h-108l-292 -584v-96z" />
<glyph glyph-name="zero" unicode="0"
d="M82 71c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v470c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-470zM218 134h60v140h-60v265h130v-65h-60v-140h60v-265h-130v65z" />
<glyph glyph-name="one" unicode="1"
d="M249 406v-405h135v610h-135v-65h-60v-70h-135v-70h195v0z" />
<glyph glyph-name="two" unicode="2"
d="M98 0h400.001v65h-260v70h58c-1.33301 2.66699 -2.33301 7.16699 -3 13.5s-1 12.833 -1 19.5c0 7.33301 0.5 14 1.5 20s2.5 10 4.5 12c0.666992 0.666992 4 1.5 10 2.5s12.5 1.83301 19.5 2.5s13.5 1.33398 19.5 2.00098s9.66699 1.66699 11 3
c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11c2 2 6 3.83301 12 5.5s12.5 3 19.5 4s13.667 1.66699 20 2s10.833 -0.166992 13.5 -1.5v55h65v205c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-130h135v130h125v-205h-60c0.666992 -2 1 -5.66699 1 -11s-0.5 -11 -1.5 -17s-2.33301 -11.5 -4 -16.5s-3.5 -8.5 -5.5 -10.5
c-1.33301 -2 -4.5 -3.5 -9.5 -4.5s-10.5 -1.83301 -16.5 -2.5s-12 -1 -18 -1c-5.33301 0 -9 0.666992 -11 2c1.33301 -2.66699 2.5 -7.33398 3.5 -14.001s1.5 -14 1.5 -22c0 -7.33301 -0.333008 -14.333 -1 -21s-2 -11 -4 -13c-1.33301 -1.33301 -5.33301 -1.83301 -12 -1.5
s-14.167 0.833008 -22.5 1.5s-16.166 1 -23.499 1c-6.66699 0 -10.334 -0.333008 -11.001 -1c-1.33301 -1.33301 -2 -5.33301 -2 -12s0.166992 -14.167 0.5 -22.5s0.333008 -16 0 -23s-0.833008 -10.833 -1.5 -11.5c-2 -2 -6 -3.33301 -12 -4s-12.333 -1 -19 -1
s-13 0.5 -19 1.5s-10.333 2.16699 -13 3.5v-135z" />
<glyph glyph-name="three" unicode="3"
d="M95 70c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v205h-60v60h60v205c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-130h135v130h125v-205h-120v-60h120v-205h-125v130h-135v-130z" />
<glyph glyph-name="four" unicode="4"
d="M319 135v-135h140v135h65v70h-65v265h-140v-260h-125v65h50v335h-125v-335h-65v-140h265v0z" />
<glyph glyph-name="five" unicode="5"
d="M44 65l-0.000976562 -65.002h313c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5c0.666992 0.666992 4 1.5 10 2.5s12.5 1.83301 19.5 2.5s13.5 1.33398 19.5 2.00098s9.66699 1.66699 11 3
c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11c2 2 5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v135h-65v60h-248v210h313v65h-453v-335h313v-135
c-2.66699 1.33301 -6.83398 1.83301 -12.501 1.5s-11.667 -1 -18 -2s-12.333 -2.33301 -18 -4s-9.5 -3.5 -11.5 -5.5s-3.83301 -6 -5.5 -12s-3 -12.5 -4 -19.5s-1.66699 -13.667 -2 -20s0.166992 -10.833 1.5 -13.5h-243z" />
<glyph glyph-name="six" unicode="6"
d="M95 70c2.66699 1.33301 6.83203 1.83301 12.499 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v260c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 6 -5.5 12s-3 12.5 -4 19.5s-1.66699 13.667 -2 20s0.166992 10.833 1.5 13.5h-130v65c2.66699 -1.33301 6.83398 -1.83301 12.501 -1.5s11.667 1 18 2s12.333 2.33301 18 4s9.5 3.5 11.5 5.5
c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11c2 2 5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v60h-195v-130c-2.66699 1.33301 -7.16699 1.83301 -13.5 1.5
s-13 -1 -20 -2s-13.5 -2.33301 -19.5 -4s-10 -3.5 -12 -5.5c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2
s-9.83398 0.166992 -12.501 1.5v-330zM234.998 330h120v-260h-120v260z" />
<glyph glyph-name="seven" unicode="7"
d="M157 205v-205h125v205h70v130h70v140h65v135h-400v-65h260v-70h-65v-140h-60v-130h-65v0z" />
<glyph glyph-name="eight" unicode="8"
d="M87 70c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v205h-60v60h60v205c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-205h60v-60h-60v-205zM227 270l49.999 0.000976562c-1.33301 -2.66699 -1.83301 -6.83398 -1.5 -12.501s1 -11.667 2 -18
s2.33301 -12.333 4 -18s3.5 -9.5 5.5 -11.5s5.83301 -3.83301 11.5 -5.5s11.667 -3 18 -4s12.333 -1.66699 18 -2s9.83398 0.166992 12.501 1.5v-130h-120v200zM281.999 405.001h-55v135h120v-200h-65v65z" />
<glyph glyph-name="nine" unicode="9"
d="M156 60v-60h195v130c2.66699 -1.33301 7.16699 -1.83301 13.5 -1.5s13 1 20 2s13.5 2.33301 19.5 4s10 3.5 12 5.5c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11c2 2 5.83301 3.83301 11.5 5.5s11.667 3 18 4
s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v330c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501
h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-260
c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -6 5.5 -12s3 -12.5 4 -19.5s1.66699 -13.667 2 -20s-0.166992 -10.833 -1.5 -13.5h120v-70h-50c1.33301 -2.66699 1.83301 -7.16699 1.5 -13.5
s-1 -13 -2 -20s-2.33301 -13.5 -4 -19.5s-3.5 -10 -5.5 -12s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5zM226 540h120v-260h-120v260z" />
<glyph glyph-name="colon" unicode=":"
d="M193 139v-130h190v130h-190v0zM193 479v-130h190v130h-190v0z" />
<glyph glyph-name="semicolon" unicode=";"
d="M198 -66l-0.000976562 -65.001h120c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v200h-190v-135h50v-70h-50z
M197.999 478.999v-130h190v130h-190z" />
<glyph glyph-name="less" unicode="&#x3c;"
d="M494 0h-102l-301 300l301 310h102v-42l-267 -269l267 -262v-37z" />
<glyph glyph-name="equal" unicode="="
d="M99 283v-60h401v60h-401v0zM99 422v-60h401v60h-401v0z" />
<glyph glyph-name="greater" unicode="&#x3e;"
d="M92 0h102l301 300l-301 310h-102v-42l259 -261l-259 -265v-42z" />
<glyph glyph-name="question" unicode="?"
d="M211 130v-130h120v130h-120zM211 335l0.000976562 -125h125v120c2.66699 -1.33301 7.16699 -1.83301 13.5 -1.5s13 1 20 2s13.5 2.33301 19.5 4s10 3.5 12 5.5c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11
c2 2 5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v130c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18
s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2
s-9.83398 0.166992 -12.501 1.5v-130h135v130h125v-130c-2.66699 1.33301 -6.83398 1.83301 -12.501 1.5s-11.667 -1 -18 -2s-12.333 -2.33301 -18 -4s-9.5 -3.5 -11.5 -5.5s-3.83301 -6 -5.5 -12s-3 -12.5 -4 -19.5s-1.66699 -13.667 -2 -20s0.166992 -10.833 1.5 -13.5
h-50z" />
<glyph glyph-name="at" unicode="@"
d="M7 71c2.66699 1.33301 6.83301 1.83398 12.5 1.50098s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h470v65h-400v481h265v-141h-140v-70h-55v-130h55
v-65h275v404h-66l-4 66h-406v-65l-64 -1v-474zM358.999 335.001h72v-130h-72v130z" />
<glyph glyph-name="A" unicode="A"
d="M59 470l0.00390625 -470h135v200h130v-200h135v470c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5
s-1.83301 9.66699 -2.5 11c-1.33301 0.666992 -5 1.5 -11 2.5s-12.5 1.83301 -19.5 2.5s-13.5 1.33398 -19.5 2.00098s-9.33301 1.66699 -10 3c-2 2 -3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-120
c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5c-1.33301 -1.33301 -5 -2.33301 -11 -3s-12.5 -1.33398 -19.5 -2.00098s-13.5 -1.5 -19.5 -2.5s-9.33301 -1.83301 -10 -2.5
c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5zM199.004 470h120v-190h-120v190
z" />
<glyph glyph-name="B" unicode="B"
d="M62 610v-610.002h330c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v205h-60v60h60v205
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-330zM202 269.998h120v-200h-120v200zM202 539.998h120
v-200h-120v200z" />
<glyph glyph-name="C" unicode="C"
d="M59 70c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v130h-135v-130h-125v470h125v-130h135v130
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501
s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-470z" />
<glyph glyph-name="D" unicode="D"
d="M54 610v-610.004h260c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5c0.666992 0.666992 4 1.5 10 2.5s12.5 1.83301 19.5 2.5s13.5 1.33398 19.5 2.00098s9.66699 1.66699 11 3c0.666992 0.666992 1.5 4 2.5 10
s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11c2 2 5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v330c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4
s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5s-1.83301 9.66699 -2.5 11c-1.33301 0.666992 -5 1.5 -11 2.5s-12.5 1.83301 -19.5 2.5s-13.5 1.33398 -19.5 2.00098s-9.33301 1.66699 -10 3
c-2 2 -3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260zM194 539.996l50 0.00195312c-1.33301 -2.66699 -1.83301 -6.83398 -1.5 -12.501s1 -11.667 2 -18s2.33301 -12.333 4 -18s3.5 -9.5 5.5 -11.5
s5.83301 -3.83301 11.5 -5.5s11.667 -3 18 -4s12.333 -1.66699 18 -2s9.83398 0.166992 12.501 1.5v-330c-2.66699 1.33301 -6.83398 1.83301 -12.501 1.5s-11.667 -1 -18 -2s-12.333 -2.33301 -18 -4s-9.5 -3.5 -11.5 -5.5s-3.83301 -5.83301 -5.5 -11.5s-3 -11.667 -4 -18
s-1.66699 -12.333 -2 -18s0.166992 -9.83398 1.5 -12.501h-50v470z" />
<glyph glyph-name="E" unicode="E"
d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0z" />
<glyph glyph-name="F" unicode="F"
d="M59 610v-610h135v275h195v60h-190v210h260v65h-400v0z" />
<glyph glyph-name="G" unicode="G"
d="M59 70c2.66699 1.33301 6.83496 1.83398 12.502 1.50098s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h330v270h-200v-65h60v-135h-120v470h125v-130
h135v130c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260
c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-470z" />
<glyph glyph-name="H" unicode="H"
d="M59 610v-610h135v270h130v-270h135v610h-135v-270h-130v270h-135v0z" />
<glyph glyph-name="I" unicode="I"
d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0z" />
<glyph glyph-name="J" unicode="J"
d="M59 70c2.66699 1.33301 6.83203 1.83301 12.499 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v540h-135v-540h-130v130h-135v-130z" />
<glyph glyph-name="K" unicode="K"
d="M56 610v-610h135v270h60v-135h70v-135h135v135h-65v140h-65v60h65v140h65v135h-135v-135h-70v-135h-60v270h-135v0z" />
<glyph glyph-name="L" unicode="L"
d="M59 610v-610h400v65h-265v545h-135v0z" />
<glyph glyph-name="M" unicode="M"
d="M44 610v-610h135v405h55v70h-55v135h-135zM379 400l0.00195312 -400h135v610h-135v-130c-2.66699 1.33301 -7.16699 1.83301 -13.5 1.5s-13 -1 -20 -2s-13.5 -2.33301 -19.5 -4s-10 -3.5 -12 -5.5c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5
s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-190h65v190h70z" />
<glyph glyph-name="N" unicode="N"
d="M56 610v-610h135v350l200 -176v-174h135v610h-135v-301l-200 191v110h-135z" />
<glyph glyph-name="O" unicode="O"
d="M75 69c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v470c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-470zM215 539h120v-470h-120v470z" />
<glyph glyph-name="P" unicode="P"
d="M57 615v-615h139v275h200v60h65v209l-65 1v70h-339v0zM196 544h129v-209h-129v209v0z" />
<glyph glyph-name="Q" unicode="Q"
d="M247 0c-1.33301 -2.66699 -1.83203 -7.16504 -1.49902 -13.498s1 -13 2 -20s2.33301 -13.5 4 -19.5s3.5 -10 5.5 -12c0.666992 -1.33301 4 -2.33301 10 -3s12.5 -1.33398 19.5 -2.00098s13.5 -1.5 19.5 -2.5s9.66699 -1.83301 11 -2.5c2 -2 3.83301 -5.83301 5.5 -11.5
s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h130v65h-60v140h60v475c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18
s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2
s-9.83398 0.166992 -12.501 1.5v-470c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -6 5.5 -12s3 -12.5 4 -19.5s1.66699 -13.667 2 -20s-0.166992 -10.833 -1.5 -13.5h120zM197.001 545.002h120v-470
h-120v470z" />
<glyph glyph-name="R" unicode="R"
d="M79 610l0.000976562 -610h135v270h55c-1.33301 -2.66699 -1.83301 -6.83398 -1.5 -12.501s1 -11.667 2 -18s2.33301 -12.333 4 -18s3.5 -9.5 5.5 -11.5s6 -3.83301 12 -5.5s12.5 -3 19.5 -4s13.667 -1.66699 20 -2s10.833 0.166992 13.5 1.5v-200h135v205h-60v130h60v205
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-330zM219.001 540h120v-200h-120v200z" />
<glyph glyph-name="S" unicode="S"
d="M51 70c2.66699 1.33301 6.83203 1.83398 12.499 1.50098s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v130c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5s-1.83301 9.66699 -2.5 11c-2 2 -6 3.83301 -12 5.5s-12.5 3 -19.5 4s-13.667 1.66699 -20 2
s-10.833 -0.166992 -13.5 -1.5v50c-2.66699 -1.33301 -7.33398 -2 -14.001 -2c-6 0 -12.5 0.5 -19.5 1.5s-13.5 2.5 -19.5 4.5s-10 4 -12 6s-4 6 -6 12s-3.5 12.5 -4.5 19.5s-1.5 13.5 -1.5 19.5c0 6.66699 0.666992 11.334 2 14.001h-50v135h125v-60h135v60
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501
s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-130c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4
s9.5 -3.5 11.5 -5.5c0.666992 -1.33301 1.5 -5 2.5 -11s1.83301 -12.5 2.5 -19.5s1.33398 -13.5 2.00098 -19.5s1.66699 -9.33301 3 -10c2 -2 5.83301 -3.83301 11.5 -5.5s11.667 -3 18 -4s12.333 -1.66699 18 -2s9.83398 0.166992 12.501 1.5
c-1.33301 -2 -1.66602 -5.5 -0.999023 -10.5s1.5 -10.167 2.5 -15.5s2.33301 -10.333 4 -15s3.16699 -7.66699 4.5 -9s4.33301 -2.83301 9 -4.5s9.66699 -3 15 -4s10.5 -1.83301 15.5 -2.5s8.5 -0.333984 10.5 0.999023c-1.33301 -2.66699 -1.83301 -6.83398 -1.5 -12.501
s1 -11.667 2 -18s2.33301 -12.333 4 -18s3.5 -9.5 5.5 -11.5s5.83301 -3.83301 11.5 -5.5s11.667 -3 18 -4s12.333 -1.66699 18 -2s9.83398 0.166992 12.501 1.5v-130h-125v60h-135v-60z" />
<glyph glyph-name="T" unicode="T"
d="M194 545v-545h130v545h135v65h-400v-65h135v0z" />
<glyph glyph-name="U" unicode="U"
d="M56 70c2.66699 1.33301 6.83203 1.83301 12.499 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v540h-135v-540h-130v540h-135v-540z" />
<glyph glyph-name="V" unicode="V"
d="M54 140c2.66699 1.33301 6.83008 1.83301 12.4971 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5c0.666992 -1.33301 1.5 -5 2.5 -11s1.83301 -12.5 2.5 -19.5s1.33398 -13.5 2.00098 -19.5s1.66699 -9.33301 3 -10c0.666992 -1.33301 4 -2.33301 10 -3
s12.5 -1.33398 19.5 -2.00098s13.5 -1.5 19.5 -2.5s9.66699 -1.83301 11 -2.5c2 -2 3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h120c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18
s2.33301 12.333 4 18s3.5 9.5 5.5 11.5c0.666992 0.666992 4 1.5 10 2.5s12.5 1.83301 19.5 2.5s13.5 1.33398 19.5 2.00098s9.66699 1.66699 11 3c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11
c2 2 5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v470h-135v-470h-130v470h-135v-470z" />
<glyph glyph-name="W" unicode="W"
d="M119 205v-205h130v205h65v195h-65v-190h-60v400h-135v-405h65v0zM324 205v-205h135v205h65v405h-135v-405h-65v0z" />
<glyph glyph-name="X" unicode="X"
d="M56 200v-199.999h135v270h55c-1.33301 -2.66699 -1.83301 -6.83398 -1.5 -12.501s1 -11.667 2 -18s2.33301 -12.333 4 -18s3.5 -9.5 5.5 -11.5s6 -3.83301 12 -5.5s12.5 -3 19.5 -4s13.667 -1.66699 20 -2s10.833 0.166992 13.5 1.5v-200h135v200
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5s-1.83301 9.66699 -2.5 11c-2 2 -5.83301 3.83301 -11.5 5.5
s-11.667 3 -18 4s-12.333 1.66699 -18 2s-9.83398 -0.166992 -12.501 -1.5v120c2.66699 -1.33301 6.83398 -1.83301 12.501 -1.5s11.667 1 18 2s12.333 2.33301 18 4s9.5 3.5 11.5 5.5c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5
s1.66699 9.66699 3 11c2 2 5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v130h-135v-200h-70v65h-60v135h-135v-130c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5
c0.666992 -1.33301 1.5 -5 2.5 -11s1.83301 -12.5 2.5 -19.5s1.33398 -13.5 2.00098 -19.5s1.66699 -9.33301 3 -10c2 -2 5.83301 -3.83301 11.5 -5.5s11.667 -3 18 -4s12.333 -1.66699 18 -2s9.83398 0.166992 12.501 1.5v-120
c-2.66699 1.33301 -6.83398 1.83301 -12.501 1.5s-11.667 -1 -18 -2s-12.333 -2.33301 -18 -4s-9.5 -3.5 -11.5 -5.5c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10
c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5z" />
<glyph glyph-name="Y" unicode="Y"
d="M189 275v-275h130v275h70v60h65v275h-135v-270h-130v270h-135v-275h65v-60h70v0z" />
<glyph glyph-name="Z" unicode="Z"
d="M56 200l0.00195312 -200.001h400v65h-260v140h50c-1.33301 2.66699 -2 7 -2 13c0 6.66699 0.5 13.5 1.5 20.5s2.5 13.5 4.5 19.5s4 10 6 12s6 4 12 6s12.5 3.5 19.5 4.5s13.5 1.5 19.5 1.5c6.66699 0 11.334 -0.666992 14.001 -2v50
c2.66699 -1.33301 7.16699 -1.83301 13.5 -1.5s13 1 20 2s13.5 2.33301 19.5 4s10 3.5 12 5.5c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11c2 2 5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2
s9.83398 -0.166992 12.501 -1.5v200h-400v-65h260v-135c-2.66699 1.33301 -6.83398 1.83301 -12.501 1.5s-11.667 -1 -18 -2s-12.333 -2.33301 -18 -4s-9.5 -3.5 -11.5 -5.5s-3.83301 -5.83301 -5.5 -11.5s-3 -11.667 -4 -18s-1.66699 -12.333 -2 -18
s0.166992 -9.83398 1.5 -12.501c-2 0.666992 -5.5 0.833984 -10.5 0.500977s-10.167 -1 -15.5 -2s-10.333 -2.16699 -15 -3.5s-7.66699 -3 -9 -5s-2.83301 -5.16699 -4.5 -9.5s-3 -9.16602 -4 -14.499s-1.83301 -10.5 -2.5 -15.5s-0.333984 -8.5 0.999023 -10.5
c-2.66699 1.33301 -6.83398 1.83301 -12.501 1.5s-11.667 -1 -18 -2s-12.333 -2.33301 -18 -4s-9.5 -3.5 -11.5 -5.5c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10
c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5z" />
<glyph glyph-name="bracketleft" unicode="["
d="M121 623v-798h269v55h-130v678h130v65h-269v0z" />
<glyph glyph-name="backslash" unicode="\"
d="M372 -60l110 -3l-2 53l-314 625l-84 2v-99z" />
<glyph glyph-name="bracketright" unicode="]"
d="M166 -132v-55h260v810h-260v-65h120v-690h-120v0z" />
<glyph glyph-name="asciicircum" unicode="^"
d="M208 717v-60v0h-60v0v-60v0h-60v0v-60v0h120v0v60h120v0v-60v0h108v0v60v0h-48v0v60v0h-60v0v60v0h-120v0z" />
<glyph glyph-name="underscore" unicode="_"
d="M0 -158v-50h550v50h-550z" />
<glyph glyph-name="grave" unicode="`"
d="M282 589v-69h140v69h-70v140h-199v-70h70v-70h59z" />
<glyph glyph-name="a" unicode="a"
d="M59 70c2.66699 1.33301 6.83496 1.83301 12.502 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h330v400
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260v-65h190v-130h-190
c1.33301 -2.66699 1.83301 -7.16699 1.5 -13.5s-1 -13 -2 -20s-2.33301 -13.5 -4 -19.5s-3.5 -10 -5.5 -12s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-130zM199.001 200h120v-130h-120v130z" />
<glyph glyph-name="b" unicode="b"
d="M97 610l-0.000976562 -610.001h330c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v330h-66v75h-199v135h-135z
M236.999 399.999h120v-330h-120v330z" />
<glyph glyph-name="c" unicode="c"
d="M56 70c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v60h-135v-60h-125v330h125v-60h135v60
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501
s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-330z" />
<glyph glyph-name="d" unicode="d"
d="M59 70c2.66699 1.33301 6.83398 1.83398 12.501 1.50098s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h330v610h-135v-135h-195
c1.33301 -2.66699 1.83301 -7.16699 1.5 -13.5s-1 -13 -2 -20s-2.33301 -13.5 -4 -19.5s-3.5 -10 -5.5 -12s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-330zM199 400.001h120v-330h-120v330z" />
<glyph glyph-name="e" unicode="e"
d="M51 70c2.66699 1.33301 6.83496 1.83398 12.502 1.50098s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260v65h-190v140h260v195
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501
s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-330zM191.001 400.001h120v-120h-120v120z" />
<glyph glyph-name="f" unicode="f"
d="M124 275v-275h130v275h209v61h-208v211h208v67h-267v-68h-72v-211h-70v-60h70v0z" />
<glyph glyph-name="g" unicode="g"
d="M62 -140v-54.999h335v55h65v615h-330c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-330
c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -6 5.5 -12s3 -12.5 4 -19.5s1.66699 -13.667 2 -20s-0.166992 -10.833 -1.5 -13.5h190v-140h-260zM202 405.001h120v-330h-120v330z" />
<glyph glyph-name="h" unicode="h"
d="M62 610l0.000976562 -610h135v400h130v-400h135v400c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 6 -5.5 12s-3 12.5 -4 19.5s-1.66699 13.667 -2 20s0.166992 10.833 1.5 13.5h-195v135h-135
z" />
<glyph glyph-name="i" unicode="i"
d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM199 660v-110h120v110h-120v0z" />
<glyph glyph-name="j" unicode="j"
d="M59 -155v-55h265v55h65v615h-260v-65h120v-550h-190v0zM259 650v-110h130v110h-130v0z" />
<glyph glyph-name="k" unicode="k"
d="M62 610l0.00292969 -609.999h135v200h55c-1.33301 -2.66699 -1.83301 -6.83398 -1.5 -12.501s1 -11.667 2 -18s2.33301 -12.333 4 -18s3.5 -9.5 5.5 -11.5s6 -3.83301 12 -5.5s12.5 -3 19.5 -4s13.667 -1.66699 20 -2s10.833 0.166992 13.5 1.5v-130h135v130
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5s-1.83301 9.66699 -2.5 11c-2 2 -5.83301 3.83301 -11.5 5.5
s-11.667 3 -18 4s-12.333 1.66699 -18 2s-9.83398 -0.166992 -12.501 -1.5v65h65v60h65v135h-135v-135h-65c1.33301 -2 1.83301 -5.66699 1.5 -11s-1 -11 -2 -17s-2.33301 -11.5 -4 -16.5s-3.5 -8.5 -5.5 -10.5s-5.66699 -2 -11 0s-10.833 4.5 -16.5 7.5l-16.5 8.5
c-5.33301 2.66699 -9 4 -11 4v310h-135z" />
<glyph glyph-name="l" unicode="l"
d="M59 65v-65h400v65h-135v545h-265v-65h130v-480h-130v0z" />
<glyph glyph-name="m" unicode="m"
d="M59 470v-470h135v400h60v-330h70v330h70v-400h135v400h-65v70h-405v0z" />
<glyph glyph-name="n" unicode="n"
d="M59 470v-470h135v400h130v-400h135v400l-65 7v63h-335v0z" />
<glyph glyph-name="o" unicode="o"
d="M59 70c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v330c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-330zM199 400h120v-330h-120v330z" />
<glyph glyph-name="p" unicode="p"
d="M56 470l0.00195312 -664.001h134v193h193c-1.33301 2.66699 -1.83301 7.16699 -1.5 13.5s1 12.833 2 19.5s2.33301 13 4 19s3.5 10.333 5.5 13c2 2 5.66699 3.83301 11 5.5s11.166 3 17.499 4s12.166 1.5 17.499 1.5c6 0 10.333 -0.333008 13 -1v326
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.166 2.33301 -17.499 4s-9 3.5 -11 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-327zM195.002 399.999h118v-326h-118v326z" />
<glyph glyph-name="q" unicode="q"
d="M324 1l-0.00390625 -194.002h135v664h-327c0.666992 -2.66699 1.33398 -7.66699 2.00098 -15s1 -15 1 -23s-0.333008 -15.167 -1 -21.5s-2 -9.5 -4 -9.5c-2.66699 0 -7.16699 -0.166992 -13.5 -0.5s-13 -0.666016 -20 -0.999023s-13.833 -0.5 -20.5 -0.5
c-6 0 -10.333 0.666992 -13 2v-327c2.66699 1.33301 7.33398 2.33301 14.001 3s13.834 0.833984 21.501 0.500977s14.834 -0.833008 21.501 -1.5s11 -2 13 -4s3.33301 -6.5 4 -13.5s0.666992 -14.333 0 -22s-1.5 -15 -2.5 -22s-1.83301 -11.833 -2.5 -14.5h192z
M200.996 401.998h119v-327h-119v327z" />
<glyph glyph-name="r" unicode="r"
d="M62 470v-470h135v276l60 1l1 58h204v135h-135l1 -63h-70l-2 -72h-59v135h-135z" />
<glyph glyph-name="s" unicode="s"
d="M62 65v-65h330c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v130
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 6 -5.5 12s-3 12.5 -4 19.5s-1.66699 13.667 -2 20s0.166992 10.833 1.5 13.5h-190v130h260v65h-330
c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-120
c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -6 5.5 -12s3 -12.5 4 -19.5s1.66699 -13.667 2 -20s-0.166992 -10.833 -1.5 -13.5h190v-140h-260z" />
<glyph glyph-name="t" unicode="t"
d="M124 70c2.66699 1.33301 7.16699 1.83398 13.5 1.50098s13 -1 20 -2s13.5 -2.33301 19.5 -4s10 -3.5 12 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260v65h-200v340h200v70h-205v135h-130v-135h-65v-70
h65v-335z" />
<glyph glyph-name="u" unicode="u"
d="M59 70c2.66699 1.33301 6.83301 1.83398 12.5 1.50098s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h330v470h-135v-400h-130v400h-135v-400z" />
<glyph glyph-name="v" unicode="v"
d="M59 140c2.66699 1.33301 6.83008 1.83301 12.4971 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5c0.666992 -1.33301 1.5 -5 2.5 -11s1.83301 -12.5 2.5 -19.5s1.33398 -13.5 2.00098 -19.5s1.66699 -9.33301 3 -10c0.666992 -1.33301 4 -2.33301 10 -3
s12.5 -1.33398 19.5 -2.00098s13.5 -1.5 19.5 -2.5s9.66699 -1.83301 11 -2.5c2 -2 3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h120c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18
s2.33301 12.333 4 18s3.5 9.5 5.5 11.5c0.666992 0.666992 4 1.5 10 2.5s12.5 1.83301 19.5 2.5s13.5 1.33398 19.5 2.00098s9.66699 1.66699 11 3c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11
c2 2 5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v330h-135v-330h-130v330h-135v-330z" />
<glyph glyph-name="w" unicode="w"
d="M113 133v-133h129v133h64v263h-64v-257h-59v326h-135v-332h65v0zM316 133v-133h134v133h64v332h-133v-332h-65v0z" />
<glyph glyph-name="x" unicode="x"
d="M59 130l0.00585938 -130h135v130h130v-130h135v130c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5
s-1.83301 9.66699 -2.5 11c-2 2 -5.83301 3.83301 -11.5 5.5s-11.667 3 -18 4s-12.333 1.66699 -18 2s-9.83398 -0.166992 -12.501 -1.5v65h65v60h65v135h-135v-130h-130v130h-135v-135h65v-60h65v-65c-2.66699 1.33301 -6.83398 1.83301 -12.501 1.5s-11.667 -1 -18 -2
s-12.333 -2.33301 -18 -4s-9.5 -3.5 -11.5 -5.5c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2
s-9.83398 0.166992 -12.501 1.5z" />
<glyph glyph-name="y" unicode="y"
d="M22 -141l-0.00195312 -55h265v50c2.66699 -1.33301 7.16699 -1.83301 13.5 -1.5s13 1 20 2s13.5 2.33301 19.5 4s10 3.5 12 5.5c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11c2 2 6 3.83301 12 5.5
s12.5 3 19.5 4s13.667 1.66699 20 2s10.833 -0.166992 13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -6 5.5 -12s3 -12.5 4 -19.5
s1.66699 -13.667 2 -20s-0.166992 -10.833 -1.5 -13.5h120v-70h-55v-70h-205z" />
<glyph glyph-name="z" unicode="z"
d="M59 130l0.000976562 -129.999h400v65h-260v70h50c-1.33301 2.66699 -1.83301 7.16699 -1.5 13.5s1 13 2 20s2.33301 13.5 4 19.5s3.5 10 5.5 12c0.666992 0.666992 4 1.5 10 2.5s12.5 1.83301 19.5 2.5s13.5 1.33398 19.5 2.00098s9.66699 1.66699 11 3
c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11c2 2 6 3.83301 12 5.5s12.5 3 19.5 4s13.667 1.66699 20 2s10.833 -0.166992 13.5 -1.5v55h65v135h-400v-65h260v-70h-60c0.666992 -2 1 -5.66699 1 -11
s-0.5 -11 -1.5 -17s-2.33301 -11.5 -4 -16.5s-3.5 -8.5 -5.5 -10.5c-1.33301 -2 -4.33301 -3.83301 -9 -5.5s-9.66699 -3 -15 -4s-10.5 -1.66699 -15.5 -2s-8.5 0.166992 -10.5 1.5c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18
s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5c-1.33301 -1.33301 -5 -2.33301 -11 -3s-12.5 -1.33398 -19.5 -2.00098s-13.5 -1.5 -19.5 -2.5s-9.33301 -1.83301 -10 -2.5c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5
s-1.83301 -9.33301 -2.5 -10c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5z" />
<glyph glyph-name="braceleft" unicode="{"
d="M240 -47v-65h135v65h-65v205h-68v75h-57v65h60v65h65v199h65v65h-135v-65h-60v-199h-70v-65h-65v-65h66v-75h69v-205h60z" />
<glyph glyph-name="bar" unicode="|"
d="M228 611v-810h120v810h-120v0z" />
<glyph glyph-name="braceright" unicode="}"
d="M101 -61v-65h139v70h75v200h72v80h63v65h-65v76h-70v200h-77v65h-139v-65h71v-200h78l2 -76h60v-65h-59v-75h-79v-210h-71z" />
<glyph glyph-name="asciitilde" unicode="~"
d="M1 557v-134h61v65h67v68h77v-68h60v-65h216v65h59v135h-60v-63h-80v-67h-60v68h-80v71h-195v-75h-65z" />
<glyph glyph-name="uni0091"
d="M266 600h132v-66h-68v-68h68v-133h-200v201h68v66z" />
<glyph glyph-name="uni0092"
d="M200 600h200v-199h-67v-68h-133v68h66v67h-66v132z" />
<glyph glyph-name="exclamdown" unicode="&#xa1;"
d="M200 400h133v-133h-133v133zM200 200h132v-133h68v-200h-67v-67h-133v67h-67v200h67v133z" />
<glyph glyph-name="cent" unicode="&#xa2;"
d="M200 600h133v-133h66v-67h67v-67h-133v67h-133v-267h132v67h133v-66h-65v-66h-67v-135h-133v135h-67v65h-66v267h65v68h68v132z" />
<glyph glyph-name="sterling" unicode="&#xa3;"
d="M0 133h67v135h-67v65h67v200h66v67h267v-66h66v-67h-133v66h-133v-200h200v-65h-201v-134h-66v-67h334v-67h-467v133z" />
<glyph glyph-name="currency" unicode="&#xa4;"
d="M200 400v-133h133v133h-133zM67 533h132v-66h134v66h134v-66h-67v-67h66v-133h-67v-66h68v-68h-134v68h-133v-68h-133v67h66v67h-66v133h66v67h-66v66z" />
<glyph glyph-name="yen" unicode="&#xa5;"
d="M67 600h132v-199h134v199h133v-199h-66v-68h66v-66h-133v-67h132v-67h-132v-133h-133v133h-133v67h133v67h-133v66h65v68h-65v199z" />
<glyph glyph-name="brokenbar" unicode="&#xa6;"
d="M200 133h133v-333h-133v333zM200 600h133v-333h-133v333z" />
<glyph glyph-name="section" unicode="&#xa7;"
d="M148 578v-60v0h-60v0v-120v0h60v-120v0h-60v0v-120v0h60v0v-60v0h60v0v-66v0h120v-136h-120v0v68v0h-120v0v-68v0h60v0v-66v0h240v0v66v0h60v0v136v0h-60v126v0h60v0v120v0h-60v0v60v0h-60v0v60v0h-120v120v0h120v0v-60v0h120v0v60v0h-60v0v60v0h-240v0zM328 278v-120
h-120v120h120z" />
<glyph glyph-name="dieresis" unicode="&#xa8;"
d="M67 667h133v-134h-133v134zM333 667h134v-134h-134v134z" />
<glyph glyph-name="copyright" unicode="&#xa9;"
d="M200 467h132v-67h68v-67h-67v68h-133v-201h-67v200h67v67zM67 468v-334h66v-66h267v66h67v335h-67v65h-268v-66h-65zM0 533h66v67h399v-67h68v-466h-67v-67h-399v67h-67v466zM200 200h133v67h67v-66h-68v-67h-132v66z" />
<glyph glyph-name="ordfeminine" unicode="&#xaa;"
d="M200 400v-67h133v67h-133zM467 200v-67h-400v67h400zM134 601h266v-68h67v-266h-335v66h-65v67h65v67h201v66h-199v68z" />
<glyph glyph-name="guillemotleft" unicode="&#xab;"
d="M266 334v-66h-68v-66h-66v-68h66v-67h68v-66h-133v67h-67v66h-67v66h67v67h66v67h134zM400 334h133v-65h-67v-67h-66v-68h64v-66h69v-68h-133v67h-68v67h-65v66h66v66h67v68z" />
<glyph glyph-name="logicalnot" unicode="&#xac;"
d="M467 333v-200h-135v134h-265v66h400z" />
<glyph glyph-name="uni00AD" unicode="&#xad;"
d="M466 268h-400v65h400v-65z" />
<glyph glyph-name="registered" unicode="&#xae;"
d="M67 467v-333h66v-66h267v66h66v333h-66v66h-267v-66h-66zM132 133v334h200v-67h68v-133h-67v133h-133v-132h132v-68h67v-66h-67v67h-133v-68h-67zM0 533h67v67h398v-67h68v-466h-67v-67h-400v67h-66v466z" />
<glyph glyph-name="macron" unicode="&#xaf;"
d="M0 800h532v-66h-532v66z" />
<glyph glyph-name="degree" unicode="&#xb0;"
d="M146 649v-63v0h-67v0v-127v0h67v0v-63v0h271v0v63v0h63v0v127v0h-63v0v63v0h-271v0zM354 586v-127h-139v127h139z" />
<glyph glyph-name="plusminus" unicode="&#xb1;"
d="M466 68v-68h-399v68h399zM200 467h133v-134h133v-66h-133v-134h-133v134h-133v66h133v134z" />
<glyph glyph-name="uni00B2" unicode="&#xb2;"
d="M133 600h200v-67h67v-66h-68v-66h-65v-68h133v-66h-267v133h67v67h67v66h-134v67z" />
<glyph glyph-name="uni00B3" unicode="&#xb3;"
d="M133 600h200v-67h67v-65h-67v-67h66v-67h-66v-67h-200v66h134v68h-67v66h67v66h-134v67z" />
<glyph glyph-name="acute" unicode="&#xb4;"
d="M292 589v-69h-140v69h70v140h199v-70h-70v-70h-59z" />
<glyph glyph-name="uni00B5" unicode="&#xb5;"
d="M199 467v-400h134v400h132v-400h68v-67h-133v68h-67v-68h-133v-132h-67v-68h-133v67h67v600h132z" />
<glyph glyph-name="paragraph" unicode="&#xb6;"
d="M533 600v-67h-67v-733h-133v333h-133v67h-67v67h-66v200h66v66h67v67h333z" />
<glyph glyph-name="periodcentered" unicode="&#xb7;"
d="M200 400h200v-133h-200v133z" />
<glyph glyph-name="cedilla" unicode="&#xb8;"
d="M200 0h132v-67h68v-65h-67v-68h-200v67h134v66h-67v67z" />
<glyph glyph-name="uni00B9" unicode="&#xb9;"
d="M200 600h133v-333h-133v200h-67v67h67v66z" />
<glyph glyph-name="ordmasculine" unicode="&#xba;"
d="M135 600v-66h-66v-201h65v-66h268v66h66v200h-66v67h-267zM466 200v-67h-399v67h399zM200 333v200h133v-200h-133z" />
<glyph glyph-name="guillemotright" unicode="&#xbb;"
d="M266 334v-66h68v-66h66v-68h-66v-67h-68v-66h133v67h67v66h67v66h-67v67h-66v67h-134zM132 334h-133v-65h67v-67h66v-68h-64v-66h-69v-68h133v67h68v67h65v66h-66v66h-67v68z" />
<glyph glyph-name="onequarter" unicode="&#xbc;"
d="M67 667h132v-334h68v68h66v66h66v66h134v-65h-68v-67h-66v-67h-66v-67h200v-334h-133v67h-200v133h-68v-66h-132v66h66v67h67v67h67v66h-134v200h-66v68h67v66zM333 67h67v66h-67v-66zM267 200h66v67h-66v-67zM200 133h67v67h-67v-67z" />
<glyph glyph-name="onehalf" unicode="&#xbd;"
d="M67 667h132v-334h68v68h66v66h66v66h134v-65h-68v-67h-66v-67h-66v-67h132v-66h67v-67h-67v-66h-65v-68h133v-67h-267v135h66v66h67v67h-199v-68h-68v-66h-132v66h66v67h67v67h67v66h-134v200h-66v68h67v66z" />
<glyph glyph-name="threequarters" unicode="&#xbe;"
d="M0 667h199v-67h67v-66h-67v-67h67v-66h-67v-68h68v68h66v66h66v66h134v-65h-68v-67h-66v-67h-66v-67h199v-334h-132v66h-200v135h67v66h66v67h-67v-66h-66v-68h-68v-66h-132v66h66v67h67v67h67v66h-200v68h132v67h-66v65h67v68h-133v66zM333 67h67v66h-67v-66z" />
<glyph glyph-name="questiondown" unicode="&#xbf;"
d="M328 270v130h-120v-130h120zM329 72l-0.000976562 125h-125v-120c-2.66699 1.33301 -7.16699 1.83301 -13.5 1.5s-13 -1 -20 -2s-13.5 -2.33301 -19.5 -4s-10 -3.5 -12 -5.5c-0.666992 -0.666992 -1.5 -4 -2.5 -10s-1.83301 -12.5 -2.5 -19.5
s-1.33398 -13.5 -2.00098 -19.5s-1.66699 -9.66699 -3 -11c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-130c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4
s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5
s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v130h-135v-130h-125v130c2.66699 -1.33301 6.83398 -1.83301 12.501 -1.5s11.667 1 18 2s12.333 2.33301 18 4s9.5 3.5 11.5 5.5s3.83301 6 5.5 12s3 12.5 4 19.5s1.66699 13.667 2 20
s-0.166992 10.833 -1.5 13.5h50z" />
<glyph glyph-name="Agrave" unicode="&#xc0;"
d="M59 470l0.00390625 -470h135v200h130v-200h135v470c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5
s-1.83301 9.66699 -2.5 11c-1.33301 0.666992 -5 1.5 -11 2.5s-12.5 1.83301 -19.5 2.5s-13.5 1.33398 -19.5 2.00098s-9.33301 1.66699 -10 3c-2 2 -3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-120
c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5c-1.33301 -1.33301 -5 -2.33301 -11 -3s-12.5 -1.33398 -19.5 -2.00098s-13.5 -1.5 -19.5 -2.5s-9.33301 -1.83301 -10 -2.5
c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5zM199.004 470h120v-190h-120v190
zM129.004 803h133v-67h66v-67h-133v67h-66v67z" />
<glyph glyph-name="Aacute" unicode="&#xc1;"
d="M59 470l0.00390625 -470h135v200h130v-200h135v470c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5
s-1.83301 9.66699 -2.5 11c-1.33301 0.666992 -5 1.5 -11 2.5s-12.5 1.83301 -19.5 2.5s-13.5 1.33398 -19.5 2.00098s-9.33301 1.66699 -10 3c-2 2 -3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-120
c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5c-1.33301 -1.33301 -5 -2.33301 -11 -3s-12.5 -1.33398 -19.5 -2.00098s-13.5 -1.5 -19.5 -2.5s-9.33301 -1.83301 -10 -2.5
c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5zM199.004 470h120v-190h-120v190
zM263.004 737v66h134v-65h-68v-68h-131v67h65z" />
<glyph glyph-name="Acircumflex" unicode="&#xc2;"
d="M59 470l0.00390625 -470h135v200h130v-200h135v470c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5
s-1.83301 9.66699 -2.5 11c-1.33301 0.666992 -5 1.5 -11 2.5s-12.5 1.83301 -19.5 2.5s-13.5 1.33398 -19.5 2.00098s-9.33301 1.66699 -10 3c-2 2 -3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-120
c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5c-1.33301 -1.33301 -5 -2.33301 -11 -3s-12.5 -1.33398 -19.5 -2.00098s-13.5 -1.5 -19.5 -2.5s-9.33301 -1.83301 -10 -2.5
c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5zM199.004 470h120v-190h-120v190
zM130.004 803h267v-66h67v-68h-134v67h-133v-66h-133v66h66v67z" />
<glyph glyph-name="Atilde" unicode="&#xc3;"
d="M59 470l0.00390625 -470h135v200h130v-200h135v470c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5
s-1.83301 9.66699 -2.5 11c-1.33301 0.666992 -5 1.5 -11 2.5s-12.5 1.83301 -19.5 2.5s-13.5 1.33398 -19.5 2.00098s-9.33301 1.66699 -10 3c-2 2 -3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-120
c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5c-1.33301 -1.33301 -5 -2.33301 -11 -3s-12.5 -1.33398 -19.5 -2.00098s-13.5 -1.5 -19.5 -2.5s-9.33301 -1.83301 -10 -2.5
c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5zM199.004 470h120v-190h-120v190
zM129.004 803h200v-66h67v66h132v-67h-67v-65h-198v65h-67v-65h-133v65h66v67z" />
<glyph glyph-name="Adieresis" unicode="&#xc4;"
d="M57 770v-129v0h134v0v129v0h-134v0zM330 770v-129v0h134v0v129v0h-134v0zM198 576v-66v0h-68v0v-69v0h-66v0v-442v0h134v0v180h139v-180v0h134v0v442v0h-66v0v69v0h-68v0v66v0h-139v0zM337 441v-202h-139v0v202h139z" />
<glyph glyph-name="Aring" unicode="&#xc5;"
d="M59 470l0.00292969 -470.001h135v200h130v-200h135v470c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5
s-1.83301 9.66699 -2.5 11c-1.33301 0.666992 -5 1.5 -11 2.5s-12.5 1.83301 -19.5 2.5s-13.5 1.33398 -19.5 2.00098s-9.33301 1.66699 -10 3c-2 2 -3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s24.834 7.83398 75.501 6.50098v71h66v63h-65v66h-265
v-65h-68v-64h65v-69c50 0 74.833 -2.83301 74.5 -8.5s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5c-1.33301 -1.33301 -5 -2.33301 -11 -3s-12.5 -1.33398 -19.5 -2.00098s-13.5 -1.5 -19.5 -2.5s-9.33301 -1.83301 -10 -2.5
c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5zM199.003 469.999h120v-190h-120
v190zM194.003 738.999h133v-66h-133v66z" />
<glyph glyph-name="AE" unicode="&#xc6;"
d="M267 600h266v-67h-133v-199h132v-66h-132v-201h132v-67h-265v201h-68v-201h-132v400h65v67h67v66h68v67zM200 267h67v133h-67v-133z" />
<glyph glyph-name="Ccedilla" unicode="&#xc7;"
d="M59 70c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h64v-66h72v-65h-137v-68h204v68h66v64h-67v67h58
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v130h-135v-130h-125v470h125v-130h135v130
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501
s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-470z" />
<glyph glyph-name="Egrave" unicode="&#xc8;"
d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM127 805h131v-64h67v-63h-134v62h-64v65z" />
<glyph glyph-name="Eacute" unicode="&#xc9;"
d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM260 803h132v-66h-66v-66h-133v66h67v66z" />
<glyph glyph-name="Ecircumflex" unicode="&#xca;"
d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM129 806h265v-66h67v-66h-132v65h-134v-66h-133v67h67v66z" />
<glyph glyph-name="Edieresis" unicode="&#xcb;"
d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM62 807h132v-133h-132v133zM326 806h132v-133h-132v133z" />
<glyph glyph-name="Igrave" unicode="&#xcc;"
d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM127 806h133v-67h66v-65h-133v66h-66v66z" />
<glyph glyph-name="Iacute" unicode="&#xcd;"
d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM261 805h132v-67h-66v-66h-133v65h67v68z" />
<glyph glyph-name="Icircumflex" unicode="&#xce;"
d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM124 809h266v-66h67v-66h-133v66h-134v-66h-132v65h66v67z" />
<glyph glyph-name="Idieresis" unicode="&#xcf;"
d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM55 813h133v-131h-133v131zM322 812h132v-132h-132v132z" />
<glyph glyph-name="Eth" unicode="&#xd0;"
d="M55 611v-271.004h-55v-64h54v-276h260c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5c0.666992 0.666992 4 1.5 10 2.5s12.5 1.83301 19.5 2.5s13.5 1.33398 19.5 2.00098s9.66699 1.66699 11 3
c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11c2 2 5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v330c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5s-1.83301 9.66699 -2.5 11c-1.33301 0.666992 -5 1.5 -11 2.5s-12.5 1.83301 -19.5 2.5s-13.5 1.33398 -19.5 2.00098
s-9.33301 1.66699 -10 3c-2 2 -3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501zM194 539.996l50 0.00195312c-1.33301 -2.66699 -1.83301 -6.83398 -1.5 -12.501s1 -11.667 2 -18s2.33301 -12.333 4 -18s3.5 -9.5 5.5 -11.5
s5.83301 -3.83301 11.5 -5.5s11.667 -3 18 -4s12.333 -1.66699 18 -2s9.83398 0.166992 12.501 1.5v-330c-2.66699 1.33301 -6.83398 1.83301 -12.501 1.5s-11.667 -1 -18 -2s-12.333 -2.33301 -18 -4s-9.5 -3.5 -11.5 -5.5s-3.83301 -5.83301 -5.5 -11.5s-3 -11.667 -4 -18
s-1.66699 -12.333 -2 -18s0.166992 -9.83398 1.5 -12.501h-50v205h67v65h-67v200z" />
<glyph glyph-name="Ntilde" unicode="&#xd1;"
d="M63 610l-0.00195312 -610.004h135v311c2 0 5.66699 1.33301 11 4l16.5 8c5.66699 2.66699 11.167 4.83398 16.5 6.50098s9 1.83398 11 0.500977s3.83301 -4.33301 5.5 -9s3 -9.66699 4 -15s1.66699 -10.5 2 -15.5s-0.166992 -8.5 -1.5 -10.5
c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5c0.666992 -1.33301 1.5 -5 2.5 -11s1.83301 -12.5 2.5 -19.5s1.33398 -13.5 2.00098 -19.5s1.66699 -9.33301 3 -10c2 -2 6 -3.83301 12 -5.5s12.5 -3 19.5 -4
s13.667 -1.66699 20 -2s10.833 0.166992 13.5 1.5v-200h135v610h-135v-270h-65c1.33301 2.66699 1.83301 6.83398 1.5 12.501s-1 11.667 -2 18s-2.33301 12.333 -4 18s-3.5 9.5 -5.5 11.5c-1.33301 0.666992 -5 1.5 -11 2.5s-12.5 1.83301 -19.5 2.5
s-13.5 1.33398 -19.5 2.00098s-9.33301 1.66699 -10 3c-2 2 -3.83301 6 -5.5 12s-3 12.5 -4 19.5s-1.66699 13.667 -2 20s0.166992 10.833 1.5 13.5h-55v135h-135zM131.998 799.996h201v-66h66l1 66h132v-66h-66v-66h-199v66h-68v-66h-134v66h67v66z" />
<glyph glyph-name="Ograve" unicode="&#xd2;"
d="M75 69c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v470c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-470zM215 539h120v-470h-120v470zM142 808h133v-66h67v-68h-133v68h-67v66z" />
<glyph glyph-name="Oacute" unicode="&#xd3;"
d="M75 69c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v470c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-470zM215 539h120v-470h-120v470zM276 806h132v-66h-66v-66h-133v65h67v67z" />
<glyph glyph-name="Ocircumflex" unicode="&#xd4;"
d="M75 69c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v470c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-470zM215 539h120v-470h-120v470zM141 808h266v-68h66v-65h-132v67h-133v-66h-133v65h66v67z" />
<glyph glyph-name="Otilde" unicode="&#xd5;"
d="M75 69c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v470c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-470zM215 539h120v-470h-120v470zM138 807h200v-66h67v66h132v-66h-66v-66h-199v65h-67v-65h-133v65h66v67z" />
<glyph glyph-name="Odieresis" unicode="&#xd6;"
d="M119 580v-70v0h-60v0v-447v0h60v0v-60v0h279v0v60v0h60v0v447v0h-60v0v70v0h-279v0zM338 510v-447h-143v0v447h143zM57 770v-129v0h134v0v129v0h-134v0zM330 770v-129v0h134v0v129v0h-134v0z" />
<glyph glyph-name="multiply" unicode="&#xd7;"
d="M67 200v-132h65v65h68v68h133v-67h66v-66h66v132h-66v67h-67v67h68v66h66v134h-66v-67h-67v-67h-134v68h-67v66h-65v-133h66v-67h66v-67h-67v-67h-65z" />
<glyph glyph-name="Oslash" unicode="&#xd8;"
d="M200 133v-66h133v201h-66v-135h-67zM199 533v-200h67v134h66v66h-133zM133 600l333 1v-534h-66v-67h-333v534h66v66z" />
<glyph glyph-name="Ugrave" unicode="&#xd9;"
d="M56 70c2.66699 1.33301 6.83203 1.83301 12.499 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v540h-135v-540h-130v540h-135v-540zM123.998 809h133v-65h65v-67h-131
v67h-67v65z" />
<glyph glyph-name="Uacute" unicode="&#xda;"
d="M56 70c2.66699 1.33301 6.83203 1.83301 12.499 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v540h-135v-540h-130v540h-135v-540zM258.998 809h133v-66h-68v-66h-132
v66h67v66z" />
<glyph glyph-name="Ucircumflex" unicode="&#xdb;"
d="M56 70c2.66699 1.33301 6.83203 1.83301 12.499 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v540h-135v-540h-130v540h-135v-540zM123.998 809h268v-66h65v-65h-132
v65h-132v-66h-134v66h65v66z" />
<glyph glyph-name="Udieresis" unicode="&#xdc;"
d="M59 572v-513v0h60v0v-60v0h281v0v60v0h60v0v513v0h-120v0v-513h-149v0v513v0h-132v0zM57 770v-129v0h134v0v129v0h-134v0zM330 770v-129v0h134v0v129v0h-134v0z" />
<glyph glyph-name="Yacute" unicode="&#xdd;"
d="M189 275v-275h130v275h70v60h65v275h-135v-270h-130v270h-135v-275h65v-60h70v0zM189 743h68v67h132v-66h-66v-66h-134v65z" />
<glyph glyph-name="Thorn" unicode="&#xde;"
d="M200 200h133v200h-133v-200zM67 600h133v-132h199v-68h66v-199h-66v-67h-199v-134h-133v600z" />
<glyph glyph-name="germandbls" unicode="&#xdf;"
d="M138 576v-60v0h-60v0v-517v0h120v0v517v0h60v-204v0h60v0v-253v0h-60v0v-60v0h120v0v60v0h60v0v253v0h-60v0v204v0h-60v0v60v0h-180v0z" />
<glyph glyph-name="agrave" unicode="&#xe0;"
d="M59 70c2.66699 1.33301 6.83496 1.83301 12.502 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h330v400
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260v-65h190v-130h-190
c1.33301 -2.66699 1.83301 -7.16699 1.5 -13.5s-1 -13 -2 -20s-2.33301 -13.5 -4 -19.5s-3.5 -10 -5.5 -12s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-130zM199.001 200h120v-130h-120v130zM63.001 737h198
v-133h66v-67h-133v67h-66v68h-65v65z" />
<glyph glyph-name="aacute" unicode="&#xe1;"
d="M59 70c2.66699 1.33301 6.83496 1.83301 12.502 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h330v400
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260v-65h190v-130h-190
c1.33301 -2.66699 1.83301 -7.16699 1.5 -13.5s-1 -13 -2 -20s-2.33301 -13.5 -4 -19.5s-3.5 -10 -5.5 -12s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-130zM199.001 200h120v-130h-120v130zM459.001 739
l1 -65h-67v-67h-66v-68h-133v67h67v133h198z" />
<glyph glyph-name="acircumflex" unicode="&#xe2;"
d="M59 70c2.66699 1.33301 6.83496 1.83301 12.502 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h330v400
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260v-65h190v-130h-190
c1.33301 -2.66699 1.83301 -7.16699 1.5 -13.5s-1 -13 -2 -20s-2.33301 -13.5 -4 -19.5s-3.5 -10 -5.5 -12s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-130zM199.001 200h120v-130h-120v130zM461.001 606v-68
h-133v68h-134v-67h-133v66h67v67h66v66h133v-66h67v-66h67z" />
<glyph glyph-name="atilde" unicode="&#xe3;"
d="M59 70c2.66699 1.33301 6.83496 1.83301 12.502 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h330v400
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260v-65h190v-130h-190
c1.33301 -2.66699 1.83301 -7.16699 1.5 -13.5s-1 -13 -2 -20s-2.33301 -13.5 -4 -19.5s-3.5 -10 -5.5 -12s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-130zM199.001 200h120v-130h-120v130zM532.001 736
v-132h-67v-68h-198v67h-67v67h-68v-66h-66v-67h-66v133h67v67h200v-67h66v-67h66v67h66v66h67z" />
<glyph glyph-name="adieresis" unicode="&#xe4;"
d="M136 440v-60v0h202v-141v0h-202v0v-60v0h-60v0v-120v0h60v0v-60v0h322v0v381v0h-60v0v60v0h-262v0zM338 179v-120h-134v120h134zM81 641v-120v0h120v0v120v0h-120v0zM321 641v-120v0h120v0v120v0h-120v0z" />
<glyph glyph-name="aring" unicode="&#xe5;"
d="M59 70c2.66699 1.33301 6.83496 1.83301 12.502 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h330v400
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260v-65h190v-130h-190
c1.33301 -2.66699 1.83301 -7.16699 1.5 -13.5s-1 -13 -2 -20s-2.33301 -13.5 -4 -19.5s-3.5 -10 -5.5 -12s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-130zM199.001 200h120v-130h-120v130zM459.001 674h-67
v66h-266v-66h-66v-67h65v-67h268v68h66v66zM194.001 672h133v-67h-132z" />
<glyph glyph-name="ae" unicode="&#xe6;"
d="M533 401v-200h-200v-133h199v-68h-199v68h-66v-68h-200v68h-67v133h66v67h134v133h-133v67h132v-67h67v67h199v-67h68zM333 267h67v133h-67v-133zM133 67h67v133h-67v-133z" />
<glyph glyph-name="ccedilla" unicode="&#xe7;"
d="M56 70c2.66699 1.33301 6.83496 1.83398 12.502 1.50098s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h67v-64h68v-63h-130v-69h198v69h66v62h-66v67
h56c-0.666992 1.33301 -0.833984 4.83301 -0.500977 10.5s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v60h-135v-60h-125v330h125v-60h135v60
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501
s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-330z" />
<glyph glyph-name="egrave" unicode="&#xe8;"
d="M200 400v-133h133v133h-133zM333 600v-67h-134v67h-66v67h-66v67h199v-134h67zM133 467h267v-67h66v-200h-266v-133h199v-68h-266v68h-66v333h66v67z" />
<glyph glyph-name="eacute" unicode="&#xe9;"
d="M200 400v-133h133v133h-133zM133 467h267v-67h67v-200h-267v-133h199v-68h-266v68h-66v334h66v66zM267 733h198v-65h-65v-67h-67v-68h-133v67h67v133z" />
<glyph glyph-name="ecircumflex" unicode="&#xea;"
d="M200 400v-133h133v133h-133zM133 467h267v-67h67v-200h-267v-133h199v-66h-266v66h-66v334h66v66zM200 733h132v-66h68v-66h66v-67h-134v66h-132v-67h-133v68h66v66h67v66z" />
<glyph glyph-name="edieresis" unicode="&#xeb;"
d="M67 667h133v-134h-133v134zM200 400v-133h133v133h-133zM133 467h266v-67h68v-200h-267v-133h199v-66h-266v66h-66v334h66v66zM333 667h134v-134h-134v134z" />
<glyph glyph-name="igrave" unicode="&#xec;"
d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM194 537h133v67h-67v133h-200v-65h67v-67h67v-68z" />
<glyph glyph-name="iacute" unicode="&#xed;"
d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM257 606h-66v-67h132v67h67v67h67v65h-200v-132z" />
<glyph glyph-name="icircumflex" unicode="&#xee;"
d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM192 737v-66h-67v-67h-66v-67h133v68h133v-67h134v66h-66v67h-67v66h-134v0z" />
<glyph glyph-name="idieresis" unicode="&#xef;"
d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM323 672v-135h134v135h-134v0zM58 672v-135h134v135h-134v0z" />
<glyph glyph-name="eth" unicode="&#xf0;"
d="M200 334h133v-267h-133v267zM332 600v-67h-66v67h-133v-67h67v-66h-133v-67h133v-67h-133v-266h66v-67h267v68h65v333h-65v66h-68v67h133v66h-133zM200 400h67v67h-67v-67z" />
<glyph glyph-name="ntilde" unicode="&#xf1;"
d="M59 470v-470h135v400h130v-400h135v400l-65 7v63h-335v0zM533 736v-133h-67v-68h-199v67h-67v67h-68v-66h-66v-68h-67v134h67v67h200v-66h66v-67h68v66h66v67h67z" />
<glyph glyph-name="ograve" unicode="&#xf2;"
d="M59 70c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v330c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-330zM199 400h120v-330h-120v330zM59 742h200v-133h66v-67h-132v67h-68v67h-66v66z" />
<glyph glyph-name="oacute" unicode="&#xf3;"
d="M59 70c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v330c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-330zM199 400h120v-330h-120v330zM254 741h199v-66h-65v-67h-67v-67h-133v66h66v134z" />
<glyph glyph-name="ocircumflex" unicode="&#xf4;"
d="M59 70c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v330c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-330zM199 400h120v-330h-120v330zM192 737h133v-66h67v-68h65v-66h-132v67h-134v-68h-132v67h65v67h68v67z" />
<glyph glyph-name="otilde" unicode="&#xf5;"
d="M59 70c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v330c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5
s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18
s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-330zM199 400h120v-330h-120v330zM0 672h67v65h199v-66h66v-67h68v68h65v65h67v-132h-67l1 -67h-199v67h-67v67h-68v-68h-66v-66h-66v134z
" />
<glyph glyph-name="odieresis" unicode="&#xf6;"
d="M81 641v-120v0h120v0v120v0h-120v0zM321 641v-120v0h120v0v120v0h-120v0zM141 447v-60v0h-60v0v-327v0h60v0v-60v0h240v0v60v0h60v0v327v0h-60v0v60v0h-240v0zM321 387v-327h-120v0v327h120z" />
<glyph glyph-name="divide" unicode="&#xf7;"
d="M200 200h133v-133h-133v133zM200 533h133v-133h-133v133zM465 333v-66h-398v66h398z" />
<glyph glyph-name="oslash" unicode="&#xf8;"
d="M200 133v-66h133v133h-66v-67h-67zM200 400v-133h66v66h67v67h-133zM133 467h333v-400h-66v-67h-333v400h66v67z" />
<glyph glyph-name="ugrave" unicode="&#xf9;"
d="M59 70c2.66699 1.33301 6.83301 1.83398 12.5 1.50098s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h330v470h-135v-400h-130v400h-135v-400z
M57.999 738.001h199v-132h67v-68h-133v68h-67v67h-66v65z" />
<glyph glyph-name="uacute" unicode="&#xfa;"
d="M59 70c2.66699 1.33301 6.83301 1.83398 12.5 1.50098s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h330v470h-135v-400h-130v400h-135v-400z
M258.999 737.001h199v-66h-66v-66h-67v-67h-133v66h67v133z" />
<glyph glyph-name="ucircumflex" unicode="&#xfb;"
d="M59 70c2.66699 1.33301 6.83301 1.83398 12.5 1.50098s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h330v470h-135v-400h-130v400h-135v-400z
M192.999 736.001h132v-65h67v-67h66v-67h-133v67h-133v-68h-132v67h66v67h67v66z" />
<glyph glyph-name="udieresis" unicode="&#xfc;"
d="M83 435v-377v0h60v0v-60v0h300v0v437v0h-120v0v-377h-120v0v377v0h-120v0zM81 641v-120v0h120v0v120v0h-120v0zM321 641v-120v0h120v0v120v0h-120v0z" />
<glyph glyph-name="yacute" unicode="&#xfd;"
d="M6 -139l-0.00195312 -55h265v50c2.66699 -1.33301 7.16699 -1.83301 13.5 -1.5s13 1 20 2s13.5 2.33301 19.5 4s10 3.5 12 5.5c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11c2 2 6 3.83301 12 5.5
s12.5 3 19.5 4s13.667 1.66699 20 2s10.833 -0.166992 13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -6 5.5 -12s3 -12.5 4 -19.5
s1.66699 -13.667 2 -20s-0.166992 -10.833 -1.5 -13.5h120v-70h-55v-70h-205zM271.998 744h200v-66h-66v-67h-67v-68h-133v67h67z" />
<glyph glyph-name="thorn" unicode="&#xfe;"
d="M200 68h133v266h-133v-266zM67 600h133v-199h199v-68h66v-266h-65v-67h-200v-200h-133v800z" />
<glyph glyph-name="ydieresis" unicode="&#xff;"
d="M6 -139l-0.00195312 -55h265v50c2.66699 -1.33301 7.16699 -1.83301 13.5 -1.5s13 1 20 2s13.5 2.33301 19.5 4s10 3.5 12 5.5c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11c2 2 6 3.83301 12 5.5
s12.5 3 19.5 4s13.667 1.66699 20 2s10.833 -0.166992 13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -6 5.5 -12s3 -12.5 4 -19.5
s1.66699 -13.667 2 -20s-0.166992 -10.833 -1.5 -13.5h120v-70h-55v-70h-205zM206.998 674v-134h-133v134h133zM475.998 674v-134h-134v134h134z" />
<glyph glyph-name="tilde" unicode="&#x2dc;"
d="M1 557v-134h61v65h67v68h77v-68h60v-65h216v65h59v135h-60v-63h-80v-67h-60v68h-80v71h-195v-75h-65z" />
<glyph glyph-name="Euro" unicode="&#x20ac;"
d="M125 625h311v-61h63v-64h-124v63h-188v-162h188v-57l-189 -1v-63h126v-64h-126v-153h188v62h125v-61h-62v-64h-313v64h-61v154h-63v63h63v63h-63v56h62v163h63v62z" />
<glyph glyph-name=".null"
/>
<glyph glyph-name="nonmarkingreturn"
/>
<glyph glyph-name=".0015"
d="M10 70c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -5.83301 5.5 -11.5s3 -11.667 4 -18s1.66699 -12.333 2 -18s-0.166992 -9.83398 -1.5 -12.501h260
c-1.33301 2.66699 -1.83301 6.83398 -1.5 12.501s1 11.667 2 18s2.33301 12.333 4 18s3.5 9.5 5.5 11.5s5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v130h-135v-130h-125v470h125v-130h135v130
c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5s-3.83301 5.83301 -5.5 11.5s-3 11.667 -4 18s-1.66699 12.333 -2 18s0.166992 9.83398 1.5 12.501h-260c1.33301 -2.66699 1.83301 -6.83398 1.5 -12.501
s-1 -11.667 -2 -18s-2.33301 -12.333 -4 -18s-3.5 -9.5 -5.5 -11.5s-5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-470z" />
<glyph glyph-name="sf256"
/>
<glyph glyph-name="sf260"
d="M0 479v-479.999h120v400h160v-400h152c0 54.667 0.5 104.667 1.5 150s0.166992 86.166 -2.5 122.499s-8.66699 67.833 -18 94.5s-24 49 -44 67s-46.833 31.5 -80.5 40.5s-76.5 13.5 -128.5 13.5c-6 0 -16.667 -0.5 -32 -1.5s-31.5 -2 -48.5 -3s-33 -1.83301 -48 -2.5
s-25.5 -1 -31.5 -1z" />
<glyph glyph-name="sf264"
d="M6 236c0 -41.333 2.16699 -76.666 6.5 -105.999s13.166 -53.5 26.499 -72.5s32.833 -32.833 58.5 -41.5s60.167 -13 103.5 -13s77.833 4.33301 103.5 13s45.334 22.5 59.001 41.5s22.5 43.167 26.5 72.5s6 64.666 6 105.999s-2 76.666 -6 105.999
s-12.833 53.333 -26.5 72s-33.334 32.334 -59.001 41.001s-60.167 13 -103.5 13s-77.833 -4.33301 -103.5 -13s-45.167 -22.334 -58.5 -41.001s-22.166 -42.667 -26.499 -72s-6.5 -64.666 -6.5 -105.999zM164 386h75v-300h-75v300z" />
<glyph glyph-name="sf265"
d="M8 417v-705c4 0 9.66699 0.833008 17 2.5s15 4 23 7s15.333 6.16699 22 9.5s11 7 13 11c4 4 9.33301 13.333 16 28l21.5 47l21.5 47c6.66699 14.667 12 24 16 28s13.333 9.66699 28 17l47 23l47 22c14.667 6.66699 24 11 28 13c5.33301 4 12.333 9.66699 21 17
s17 15 25 23s14.833 15.333 20.5 22s8.5 11 8.5 13s0.333008 9 1 21s1.5 26 2.5 42s1.83301 32.167 2.5 48.5s1 29.166 1 38.499s-0.333008 22 -1 38s-1.5 32 -2.5 48s-1.83301 30.167 -2.5 42.5s-1 19.5 -1 21.5c-2 5.33301 -6 11.833 -12 19.5
s-12.833 15.334 -20.5 23.001s-15.334 14.5 -23.001 20.5s-14.167 10 -19.5 12c-2 0 -9.16699 0.333008 -21.5 1s-26.5 1.5 -42.5 2.5s-32 1.83301 -48 2.5s-28.667 1 -38 1c-6 0 -16 -0.333008 -30 -1s-29 -1.5 -45 -2.5s-31.167 -1.83301 -45.5 -2.5
s-24.166 -1 -29.499 -1zM158 342h75v-300h-75v300z" />
<glyph glyph-name="sf259"
d="M69 448l0.000976562 -449.999h75l3 372l109 -297l150 300v-375h143c0 10 -0.5 25 -1.5 45s-2.5 42.333 -4.5 67l-6.5 78l-6.5 77.5c-2 24.333 -4 46.166 -6 65.499s-3.66699 33.333 -5 42c0 5.33301 -2.83301 12.333 -8.5 21s-12.5 17 -20.5 25s-16.333 14.833 -25 20.5
s-15.667 8.5 -21 8.5c-2 0 -10.5 0.333008 -25.5 1s-32.333 1.5 -52 2.5s-39.667 1.83301 -60 2.5s-37.166 1 -50.499 1c-7.33301 0 -19.833 -0.333008 -37.5 -1s-36.334 -1.5 -56.001 -2.5s-38.334 -1.83301 -56.001 -2.5s-30.167 -1 -37.5 -1z" />
<glyph glyph-name="sf261"
d="M10 610l-0.00195312 -610.004h135v311c2 0 5.66699 1.33301 11 4l16.5 8c5.66699 2.66699 11.167 4.83398 16.5 6.50098s9 1.83398 11 0.500977s3.83301 -4.33301 5.5 -9s3 -9.66699 4 -15s1.66699 -10.5 2 -15.5s-0.166992 -8.5 -1.5 -10.5
c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5c0.666992 -1.33301 1.5 -5 2.5 -11s1.83301 -12.5 2.5 -19.5s1.33398 -13.5 2.00098 -19.5s1.66699 -9.33301 3 -10c2 -2 6 -3.83301 12 -5.5s12.5 -3 19.5 -4
s13.667 -1.66699 20 -2s10.833 0.166992 13.5 1.5v-200h135v610h-135v-270h-65c1.33301 2.66699 1.83301 6.83398 1.5 12.501s-1 11.667 -2 18s-2.33301 12.333 -4 18s-3.5 9.5 -5.5 11.5c-1.33301 0.666992 -5 1.5 -11 2.5s-12.5 1.83301 -19.5 2.5
s-13.5 1.33398 -19.5 2.00098s-9.33301 1.66699 -10 3c-2 2 -3.83301 6 -5.5 12s-3 12.5 -4 19.5s-1.66699 13.667 -2 20s0.166992 10.833 1.5 13.5h-55v135h-135z" />
<glyph glyph-name="sf263"
d="M7 457l-0.000976562 -457.001h102v233c1.33301 0 4 1 8 3l12.5 6c4.33301 2 8.5 3.66699 12.5 5s6.66699 1.33301 8 0s2.66602 -3.5 3.99902 -6.5s2.33301 -6.5 3 -10.5s1 -8 1 -12c0 -3.33301 -0.333008 -6 -1 -8c2 0.666992 5 1 9 1
c4.66699 0 9.33398 -0.5 14.001 -1.5s9.16699 -2.16699 13.5 -3.5s7.16602 -2.66602 8.49902 -3.99902c0.666992 -0.666992 1.33398 -3.33398 2.00098 -8.00098l2 -14.5l2 -14.5c0.666992 -4.66699 1.33398 -7.33398 2.00098 -8.00098
c2 -1.33301 5.16699 -2.66602 9.5 -3.99902s9 -2.33301 14 -3s10 -1.16699 15 -1.5s8.5 0.166992 10.5 1.5v-150h101v457h-101v-202h-49c0.666992 2 1 5 1 9c0 4.66699 -0.5 9.33398 -1.5 14.001s-2.16699 9.16699 -3.5 13.5s-2.66602 7.16602 -3.99902 8.49902
c-0.666992 0.666992 -3.33398 1.33398 -8.00098 2.00098s-9.5 1.16699 -14.5 1.5s-9.83301 0.833008 -14.5 1.5s-7.33398 1.33398 -8.00098 2.00098c-1.33301 2 -2.66602 5.16699 -3.99902 9.5s-2.33301 9.16602 -3 14.499s-1.16699 10.333 -1.5 15s0.166992 8 1.5 10h-41
v101h-102z" />
<glyph glyph-name="sf262"
d="M7 457v-457h102v304h41v52h-41v101h-102zM259 300l0.000976562 -300h101v457h-101v-97c-2 0.666992 -5.66699 1 -11 1c-4.66699 0 -9.5 -0.5 -14.5 -1.5s-9.66699 -2.16699 -14 -3.5s-7.5 -2.66602 -9.5 -3.99902
c-0.666992 -0.666992 -1.33398 -3.33398 -2.00098 -8.00098l-2 -14.5l-2 -14.5c-0.666992 -4.66699 -1.33398 -7.33398 -2.00098 -8.00098c-1.33301 -1.33301 -4.16602 -2.66602 -8.49902 -3.99902s-8.83301 -2.33301 -13.5 -3s-9.16699 -1.16699 -13.5 -1.5
s-7.5 0.166992 -9.5 1.5v-143h49v143h53z" />
<glyph glyph-name="sf266"
d="M10 130l0.00585938 -130h135v130h130v-130h135v130c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5
s-1.83301 9.66699 -2.5 11c-2 2 -5.83301 3.83301 -11.5 5.5s-11.667 3 -18 4s-12.333 1.66699 -18 2s-9.83398 -0.166992 -12.501 -1.5v65h65v60h65v135h-135v-130h-130v130h-135v-135h65v-60h65v-65c-2.66699 1.33301 -6.83398 1.83301 -12.501 1.5s-11.667 -1 -18 -2
s-12.333 -2.33301 -18 -4s-9.5 -3.5 -11.5 -5.5c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10c-2 -2 -5.83301 -3.83301 -11.5 -5.5s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2
s-9.83398 0.166992 -12.501 1.5z" />
<glyph glyph-name="sf267"
d="M6 -139l-0.00195312 -55h265v50c2.66699 -1.33301 7.16699 -1.83301 13.5 -1.5s13 1 20 2s13.5 2.33301 19.5 4s10 3.5 12 5.5c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11c2 2 6 3.83301 12 5.5
s12.5 3 19.5 4s13.667 1.66699 20 2s10.833 -0.166992 13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5s3.83301 -6 5.5 -12s3 -12.5 4 -19.5
s1.66699 -13.667 2 -20s-0.166992 -10.833 -1.5 -13.5h120v-70h-55v-70h-205z" />
<glyph glyph-name="sf268"
d="M145 4l-0.00195312 -130.001h130v130c2.66699 -1.33301 7.16699 -1.83301 13.5 -1.5s13 1 20 2s13.5 2.33301 19.5 4s10 3.5 12 5.5c0.666992 0.666992 1.5 4 2.5 10s1.83301 12.5 2.5 19.5s1.33398 13.5 2.00098 19.5s1.66699 9.66699 3 11
c2 2 5.83301 3.83301 11.5 5.5s11.667 3 18 4s12.333 1.66699 18 2s9.83398 -0.166992 12.501 -1.5v130c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5c-1.33301 0.666992 -2.33301 4 -3 10
s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5s-1.83301 9.66699 -2.5 11c-2 2 -6 3.83301 -12 5.5s-12.5 3 -19.5 4s-13.667 1.66699 -20 2s-10.833 -0.166992 -13.5 -1.5v50c-2.66699 -1.33301 -7.33398 -2 -14.001 -2c-6 0 -12.5 0.5 -19.5 1.5s-13.5 2.5 -19.5 4.5
s-10 4 -12 6s-4 6 -6 12s-3.5 12.5 -4.5 19.5s-1.5 13.5 -1.5 19.5c0 6.66699 0.666992 11.334 2 14.001h-50v135h125v-60h135v60c-2.66699 -1.33301 -6.83398 -1.83301 -12.501 -1.5s-11.667 1 -18 2s-12.333 2.33301 -18 4s-9.5 3.5 -11.5 5.5
c-1.33301 0.666992 -2.33301 4 -3 10s-1.33398 12.5 -2.00098 19.5s-1.5 13.5 -2.5 19.5s-1.83301 9.66699 -2.5 11c-2 2 -6 3.83301 -12 5.5s-12.5 3 -19.5 4s-13.667 1.66699 -20 2s-10.833 -0.166992 -13.5 -1.5v90h-130v-90
c-2.66699 1.33301 -7.16699 1.83301 -13.5 1.5s-13 -1 -20 -2s-13.5 -2.33301 -19.5 -4s-10 -3.5 -12 -5.5c-1.33301 -1.33301 -2.33301 -5 -3 -11s-1.33398 -12.5 -2.00098 -19.5s-1.5 -13.5 -2.5 -19.5s-1.83301 -9.33301 -2.5 -10c-2 -2 -5.83301 -3.83301 -11.5 -5.5
s-11.667 -3 -18 -4s-12.333 -1.66699 -18 -2s-9.83398 0.166992 -12.501 1.5v-130c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5c0.666992 -1.33301 1.5 -5 2.5 -11s1.83301 -12.5 2.5 -19.5
s1.33398 -13.5 2.00098 -19.5s1.66699 -9.33301 3 -10c2 -2 5.83301 -3.83301 11.5 -5.5s11.667 -3 18 -4s12.333 -1.66699 18 -2s9.83398 0.166992 12.501 1.5c-1.33301 -2 -1.66602 -5.33301 -0.999023 -10s1.5 -9.66699 2.5 -15s2.33301 -10.333 4 -15
s3.16699 -8 4.5 -10s4.33301 -3.66699 9 -5s9.66699 -2.5 15 -3.5s10.5 -1.66699 15.5 -2s8.5 -0.166016 10.5 0.500977c-1.33301 -2.66699 -1.83301 -6.83398 -1.5 -12.501s1 -11.667 2 -18s2.33301 -12.333 4 -18s3.5 -9.5 5.5 -11.5s5.83301 -3.83301 11.5 -5.5
s11.667 -3 18 -4s12.333 -1.66699 18 -2s9.83398 0.166992 12.501 1.5v-130h-125v60h-135v-60c2.66699 1.33301 6.83398 1.83301 12.501 1.5s11.667 -1 18 -2s12.333 -2.33301 18 -4s9.5 -3.5 11.5 -5.5c0.666992 -1.33301 1.5 -5 2.5 -11s1.83301 -12.5 2.5 -19.5
s1.33398 -13.5 2.00098 -19.5s1.66699 -9.33301 3 -10c2 -2 6 -3.83301 12 -5.5s12.5 -3 19.5 -4s13.667 -1.66699 20 -2s10.833 0.166992 13.5 1.5z" />
<glyph glyph-name="sf269"
d="M10 810v-810h260v55h-130v690h130v65h-260v0z" />
<glyph glyph-name="sf270"
d="M56 603v-200h130v200h-130v0zM326 603v-200h130v200h-130v0z" />
<glyph glyph-name="glyph124"
d="M267 600h133v-267h-200z" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Binary file not shown.

7
public/css/style.css Normal file
View File

@ -0,0 +1,7 @@
body {
visibility: hidden
}
.navmargin {
margin-top: 2em;
}

1
public/docs/index.html Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html><html><head><title>https://goatpr0n.farm/posts/</title><link rel="canonical" href="https://goatpr0n.farm/posts/"/><meta name="robots" content="noindex"><meta charset="utf-8" /><meta http-equiv="refresh" content="0; url=https://goatpr0n.farm/posts/" /></head></html>

BIN
public/img/8x5overlay.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 B

BIN
public/img/dos-grid.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

224
public/index.html Normal file
View File

@ -0,0 +1,224 @@
<!DOCTYPE html>
<html lang="en"><head>
<meta name="generator" content="Hugo 0.69.1" />
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<div class="row-fluid navmargin">
<div class="page-header">
<h1>GoatPr0n.farm</h1>
</div>
</div>
<div class="row-fluid">
<div class="span9 bs-docs-sidebar">
<p class="lead">A farm w/o animals</p>
<p></p>
<p></p>
<p></p>
<hr class="soften">
<p></p>
<h1>Blog posts</h1>
<ul>
<li><a href="https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/">2019-11-28 | Reverse Engineering of a Flash Programmer :: EZP2010</a></li>
<li><a href="https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/">2019-09-25 | Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</a></li>
<li><a href="https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/">2019-07-24 | Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</a></li>
<li><a href="https://goatpr0n.farm/posts/reverse-engineering-of-the-skyrc-mc3000-battery-charger-usb-protocol/">2019-03-18 | Reverse Engineering of the SkyRC MC3000 Battery Charger USB Protocol</a></li>
<li><a href="https://goatpr0n.farm/posts/teaser-how-to-reverse-engineer-communication-protocols-of-embedded-devices/">2019-02-16 | [Teaser] How to reverse engineer communication protocols of embedded devices</a></li>
<li><a href="https://goatpr0n.farm/25.html">2019-02-05 | Hack back during #cyberwar</a></li>
<li><a href="https://goatpr0n.farm/posts/welcome-to-the-farm/">2019-02-05 | Welcome to the farm!</a></li>
<li><a href="https://goatpr0n.farm/posts/can-i-haz-ur-dataz/">2019-02-01 | Can I haz ur dataz</a></li>
<li><a href="https://goatpr0n.farm/posts/what-if-the-cult-of-dd-is-right/">2019-01-23 | What if the cult of dd is right?</a></li>
<li><a href="https://goatpr0n.farm/posts/there-is-not-enough-cyber-in-the-world/">2019-01-21 | There is not enough cyber in the world</a></li>
</ul>
</div>
<div class="span3 bs-docs-sidebar">
<h1>Categories</h1>
<ul class="nav nav-list bs-docs-sidenav">
<li>
<a href="https://goatpr0n.farm/categories/hardware/">hardware</a>
</li>
<li>
<a href="https://goatpr0n.farm/categories/reverse-engineering/">reverse engineering</a>
</li>
<li>
<a href="https://goatpr0n.farm/categories/cyber/">cyber</a>
</li>
<li>
<a href="https://goatpr0n.farm/categories/ctf/">CTF</a>
</li>
<li>
<a href="https://goatpr0n.farm/categories/brain-fart/">brain fart</a>
</li>
<li>
<a href="https://goatpr0n.farm/categories/uncategorized/">Uncategorized</a>
</li>
</ul>
<p></p>
<h1>Tags</h1>
<ul class="nav nav-list bs-docs-sidenav">
<li>
<a href="https://goatpr0n.farm/tags/flasher/">flasher</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/ghidra/">ghidra</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/hacking/">hacking</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/hardware/">hardware</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/programmer/">programmer</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/reverse-engineering/">reverse engineering</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/rom/">rom</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/jtag/">jtag</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/ctf/">CTF</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/python/">python</a>
</li>
</ul>
</div>
</div>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

126
public/index.xml Normal file
View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>GoatPr0n.farm</title>
<link>https://goatpr0n.farm/</link>
<description>Recent content on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Thu, 28 Nov 2019 12:01:53 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Reverse Engineering of a Flash Programmer :: EZP2010</title>
<link>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</guid>
<description>Preface In today&amp;rsquo;s adventure I like to take you with me on my journey of reverse engineering another USB device. The EZP2010 is an USB programmer for flash memory as used by mainboard manufactures to store the BIOS, or embedded devices to store the firmware (or settings). When it comes to data recovery on hard drives, or similar storage devices, these flashers can also become handy.
EZP2010 USB-Highspeed programmer
This particular programmer can be bought on many Chinese store or Amazon.</description>
</item>
<item>
<title>Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</title>
<link>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</link>
<pubDate>Wed, 25 Sep 2019 15:22:58 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</guid>
<description>TL;DR; Short the ERASE pin with VDDCORE, if ERASE == PIN_55 &amp;amp;&amp;amp; VDDCORE == PIN_54
According to complains in the internet, users report bricking their Proxmark3 EASY, when they try to flash the latest firmware with the &amp;lsquo;flasher&amp;rsquo; software tool.
Sometimes flashing process of firmware can go wrong, but it can often be recovered with JTAG programmers, or similar programmers.
I will not about setting up the environment to build, and flash the firmware, but I will tell you what you might be missing out and why it might be not working.</description>
</item>
<item>
<title>Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</title>
<link>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</link>
<pubDate>Wed, 24 Jul 2019 12:19:47 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</guid>
<description>#MemeFreeEdition
The Challenge You are provided a zip file containing two files.
program vm.py The file program contains instructions encoded as emojis for a virtual machine called vm.py. At the bottom of vm.py I found a list, or lets call it a translation table, with emojis and their function name counter part.
OPERATIONS = { &amp;#39;🍡&amp;#39;: add, &amp;#39;🤡&amp;#39;: clone, &amp;#39;📐&amp;#39;: divide, &amp;#39;😲&amp;#39;: if_zero, &amp;#39;😄&amp;#39;: if_not_zero, &amp;#39;🏀&amp;#39;: jump_to, &amp;#39;🚛&amp;#39;: load, &amp;#39;📬&amp;#39;: modulo, &amp;#39;⭐&amp;#39;: multiply, &amp;#39;🍿&amp;#39;: pop, &amp;#39;📤&amp;#39;: pop_out, &amp;#39;🎤&amp;#39;: print_top, &amp;#39;📥&amp;#39;: push, &amp;#39;🔪&amp;#39;: sub, &amp;#39;🌓&amp;#39;: xor, &amp;#39;⛰&amp;#39;: jump_top, &amp;#39;⌛&amp;#39;: exit } To execute program with vm.</description>
</item>
<item>
<title>Reverse Engineering of the SkyRC MC3000 Battery Charger USB Protocol</title>
<link>https://goatpr0n.farm/posts/reverse-engineering-of-the-skyrc-mc3000-battery-charger-usb-protocol/</link>
<pubDate>Mon, 18 Mar 2019 16:49:39 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/reverse-engineering-of-the-skyrc-mc3000-battery-charger-usb-protocol/</guid>
<description>Software Requirements Decompiler for .NET programs
dotPeek The implementation of the protocol is then written in Python. Let&amp;rsquo;s hear what the curator has to say:
Tell me about Python.
&amp;gt; Wow. Much Snake. Easy programming! &amp;gt; &amp;gt; \- Doge Tell me about dotPeek.
&amp;gt; Easy decompilation. Readable syntax. Very easy. &amp;gt; &amp;gt; \- Doge Analyzing MC3000_Monitor Decompiling Start dotPeek and use Drag&amp;rsquo;n&amp;rsquo;Drop to load the Application. Or uSe CtRL+O anD LoCATe tHe fILe uSiNg ThE bOrwsEr.</description>
</item>
<item>
<title>[Teaser] How to reverse engineer communication protocols of embedded devices</title>
<link>https://goatpr0n.farm/posts/teaser-how-to-reverse-engineer-communication-protocols-of-embedded-devices/</link>
<pubDate>Sat, 16 Feb 2019 01:25:34 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/teaser-how-to-reverse-engineer-communication-protocols-of-embedded-devices/</guid>
<description>Sneak Preview These letters. Such announcement. Many words.
In the next few days I will publish two - not one - but two articles on how to approach a problem on how to reverse engineer protocols. There have been to applications I looked into to code a library for my home uses.
#1 - MC3000 Charger MC3000_Charger provides an USB and Bluetooth (BT) interface (Spoiler: I am not covering the BT interface.</description>
</item>
<item>
<title>Hack back during #cyberwar</title>
<link>https://goatpr0n.farm/25.html</link>
<pubDate>Tue, 05 Feb 2019 18:45:08 +0000</pubDate>
<guid>https://goatpr0n.farm/25.html</guid>
<description>According this article people want us to hack back, and the government is like:
The GIF is probably copyrighted material by the The Fine Brothers. Plz Don&amp;rsquo;t sue me. I no make cyber moneyz with this blog
KTHXBYE.</description>
</item>
<item>
<title>Welcome to the farm!</title>
<link>https://goatpr0n.farm/posts/welcome-to-the-farm/</link>
<pubDate>Tue, 05 Feb 2019 18:17:12 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/welcome-to-the-farm/</guid>
<description>This magnificent piece of blog is now available under https://goatpr0n.farm/. Marvelous!</description>
</item>
<item>
<title>Can I haz ur dataz</title>
<link>https://goatpr0n.farm/posts/can-i-haz-ur-dataz/</link>
<pubDate>Fri, 01 Feb 2019 09:55:07 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/can-i-haz-ur-dataz/</guid>
<description>Remote data acquisitions over ssh To get your data trough ssh to your local storage, you simply use pipes. It does not matter if you use cat, dd or any other command line tool which outputs the data on standard output (stdout).
Using cat When using cat the there is no need to add any additional parameters in your command chain. A simple cat &amp;lt;input&amp;gt; will suffice.
Cat does not have any progress information during read operations.</description>
</item>
<item>
<title>What if the cult of dd is right?</title>
<link>https://goatpr0n.farm/posts/what-if-the-cult-of-dd-is-right/</link>
<pubDate>Wed, 23 Jan 2019 00:47:15 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/what-if-the-cult-of-dd-is-right/</guid>
<description>Are you a believer? There are articles out there talking about the useless usage of dd and why cat is better. Cat is faster because it automatically adjusts the blocksize and dd is slow because it internally only works with 512 byte blocks. This and That.
I did some simple tests with time, dd and cat, added some obscure parameters to dd, because cat is better.
Testing dd with status and specific blocksize $ time dd if=/dev/sdd of=test.</description>
</item>
<item>
<title>There is not enough cyber in the world</title>
<link>https://goatpr0n.farm/posts/there-is-not-enough-cyber-in-the-world/</link>
<pubDate>Mon, 21 Jan 2019 15:21:23 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/there-is-not-enough-cyber-in-the-world/</guid>
<description>My recent favuorite hash tags in social networks are:
- cyberwar / cyberkrieg - cold-cyberwar / kalter cyberkrieg KTHXBYE</description>
</item>
</channel>
</rss>

106
public/js/README.md Normal file
View File

@ -0,0 +1,106 @@
## 2.0 BOOTSTRAP JS PHILOSOPHY
These are the high-level design rules which guide the development of Bootstrap's plugin apis.
---
### DATA-ATTRIBUTE API
We believe you should be able to use all plugins provided by Bootstrap purely through the markup API without writing a single line of javascript.
We acknowledge that this isn't always the most performant and sometimes it may be desirable to turn this functionality off altogether. Therefore, as of 2.0 we provide the ability to disable the data attribute API by unbinding all events on the body namespaced with `'data-api'`. This looks like this:
$('body').off('.data-api')
To target a specific plugin, just include the plugins name as a namespace along with the data-api namespace like this:
$('body').off('.alert.data-api')
---
### PROGRAMMATIC API
We also believe you should be able to use all plugins provided by Bootstrap purely through the JS API.
All public APIs should be single, chainable methods, and return the collection acted upon.
$(".btn.danger").button("toggle").addClass("fat")
All methods should accept an optional options object, a string which targets a particular method, or null which initiates the default behavior:
$("#myModal").modal() // initialized with defaults
$("#myModal").modal({ keyboard: false }) // initialized with now keyboard
$("#myModal").modal('show') // initializes and invokes show immediately afterqwe2
---
### OPTIONS
Options should be sparse and add universal value. We should pick the right defaults.
All plugins should have a default object which can be modified to effect all instance's default options. The defaults object should be available via `$.fn.plugin.defaults`.
$.fn.modal.defaults = { … }
An options definition should take the following form:
*noun*: *adjective* - describes or modifies a quality of an instance
examples:
backdrop: true
keyboard: false
placement: 'top'
---
### EVENTS
All events should have an infinitive and past participle form. The infinitive is fired just before an action takes place, the past participle on completion of the action.
show | shown
hide | hidden
---
### CONSTRUCTORS
Each plugin should expose it's raw constructor on a `Constructor` property -- accessed in the following way:
$.fn.popover.Constructor
---
### DATA ACCESSOR
Each plugin stores a copy of the invoked class on an object. This class instance can be accessed directly through jQuery's data API like this:
$('[rel=popover]').data('popover') instanceof $.fn.popover.Constructor
---
### DATA ATTRIBUTES
Data attributes should take the following form:
- data-{{verb}}={{plugin}} - defines main interaction
- data-target || href^=# - defined on "control" element (if element controls an element other than self)
- data-{{noun}} - defines class instance options
examples:
// control other targets
data-toggle="modal" data-target="#foo"
data-toggle="collapse" data-target="#foo" data-parent="#bar"
// defined on element they control
data-spy="scroll"
data-dismiss="modal"
data-dismiss="alert"
data-toggle="dropdown"
data-toggle="button"
data-toggle="buttons-checkbox"
data-toggle="buttons-radio"

170
public/js/application.js Normal file
View File

@ -0,0 +1,170 @@
// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT
// IT'S ALL JUST JUNK FOR OUR DOCS!
// ++++++++++++++++++++++++++++++++++++++++++
!function ($) {
$(function(){
// oh how stylish! no semicolons. I'm not hipster enough for that.
// Keep your stumptown coffee and pbr, twats.
// real-javascript {{
/*
document.body.appendChild(document.createElement('div')).setAttribute('style', [
'position:fixed',
'z-index:1000',
'top:0',
'left:0',
'width:100%',
'height:100%',
'background:url("../img/8x5overlay.png") repeat'
].join(';'));
*/
// }}
var $window = $(window)
// Disable certain links in docs
$('section [href^=#]').click(function (e) {
e.preventDefault()
})
// side bar
setTimeout(function () {
$('.bs-docs-sidenav').affix({
offset: {
top: function () { return $window.width() <= 980 ? 290 : 210 }
, bottom: 270
}
})
}, 100)
// make code pretty
window.prettyPrint && prettyPrint()
// add-ons
$('.add-on :checkbox').on('click', function () {
var $this = $(this)
, method = $this.attr('checked') ? 'addClass' : 'removeClass'
$(this).parents('.add-on')[method]('active')
})
// add tipsies to grid for scaffolding
if ($('#gridSystem').length) {
$('#gridSystem').tooltip({
selector: '.show-grid > [class*="span"]'
, title: function () { return $(this).width() + 'px' }
})
}
// tooltip demo
$('.tooltip-demo').tooltip({
selector: "a[data-toggle=tooltip]"
})
$('.tooltip-test').tooltip()
$('.popover-test').popover()
// popover demo
$("a[data-toggle=popover]")
.popover()
.click(function(e) {
e.preventDefault()
})
// button state demo
$('#fat-btn')
.click(function () {
var btn = $(this)
btn.button('loading')
setTimeout(function () {
btn.button('reset')
}, 3000)
})
// carousel demo
$('#myCarousel').carousel()
// javascript build logic
var inputsComponent = $("#components.download input")
, inputsPlugin = $("#plugins.download input")
, inputsVariables = $("#variables.download input")
// toggle all plugin checkboxes
$('#components.download .toggle-all').on('click', function (e) {
e.preventDefault()
inputsComponent.attr('checked', !inputsComponent.is(':checked'))
})
$('#plugins.download .toggle-all').on('click', function (e) {
e.preventDefault()
inputsPlugin.attr('checked', !inputsPlugin.is(':checked'))
})
$('#variables.download .toggle-all').on('click', function (e) {
e.preventDefault()
inputsVariables.val('')
})
// request built javascript
$('.download-btn .btn').on('click', function () {
var css = $("#components.download input:checked")
.map(function () { return this.value })
.toArray()
, js = $("#plugins.download input:checked")
.map(function () { return this.value })
.toArray()
, vars = {}
, img = ['glyphicons-halflings.png', 'glyphicons-halflings-white.png']
$("#variables.download input")
.each(function () {
$(this).val() && (vars[ $(this).prev().text() ] = $(this).val())
})
$.ajax({
type: 'POST'
, url: /\?dev/.test(window.location) ? 'http://localhost:3000' : 'http://bootstrap.herokuapp.com'
, dataType: 'jsonpi'
, params: {
js: js
, css: css
, vars: vars
, img: img
}
})
})
})
// Modified from the original jsonpi https://github.com/benvinegar/jquery-jsonpi
$.ajaxTransport('jsonpi', function(opts, originalOptions, jqXHR) {
var url = opts.url;
return {
send: function(_, completeCallback) {
var name = 'jQuery_iframe_' + jQuery.now()
, iframe, form
iframe = $('<iframe>')
.attr('name', name)
.appendTo('head')
form = $('<form>')
.attr('method', opts.type) // GET or POST
.attr('action', url)
.attr('target', name)
$.each(opts.params, function(k, v) {
$('<input>')
.attr('type', 'hidden')
.attr('name', k)
.attr('value', typeof v == 'string' ? v : JSON.stringify(v))
.appendTo(form)
})
form.appendTo('body').submit()
}
}
})
}(window.jQuery)

111
public/js/bootstrap-386.js vendored Normal file
View File

@ -0,0 +1,111 @@
self._386 = self._386 || {};
$(function(){
var character = { height: 20, width: 12.4 };
function scrollLock() {
var last = 0;
$(window).bind('scroll', function(e) {
var func, off = $(window).scrollTop();
console.log(off, last, off < last ? "up" : "down");
// this determines whether the user is intending to go up or down.
func = off < last ? "floor" : "ceil";
// make sure we don't run this from ourselves
if(off % character.height === 0) {
return;
}
last = off;
window.scrollTo(
0,
Math[func](off / character.height) * character.height
);
});
}
function loading() {
if(_386.fastLoad) {
document.body.style.visibility='visible';
return;
}
var
onePass = _386.onePass,
speedFactor = 1 / (_386.speedFactor || 1) * 165000;
wrap = document.createElement('div'),
bar = wrap.appendChild(document.createElement('div')),
cursor = document.createElement('div'),
// If the user specified that the visibility is hidden, then we
// start at the first pass ... otherwise we just do the
// cursor fly-by
pass = ($(document.body).css('visibility') == 'visible') ? 1 : 0,
height = $(window).height(),
width = $(window).width(),
// this makes the loading of the screen proportional to the real-estate of the window.
// it helps keep the cool sequence there while not making it waste too much time.
rounds = (height * width / speedFactor),
column = width, row = height - character.height;
wrap.id = "wrap386";
bar.id = "bar386";
cursor.id = "cursor386";
cursor.innerHTML = bar.innerHTML = '&#9604;';
// only inject the wrap if the pass is 0
if(pass === 0) {
document.body.appendChild(wrap);
document.body.style.visibility='visible';
} else {
document.body.appendChild(cursor);
rounds /= 2;
character.height *= 4;
}
var ival = setInterval(function(){
for(var m = 0; m < rounds; m++) {
column -= character.width;
if(column <= 0) {
column = width;
row -= character.height;
}
if(row <= 0) {
pass++;
row = height - character.height;
if(pass == 2) {
document.body.removeChild(cursor);
clearInterval(ival);
} else {
wrap.parentNode.removeChild(wrap);
if(onePass) {
clearInterval(ival);
} else {
document.body.appendChild(cursor);
rounds /= 2;
character.height *= 4;
}
}
}
if(pass === 0) {
bar.style.width = column + "px";
wrap.style.height = row + "px";
} else {
cursor.style.right = column + "px";
cursor.style.bottom = row + "px";
}
}
}, 1);
}
loading();
});

117
public/js/bootstrap-affix.js vendored Normal file
View File

@ -0,0 +1,117 @@
/* ==========================================================
* bootstrap-affix.js v2.3.1
* http://twitter.github.com/bootstrap/javascript.html#affix
* ==========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* AFFIX CLASS DEFINITION
* ====================== */
var Affix = function (element, options) {
this.options = $.extend({}, $.fn.affix.defaults, options)
this.$window = $(window)
.on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
.on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
this.$element = $(element)
this.checkPosition()
}
Affix.prototype.checkPosition = function () {
if (!this.$element.is(':visible')) return
var scrollHeight = $(document).height()
, scrollTop = this.$window.scrollTop()
, position = this.$element.offset()
, offset = this.options.offset
, offsetBottom = offset.bottom
, offsetTop = offset.top
, reset = 'affix affix-top affix-bottom'
, affix
if (typeof offset != 'object') offsetBottom = offsetTop = offset
if (typeof offsetTop == 'function') offsetTop = offset.top()
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
'bottom' : offsetTop != null && scrollTop <= offsetTop ?
'top' : false
if (this.affixed === affix) return
this.affixed = affix
this.unpin = affix == 'bottom' ? position.top - scrollTop : null
this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
}
/* AFFIX PLUGIN DEFINITION
* ======================= */
var old = $.fn.affix
$.fn.affix = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('affix')
, options = typeof option == 'object' && option
if (!data) $this.data('affix', (data = new Affix(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.affix.Constructor = Affix
$.fn.affix.defaults = {
offset: 0
}
/* AFFIX NO CONFLICT
* ================= */
$.fn.affix.noConflict = function () {
$.fn.affix = old
return this
}
/* AFFIX DATA-API
* ============== */
$(window).on('load', function () {
$('[data-spy="affix"]').each(function () {
var $spy = $(this)
, data = $spy.data()
data.offset = data.offset || {}
data.offsetBottom && (data.offset.bottom = data.offsetBottom)
data.offsetTop && (data.offset.top = data.offsetTop)
$spy.affix(data)
})
})
}(window.jQuery);

99
public/js/bootstrap-alert.js vendored Normal file
View File

@ -0,0 +1,99 @@
/* ==========================================================
* bootstrap-alert.js v2.3.1
* http://twitter.github.com/bootstrap/javascript.html#alerts
* ==========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* ALERT CLASS DEFINITION
* ====================== */
var dismiss = '[data-dismiss="alert"]'
, Alert = function (el) {
$(el).on('click', dismiss, this.close)
}
Alert.prototype.close = function (e) {
var $this = $(this)
, selector = $this.attr('data-target')
, $parent
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
}
$parent = $(selector)
e && e.preventDefault()
$parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
$parent.trigger(e = $.Event('close'))
if (e.isDefaultPrevented()) return
$parent.removeClass('in')
function removeElement() {
$parent
.trigger('closed')
.remove()
}
$.support.transition && $parent.hasClass('fade') ?
$parent.on($.support.transition.end, removeElement) :
removeElement()
}
/* ALERT PLUGIN DEFINITION
* ======================= */
var old = $.fn.alert
$.fn.alert = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('alert')
if (!data) $this.data('alert', (data = new Alert(this)))
if (typeof option == 'string') data[option].call($this)
})
}
$.fn.alert.Constructor = Alert
/* ALERT NO CONFLICT
* ================= */
$.fn.alert.noConflict = function () {
$.fn.alert = old
return this
}
/* ALERT DATA-API
* ============== */
$(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
}(window.jQuery);

105
public/js/bootstrap-button.js vendored Normal file
View File

@ -0,0 +1,105 @@
/* ============================================================
* bootstrap-button.js v2.3.1
* http://twitter.github.com/bootstrap/javascript.html#buttons
* ============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function ($) {
"use strict"; // jshint ;_;
/* BUTTON PUBLIC CLASS DEFINITION
* ============================== */
var Button = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, $.fn.button.defaults, options)
}
Button.prototype.setState = function (state) {
var d = 'disabled'
, $el = this.$element
, data = $el.data()
, val = $el.is('input') ? 'val' : 'html'
state = state + 'Text'
data.resetText || $el.data('resetText', $el[val]())
$el[val](data[state] || this.options[state])
// push to event loop to allow forms to submit
setTimeout(function () {
state == 'loadingText' ?
$el.addClass(d).attr(d, d) :
$el.removeClass(d).removeAttr(d)
}, 0)
}
Button.prototype.toggle = function () {
var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
$parent && $parent
.find('.active')
.removeClass('active')
this.$element.toggleClass('active')
}
/* BUTTON PLUGIN DEFINITION
* ======================== */
var old = $.fn.button
$.fn.button = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('button')
, options = typeof option == 'object' && option
if (!data) $this.data('button', (data = new Button(this, options)))
if (option == 'toggle') data.toggle()
else if (option) data.setState(option)
})
}
$.fn.button.defaults = {
loadingText: 'loading...'
}
$.fn.button.Constructor = Button
/* BUTTON NO CONFLICT
* ================== */
$.fn.button.noConflict = function () {
$.fn.button = old
return this
}
/* BUTTON DATA-API
* =============== */
$(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
var $btn = $(e.target)
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
$btn.button('toggle')
})
}(window.jQuery);

207
public/js/bootstrap-carousel.js vendored Normal file
View File

@ -0,0 +1,207 @@
/* ==========================================================
* bootstrap-carousel.js v2.3.1
* http://twitter.github.com/bootstrap/javascript.html#carousel
* ==========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* CAROUSEL CLASS DEFINITION
* ========================= */
var Carousel = function (element, options) {
this.$element = $(element)
this.$indicators = this.$element.find('.carousel-indicators')
this.options = options
this.options.pause == 'hover' && this.$element
.on('mouseenter', $.proxy(this.pause, this))
.on('mouseleave', $.proxy(this.cycle, this))
}
Carousel.prototype = {
cycle: function (e) {
if (!e) this.paused = false
if (this.interval) clearInterval(this.interval);
this.options.interval
&& !this.paused
&& (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
return this
}
, getActiveIndex: function () {
this.$active = this.$element.find('.item.active')
this.$items = this.$active.parent().children()
return this.$items.index(this.$active)
}
, to: function (pos) {
var activeIndex = this.getActiveIndex()
, that = this
if (pos > (this.$items.length - 1) || pos < 0) return
if (this.sliding) {
return this.$element.one('slid', function () {
that.to(pos)
})
}
if (activeIndex == pos) {
return this.pause().cycle()
}
return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
}
, pause: function (e) {
if (!e) this.paused = true
if (this.$element.find('.next, .prev').length && $.support.transition.end) {
this.$element.trigger($.support.transition.end)
this.cycle(true)
}
clearInterval(this.interval)
this.interval = null
return this
}
, next: function () {
if (this.sliding) return
return this.slide('next')
}
, prev: function () {
if (this.sliding) return
return this.slide('prev')
}
, slide: function (type, next) {
var $active = this.$element.find('.item.active')
, $next = next || $active[type]()
, isCycling = this.interval
, direction = type == 'next' ? 'left' : 'right'
, fallback = type == 'next' ? 'first' : 'last'
, that = this
, e
this.sliding = true
isCycling && this.pause()
$next = $next.length ? $next : this.$element.find('.item')[fallback]()
e = $.Event('slide', {
relatedTarget: $next[0]
, direction: direction
})
if ($next.hasClass('active')) return
if (this.$indicators.length) {
this.$indicators.find('.active').removeClass('active')
this.$element.one('slid', function () {
var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
$nextIndicator && $nextIndicator.addClass('active')
})
}
if ($.support.transition && this.$element.hasClass('slide')) {
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
$next.addClass(type)
$next[0].offsetWidth // force reflow
$active.addClass(direction)
$next.addClass(direction)
this.$element.one($.support.transition.end, function () {
$next.removeClass([type, direction].join(' ')).addClass('active')
$active.removeClass(['active', direction].join(' '))
that.sliding = false
setTimeout(function () { that.$element.trigger('slid') }, 0)
})
} else {
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
$active.removeClass('active')
$next.addClass('active')
this.sliding = false
this.$element.trigger('slid')
}
isCycling && this.cycle()
return this
}
}
/* CAROUSEL PLUGIN DEFINITION
* ========================== */
var old = $.fn.carousel
$.fn.carousel = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('carousel')
, options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
, action = typeof option == 'string' ? option : options.slide
if (!data) $this.data('carousel', (data = new Carousel(this, options)))
if (typeof option == 'number') data.to(option)
else if (action) data[action]()
else if (options.interval) data.pause().cycle()
})
}
$.fn.carousel.defaults = {
interval: 5000
, pause: 'hover'
}
$.fn.carousel.Constructor = Carousel
/* CAROUSEL NO CONFLICT
* ==================== */
$.fn.carousel.noConflict = function () {
$.fn.carousel = old
return this
}
/* CAROUSEL DATA-API
* ================= */
$(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
var $this = $(this), href
, $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
, options = $.extend({}, $target.data(), $this.data())
, slideIndex
$target.carousel(options)
if (slideIndex = $this.attr('data-slide-to')) {
$target.data('carousel').pause().to(slideIndex).cycle()
}
e.preventDefault()
})
}(window.jQuery);

167
public/js/bootstrap-collapse.js vendored Normal file
View File

@ -0,0 +1,167 @@
/* =============================================================
* bootstrap-collapse.js v2.3.1
* http://twitter.github.com/bootstrap/javascript.html#collapse
* =============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function ($) {
"use strict"; // jshint ;_;
/* COLLAPSE PUBLIC CLASS DEFINITION
* ================================ */
var Collapse = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, $.fn.collapse.defaults, options)
if (this.options.parent) {
this.$parent = $(this.options.parent)
}
this.options.toggle && this.toggle()
}
Collapse.prototype = {
constructor: Collapse
, dimension: function () {
var hasWidth = this.$element.hasClass('width')
return hasWidth ? 'width' : 'height'
}
, show: function () {
var dimension
, scroll
, actives
, hasData
if (this.transitioning || this.$element.hasClass('in')) return
dimension = this.dimension()
scroll = $.camelCase(['scroll', dimension].join('-'))
actives = this.$parent && this.$parent.find('> .accordion-group > .in')
if (actives && actives.length) {
hasData = actives.data('collapse')
if (hasData && hasData.transitioning) return
actives.collapse('hide')
hasData || actives.data('collapse', null)
}
this.$element[dimension](0)
this.transition('addClass', $.Event('show'), 'shown')
$.support.transition && this.$element[dimension](this.$element[0][scroll])
}
, hide: function () {
var dimension
if (this.transitioning || !this.$element.hasClass('in')) return
dimension = this.dimension()
this.reset(this.$element[dimension]())
this.transition('removeClass', $.Event('hide'), 'hidden')
this.$element[dimension](0)
}
, reset: function (size) {
var dimension = this.dimension()
this.$element
.removeClass('collapse')
[dimension](size || 'auto')
[0].offsetWidth
this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
return this
}
, transition: function (method, startEvent, completeEvent) {
var that = this
, complete = function () {
if (startEvent.type == 'show') that.reset()
that.transitioning = 0
that.$element.trigger(completeEvent)
}
this.$element.trigger(startEvent)
if (startEvent.isDefaultPrevented()) return
this.transitioning = 1
this.$element[method]('in')
$.support.transition && this.$element.hasClass('collapse') ?
this.$element.one($.support.transition.end, complete) :
complete()
}
, toggle: function () {
this[this.$element.hasClass('in') ? 'hide' : 'show']()
}
}
/* COLLAPSE PLUGIN DEFINITION
* ========================== */
var old = $.fn.collapse
$.fn.collapse = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('collapse')
, options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('collapse', (data = new Collapse(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.collapse.defaults = {
toggle: true
}
$.fn.collapse.Constructor = Collapse
/* COLLAPSE NO CONFLICT
* ==================== */
$.fn.collapse.noConflict = function () {
$.fn.collapse = old
return this
}
/* COLLAPSE DATA-API
* ================= */
$(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
var $this = $(this), href
, target = $this.attr('data-target')
|| e.preventDefault()
|| (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
, option = $(target).data('collapse') ? 'toggle' : $this.data()
$this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
$(target).collapse(option)
})
}(window.jQuery);

165
public/js/bootstrap-dropdown.js vendored Normal file
View File

@ -0,0 +1,165 @@
/* ============================================================
* bootstrap-dropdown.js v2.3.1
* http://twitter.github.com/bootstrap/javascript.html#dropdowns
* ============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function ($) {
"use strict"; // jshint ;_;
/* DROPDOWN CLASS DEFINITION
* ========================= */
var toggle = '[data-toggle=dropdown]'
, Dropdown = function (element) {
var $el = $(element).on('click.dropdown.data-api', this.toggle)
$('html').on('click.dropdown.data-api', function () {
$el.parent().removeClass('open')
})
}
Dropdown.prototype = {
constructor: Dropdown
, toggle: function (e) {
var $this = $(this)
, $parent
, isActive
if ($this.is('.disabled, :disabled')) return
$parent = getParent($this)
isActive = $parent.hasClass('open')
clearMenus()
if (!isActive) {
$parent.toggleClass('open')
}
$this.focus()
return false
}
, keydown: function (e) {
var $this
, $items
, $active
, $parent
, isActive
, index
if (!/(38|40|27)/.test(e.keyCode)) return
$this = $(this)
e.preventDefault()
e.stopPropagation()
if ($this.is('.disabled, :disabled')) return
$parent = getParent($this)
isActive = $parent.hasClass('open')
if (!isActive || (isActive && e.keyCode == 27)) {
if (e.which == 27) $parent.find(toggle).focus()
return $this.click()
}
$items = $('[role=menu] li:not(.divider):visible a', $parent)
if (!$items.length) return
index = $items.index($items.filter(':focus'))
if (e.keyCode == 38 && index > 0) index-- // up
if (e.keyCode == 40 && index < $items.length - 1) index++ // down
if (!~index) index = 0
$items
.eq(index)
.focus()
}
}
function clearMenus() {
$(toggle).each(function () {
getParent($(this)).removeClass('open')
})
}
function getParent($this) {
var selector = $this.attr('data-target')
, $parent
if (!selector) {
selector = $this.attr('href')
selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
}
$parent = selector && $(selector)
if (!$parent || !$parent.length) $parent = $this.parent()
return $parent
}
/* DROPDOWN PLUGIN DEFINITION
* ========================== */
var old = $.fn.dropdown
$.fn.dropdown = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('dropdown')
if (!data) $this.data('dropdown', (data = new Dropdown(this)))
if (typeof option == 'string') data[option].call($this)
})
}
$.fn.dropdown.Constructor = Dropdown
/* DROPDOWN NO CONFLICT
* ==================== */
$.fn.dropdown.noConflict = function () {
$.fn.dropdown = old
return this
}
/* APPLY TO STANDARD DROPDOWN ELEMENTS
* =================================== */
$(document)
.on('click.dropdown.data-api', clearMenus)
.on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
.on('click.dropdown-menu', function (e) { e.stopPropagation() })
.on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
.on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
}(window.jQuery);

247
public/js/bootstrap-modal.js vendored Normal file
View File

@ -0,0 +1,247 @@
/* =========================================================
* bootstrap-modal.js v2.3.1
* http://twitter.github.com/bootstrap/javascript.html#modals
* =========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================= */
!function ($) {
"use strict"; // jshint ;_;
/* MODAL CLASS DEFINITION
* ====================== */
var Modal = function (element, options) {
this.options = options
this.$element = $(element)
.delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
}
Modal.prototype = {
constructor: Modal
, toggle: function () {
return this[!this.isShown ? 'show' : 'hide']()
}
, show: function () {
var that = this
, e = $.Event('show')
this.$element.trigger(e)
if (this.isShown || e.isDefaultPrevented()) return
this.isShown = true
this.escape()
this.backdrop(function () {
var transition = $.support.transition && that.$element.hasClass('fade')
if (!that.$element.parent().length) {
that.$element.appendTo(document.body) //don't move modals dom position
}
that.$element.show()
if (transition) {
that.$element[0].offsetWidth // force reflow
}
that.$element
.addClass('in')
.attr('aria-hidden', false)
that.enforceFocus()
transition ?
that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
that.$element.focus().trigger('shown')
})
}
, hide: function (e) {
e && e.preventDefault()
var that = this
e = $.Event('hide')
this.$element.trigger(e)
if (!this.isShown || e.isDefaultPrevented()) return
this.isShown = false
this.escape()
$(document).off('focusin.modal')
this.$element
.removeClass('in')
.attr('aria-hidden', true)
$.support.transition && this.$element.hasClass('fade') ?
this.hideWithTransition() :
this.hideModal()
}
, enforceFocus: function () {
var that = this
$(document).on('focusin.modal', function (e) {
if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
that.$element.focus()
}
})
}
, escape: function () {
var that = this
if (this.isShown && this.options.keyboard) {
this.$element.on('keyup.dismiss.modal', function ( e ) {
e.which == 27 && that.hide()
})
} else if (!this.isShown) {
this.$element.off('keyup.dismiss.modal')
}
}
, hideWithTransition: function () {
var that = this
, timeout = setTimeout(function () {
that.$element.off($.support.transition.end)
that.hideModal()
}, 500)
this.$element.one($.support.transition.end, function () {
clearTimeout(timeout)
that.hideModal()
})
}
, hideModal: function () {
var that = this
this.$element.hide()
this.backdrop(function () {
that.removeBackdrop()
that.$element.trigger('hidden')
})
}
, removeBackdrop: function () {
this.$backdrop && this.$backdrop.remove()
this.$backdrop = null
}
, backdrop: function (callback) {
var that = this
, animate = this.$element.hasClass('fade') ? 'fade' : ''
if (this.isShown && this.options.backdrop) {
var doAnimate = $.support.transition && animate
this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
.appendTo(document.body)
this.$backdrop.click(
this.options.backdrop == 'static' ?
$.proxy(this.$element[0].focus, this.$element[0])
: $.proxy(this.hide, this)
)
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
this.$backdrop.addClass('in')
if (!callback) return
doAnimate ?
this.$backdrop.one($.support.transition.end, callback) :
callback()
} else if (!this.isShown && this.$backdrop) {
this.$backdrop.removeClass('in')
$.support.transition && this.$element.hasClass('fade')?
this.$backdrop.one($.support.transition.end, callback) :
callback()
} else if (callback) {
callback()
}
}
}
/* MODAL PLUGIN DEFINITION
* ======================= */
var old = $.fn.modal
$.fn.modal = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('modal')
, options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('modal', (data = new Modal(this, options)))
if (typeof option == 'string') data[option]()
else if (options.show) data.show()
})
}
$.fn.modal.defaults = {
backdrop: true
, keyboard: true
, show: true
}
$.fn.modal.Constructor = Modal
/* MODAL NO CONFLICT
* ================= */
$.fn.modal.noConflict = function () {
$.fn.modal = old
return this
}
/* MODAL DATA-API
* ============== */
$(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
var $this = $(this)
, href = $this.attr('href')
, $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
, option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
e.preventDefault()
$target
.modal(option)
.one('hide', function () {
$this.focus()
})
})
}(window.jQuery);

114
public/js/bootstrap-popover.js vendored Normal file
View File

@ -0,0 +1,114 @@
/* ===========================================================
* bootstrap-popover.js v2.3.1
* http://twitter.github.com/bootstrap/javascript.html#popovers
* ===========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* POPOVER PUBLIC CLASS DEFINITION
* =============================== */
var Popover = function (element, options) {
this.init('popover', element, options)
}
/* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
========================================== */
Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
constructor: Popover
, setContent: function () {
var $tip = this.tip()
, title = this.getTitle()
, content = this.getContent()
$tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
$tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
$tip.removeClass('fade top bottom left right in')
}
, hasContent: function () {
return this.getTitle() || this.getContent()
}
, getContent: function () {
var content
, $e = this.$element
, o = this.options
content = (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
|| $e.attr('data-content')
return content
}
, tip: function () {
if (!this.$tip) {
this.$tip = $(this.options.template)
}
return this.$tip
}
, destroy: function () {
this.hide().$element.off('.' + this.type).removeData(this.type)
}
})
/* POPOVER PLUGIN DEFINITION
* ======================= */
var old = $.fn.popover
$.fn.popover = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('popover')
, options = typeof option == 'object' && option
if (!data) $this.data('popover', (data = new Popover(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.popover.Constructor = Popover
$.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
placement: 'right'
, trigger: 'click'
, content: ''
, template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
})
/* POPOVER NO CONFLICT
* =================== */
$.fn.popover.noConflict = function () {
$.fn.popover = old
return this
}
}(window.jQuery);

162
public/js/bootstrap-scrollspy.js vendored Normal file
View File

@ -0,0 +1,162 @@
/* =============================================================
* bootstrap-scrollspy.js v2.3.1
* http://twitter.github.com/bootstrap/javascript.html#scrollspy
* =============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* SCROLLSPY CLASS DEFINITION
* ========================== */
function ScrollSpy(element, options) {
var process = $.proxy(this.process, this)
, $element = $(element).is('body') ? $(window) : $(element)
, href
this.options = $.extend({}, $.fn.scrollspy.defaults, options)
this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
this.selector = (this.options.target
|| ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
|| '') + ' .nav li > a'
this.$body = $('body')
this.refresh()
this.process()
}
ScrollSpy.prototype = {
constructor: ScrollSpy
, refresh: function () {
var self = this
, $targets
this.offsets = $([])
this.targets = $([])
$targets = this.$body
.find(this.selector)
.map(function () {
var $el = $(this)
, href = $el.data('target') || $el.attr('href')
, $href = /^#\w/.test(href) && $(href)
return ( $href
&& $href.length
&& [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null
})
.sort(function (a, b) { return a[0] - b[0] })
.each(function () {
self.offsets.push(this[0])
self.targets.push(this[1])
})
}
, process: function () {
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
, scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
, maxScroll = scrollHeight - this.$scrollElement.height()
, offsets = this.offsets
, targets = this.targets
, activeTarget = this.activeTarget
, i
if (scrollTop >= maxScroll) {
return activeTarget != (i = targets.last()[0])
&& this.activate ( i )
}
for (i = offsets.length; i--;) {
activeTarget != targets[i]
&& scrollTop >= offsets[i]
&& (!offsets[i + 1] || scrollTop <= offsets[i + 1])
&& this.activate( targets[i] )
}
}
, activate: function (target) {
var active
, selector
this.activeTarget = target
$(this.selector)
.parent('.active')
.removeClass('active')
selector = this.selector
+ '[data-target="' + target + '"],'
+ this.selector + '[href="' + target + '"]'
active = $(selector)
.parent('li')
.addClass('active')
if (active.parent('.dropdown-menu').length) {
active = active.closest('li.dropdown').addClass('active')
}
active.trigger('activate')
}
}
/* SCROLLSPY PLUGIN DEFINITION
* =========================== */
var old = $.fn.scrollspy
$.fn.scrollspy = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('scrollspy')
, options = typeof option == 'object' && option
if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.scrollspy.Constructor = ScrollSpy
$.fn.scrollspy.defaults = {
offset: 10
}
/* SCROLLSPY NO CONFLICT
* ===================== */
$.fn.scrollspy.noConflict = function () {
$.fn.scrollspy = old
return this
}
/* SCROLLSPY DATA-API
* ================== */
$(window).on('load', function () {
$('[data-spy="scroll"]').each(function () {
var $spy = $(this)
$spy.scrollspy($spy.data())
})
})
}(window.jQuery);

144
public/js/bootstrap-tab.js vendored Normal file
View File

@ -0,0 +1,144 @@
/* ========================================================
* bootstrap-tab.js v2.3.1
* http://twitter.github.com/bootstrap/javascript.html#tabs
* ========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ======================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* TAB CLASS DEFINITION
* ==================== */
var Tab = function (element) {
this.element = $(element)
}
Tab.prototype = {
constructor: Tab
, show: function () {
var $this = this.element
, $ul = $this.closest('ul:not(.dropdown-menu)')
, selector = $this.attr('data-target')
, previous
, $target
, e
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
}
if ( $this.parent('li').hasClass('active') ) return
previous = $ul.find('.active:last a')[0]
e = $.Event('show', {
relatedTarget: previous
})
$this.trigger(e)
if (e.isDefaultPrevented()) return
$target = $(selector)
this.activate($this.parent('li'), $ul)
this.activate($target, $target.parent(), function () {
$this.trigger({
type: 'shown'
, relatedTarget: previous
})
})
}
, activate: function ( element, container, callback) {
var $active = container.find('> .active')
, transition = callback
&& $.support.transition
&& $active.hasClass('fade')
function next() {
$active
.removeClass('active')
.find('> .dropdown-menu > .active')
.removeClass('active')
element.addClass('active')
if (transition) {
element[0].offsetWidth // reflow for transition
element.addClass('in')
} else {
element.removeClass('fade')
}
if ( element.parent('.dropdown-menu') ) {
element.closest('li.dropdown').addClass('active')
}
callback && callback()
}
transition ?
$active.one($.support.transition.end, next) :
next()
$active.removeClass('in')
}
}
/* TAB PLUGIN DEFINITION
* ===================== */
var old = $.fn.tab
$.fn.tab = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('tab')
if (!data) $this.data('tab', (data = new Tab(this)))
if (typeof option == 'string') data[option]()
})
}
$.fn.tab.Constructor = Tab
/* TAB NO CONFLICT
* =============== */
$.fn.tab.noConflict = function () {
$.fn.tab = old
return this
}
/* TAB DATA-API
* ============ */
$(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
e.preventDefault()
$(this).tab('show')
})
}(window.jQuery);

361
public/js/bootstrap-tooltip.js vendored Normal file
View File

@ -0,0 +1,361 @@
/* ===========================================================
* bootstrap-tooltip.js v2.3.1
* http://twitter.github.com/bootstrap/javascript.html#tooltips
* Inspired by the original jQuery.tipsy by Jason Frame
* ===========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* TOOLTIP PUBLIC CLASS DEFINITION
* =============================== */
var Tooltip = function (element, options) {
this.init('tooltip', element, options)
}
Tooltip.prototype = {
constructor: Tooltip
, init: function (type, element, options) {
var eventIn
, eventOut
, triggers
, trigger
, i
this.type = type
this.$element = $(element)
this.options = this.getOptions(options)
this.enabled = true
triggers = this.options.trigger.split(' ')
for (i = triggers.length; i--;) {
trigger = triggers[i]
if (trigger == 'click') {
this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
} else if (trigger != 'manual') {
eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
}
}
this.options.selector ?
(this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
this.fixTitle()
}
, getOptions: function (options) {
options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)
if (options.delay && typeof options.delay == 'number') {
options.delay = {
show: options.delay
, hide: options.delay
}
}
return options
}
, enter: function (e) {
var defaults = $.fn[this.type].defaults
, options = {}
, self
this._options && $.each(this._options, function (key, value) {
if (defaults[key] != value) options[key] = value
}, this)
self = $(e.currentTarget)[this.type](options).data(this.type)
if (!self.options.delay || !self.options.delay.show) return self.show()
clearTimeout(this.timeout)
self.hoverState = 'in'
this.timeout = setTimeout(function() {
if (self.hoverState == 'in') self.show()
}, self.options.delay.show)
}
, leave: function (e) {
var self = $(e.currentTarget)[this.type](this._options).data(this.type)
if (this.timeout) clearTimeout(this.timeout)
if (!self.options.delay || !self.options.delay.hide) return self.hide()
self.hoverState = 'out'
this.timeout = setTimeout(function() {
if (self.hoverState == 'out') self.hide()
}, self.options.delay.hide)
}
, show: function () {
var $tip
, pos
, actualWidth
, actualHeight
, placement
, tp
, e = $.Event('show')
if (this.hasContent() && this.enabled) {
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
$tip = this.tip()
this.setContent()
if (this.options.animation) {
$tip.addClass('fade')
}
placement = typeof this.options.placement == 'function' ?
this.options.placement.call(this, $tip[0], this.$element[0]) :
this.options.placement
$tip
.detach()
.css({ top: 0, left: 0, display: 'block' })
this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
pos = this.getPosition()
actualWidth = $tip[0].offsetWidth
actualHeight = $tip[0].offsetHeight
switch (placement) {
case 'bottom':
tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
break
case 'top':
tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
break
case 'left':
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
break
case 'right':
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
break
}
this.applyPlacement(tp, placement)
this.$element.trigger('shown')
}
}
, applyPlacement: function(offset, placement){
var $tip = this.tip()
, width = $tip[0].offsetWidth
, height = $tip[0].offsetHeight
, actualWidth
, actualHeight
, delta
, replace
$tip
.offset(offset)
.addClass(placement)
.addClass('in')
actualWidth = $tip[0].offsetWidth
actualHeight = $tip[0].offsetHeight
if (placement == 'top' && actualHeight != height) {
offset.top = offset.top + height - actualHeight
replace = true
}
if (placement == 'bottom' || placement == 'top') {
delta = 0
if (offset.left < 0){
delta = offset.left * -2
offset.left = 0
$tip.offset(offset)
actualWidth = $tip[0].offsetWidth
actualHeight = $tip[0].offsetHeight
}
this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
} else {
this.replaceArrow(actualHeight - height, actualHeight, 'top')
}
if (replace) $tip.offset(offset)
}
, replaceArrow: function(delta, dimension, position){
this
.arrow()
.css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
}
, setContent: function () {
var $tip = this.tip()
, title = this.getTitle()
$tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
$tip.removeClass('fade in top bottom left right')
}
, hide: function () {
var that = this
, $tip = this.tip()
, e = $.Event('hide')
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
$tip.removeClass('in')
function removeWithAnimation() {
var timeout = setTimeout(function () {
$tip.off($.support.transition.end).detach()
}, 500)
$tip.one($.support.transition.end, function () {
clearTimeout(timeout)
$tip.detach()
})
}
$.support.transition && this.$tip.hasClass('fade') ?
removeWithAnimation() :
$tip.detach()
this.$element.trigger('hidden')
return this
}
, fixTitle: function () {
var $e = this.$element
if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
$e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
}
}
, hasContent: function () {
return this.getTitle()
}
, getPosition: function () {
var el = this.$element[0]
return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
width: el.offsetWidth
, height: el.offsetHeight
}, this.$element.offset())
}
, getTitle: function () {
var title
, $e = this.$element
, o = this.options
title = $e.attr('data-original-title')
|| (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
return title
}
, tip: function () {
return this.$tip = this.$tip || $(this.options.template)
}
, arrow: function(){
return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
}
, validate: function () {
if (!this.$element[0].parentNode) {
this.hide()
this.$element = null
this.options = null
}
}
, enable: function () {
this.enabled = true
}
, disable: function () {
this.enabled = false
}
, toggleEnabled: function () {
this.enabled = !this.enabled
}
, toggle: function (e) {
var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this
self.tip().hasClass('in') ? self.hide() : self.show()
}
, destroy: function () {
this.hide().$element.off('.' + this.type).removeData(this.type)
}
}
/* TOOLTIP PLUGIN DEFINITION
* ========================= */
var old = $.fn.tooltip
$.fn.tooltip = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('tooltip')
, options = typeof option == 'object' && option
if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.tooltip.Constructor = Tooltip
$.fn.tooltip.defaults = {
animation: true
, placement: 'top'
, selector: false
, template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
, trigger: 'hover focus'
, title: ''
, delay: 0
, html: false
, container: false
}
/* TOOLTIP NO CONFLICT
* =================== */
$.fn.tooltip.noConflict = function () {
$.fn.tooltip = old
return this
}
}(window.jQuery);

60
public/js/bootstrap-transition.js vendored Normal file
View File

@ -0,0 +1,60 @@
/* ===================================================
* bootstrap-transition.js v2.3.1
* http://twitter.github.com/bootstrap/javascript.html#transitions
* ===================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
* ======================================================= */
$(function () {
$.support.transition = (function () {
var transitionEnd = (function () {
var el = document.createElement('bootstrap')
, transEndEventNames = {
'WebkitTransition' : 'webkitTransitionEnd'
, 'MozTransition' : 'transitionend'
, 'OTransition' : 'oTransitionEnd otransitionend'
, 'transition' : 'transitionend'
}
, name
for (name in transEndEventNames){
if (el.style[name] !== undefined) {
return transEndEventNames[name]
}
}
}())
return transitionEnd && {
end: transitionEnd
}
})()
})
}(window.jQuery);

335
public/js/bootstrap-typeahead.js vendored Normal file
View File

@ -0,0 +1,335 @@
/* =============================================================
* bootstrap-typeahead.js v2.3.1
* http://twitter.github.com/bootstrap/javascript.html#typeahead
* =============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function($){
"use strict"; // jshint ;_;
/* TYPEAHEAD PUBLIC CLASS DEFINITION
* ================================= */
var Typeahead = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, $.fn.typeahead.defaults, options)
this.matcher = this.options.matcher || this.matcher
this.sorter = this.options.sorter || this.sorter
this.highlighter = this.options.highlighter || this.highlighter
this.updater = this.options.updater || this.updater
this.source = this.options.source
this.$menu = $(this.options.menu)
this.shown = false
this.listen()
}
Typeahead.prototype = {
constructor: Typeahead
, select: function () {
var val = this.$menu.find('.active').attr('data-value')
this.$element
.val(this.updater(val))
.change()
return this.hide()
}
, updater: function (item) {
return item
}
, show: function () {
var pos = $.extend({}, this.$element.position(), {
height: this.$element[0].offsetHeight
})
this.$menu
.insertAfter(this.$element)
.css({
top: pos.top + pos.height
, left: pos.left
})
.show()
this.shown = true
return this
}
, hide: function () {
this.$menu.hide()
this.shown = false
return this
}
, lookup: function (event) {
var items
this.query = this.$element.val()
if (!this.query || this.query.length < this.options.minLength) {
return this.shown ? this.hide() : this
}
items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
return items ? this.process(items) : this
}
, process: function (items) {
var that = this
items = $.grep(items, function (item) {
return that.matcher(item)
})
items = this.sorter(items)
if (!items.length) {
return this.shown ? this.hide() : this
}
return this.render(items.slice(0, this.options.items)).show()
}
, matcher: function (item) {
return ~item.toLowerCase().indexOf(this.query.toLowerCase())
}
, sorter: function (items) {
var beginswith = []
, caseSensitive = []
, caseInsensitive = []
, item
while (item = items.shift()) {
if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
else if (~item.indexOf(this.query)) caseSensitive.push(item)
else caseInsensitive.push(item)
}
return beginswith.concat(caseSensitive, caseInsensitive)
}
, highlighter: function (item) {
var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
return '<strong>' + match + '</strong>'
})
}
, render: function (items) {
var that = this
items = $(items).map(function (i, item) {
i = $(that.options.item).attr('data-value', item)
i.find('a').html(that.highlighter(item))
return i[0]
})
items.first().addClass('active')
this.$menu.html(items)
return this
}
, next: function (event) {
var active = this.$menu.find('.active').removeClass('active')
, next = active.next()
if (!next.length) {
next = $(this.$menu.find('li')[0])
}
next.addClass('active')
}
, prev: function (event) {
var active = this.$menu.find('.active').removeClass('active')
, prev = active.prev()
if (!prev.length) {
prev = this.$menu.find('li').last()
}
prev.addClass('active')
}
, listen: function () {
this.$element
.on('focus', $.proxy(this.focus, this))
.on('blur', $.proxy(this.blur, this))
.on('keypress', $.proxy(this.keypress, this))
.on('keyup', $.proxy(this.keyup, this))
if (this.eventSupported('keydown')) {
this.$element.on('keydown', $.proxy(this.keydown, this))
}
this.$menu
.on('click', $.proxy(this.click, this))
.on('mouseenter', 'li', $.proxy(this.mouseenter, this))
.on('mouseleave', 'li', $.proxy(this.mouseleave, this))
}
, eventSupported: function(eventName) {
var isSupported = eventName in this.$element
if (!isSupported) {
this.$element.setAttribute(eventName, 'return;')
isSupported = typeof this.$element[eventName] === 'function'
}
return isSupported
}
, move: function (e) {
if (!this.shown) return
switch(e.keyCode) {
case 9: // tab
case 13: // enter
case 27: // escape
e.preventDefault()
break
case 38: // up arrow
e.preventDefault()
this.prev()
break
case 40: // down arrow
e.preventDefault()
this.next()
break
}
e.stopPropagation()
}
, keydown: function (e) {
this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
this.move(e)
}
, keypress: function (e) {
if (this.suppressKeyPressRepeat) return
this.move(e)
}
, keyup: function (e) {
switch(e.keyCode) {
case 40: // down arrow
case 38: // up arrow
case 16: // shift
case 17: // ctrl
case 18: // alt
break
case 9: // tab
case 13: // enter
if (!this.shown) return
this.select()
break
case 27: // escape
if (!this.shown) return
this.hide()
break
default:
this.lookup()
}
e.stopPropagation()
e.preventDefault()
}
, focus: function (e) {
this.focused = true
}
, blur: function (e) {
this.focused = false
if (!this.mousedover && this.shown) this.hide()
}
, click: function (e) {
e.stopPropagation()
e.preventDefault()
this.select()
this.$element.focus()
}
, mouseenter: function (e) {
this.mousedover = true
this.$menu.find('.active').removeClass('active')
$(e.currentTarget).addClass('active')
}
, mouseleave: function (e) {
this.mousedover = false
if (!this.focused && this.shown) this.hide()
}
}
/* TYPEAHEAD PLUGIN DEFINITION
* =========================== */
var old = $.fn.typeahead
$.fn.typeahead = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('typeahead')
, options = typeof option == 'object' && option
if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.typeahead.defaults = {
source: []
, items: 8
, menu: '<ul class="typeahead dropdown-menu"></ul>'
, item: '<li><a href="#"></a></li>'
, minLength: 1
}
$.fn.typeahead.Constructor = Typeahead
/* TYPEAHEAD NO CONFLICT
* =================== */
$.fn.typeahead.noConflict = function () {
$.fn.typeahead = old
return this
}
/* TYPEAHEAD DATA-API
* ================== */
$(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
var $this = $(this)
if ($this.data('typeahead')) return
$this.typeahead($this.data())
})
}(window.jQuery);

2386
public/js/bootstrap.js vendored Normal file

File diff suppressed because it is too large Load Diff

6
public/js/bootstrap.min.js vendored Normal file

File diff suppressed because one or more lines are too long

8
public/js/html5shiv.js vendored Normal file
View File

@ -0,0 +1,8 @@
/*
HTML5 Shiv v3.6.2pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x<style>article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}</style>";
c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||
"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",version:"3.6.2pre",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment();
for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);

5
public/js/jquery.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,132 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<div class="row-fluid navmargin">
<div class="page-header">
<h1>Can I haz ur dataz - Fri, Feb 1, 2019</h1>
</div>
<p class="lead"></p>
<h2 id="remote-data-acquisitions-over-ssh">Remote data acquisitions over ssh</h2>
<p>To get your data trough <code>ssh</code> to your local storage, you simply use pipes. It does not matter if you use <code>cat</code>, <code>dd</code> or any other command line tool which outputs the data on standard output (<em>stdout</em>).</p>
<h3 id="using-cat">Using <code>cat</code></h3>
<p>When using cat the there is no need to add any additional parameters in your command chain. A simple <code>cat &lt;input&gt;</code> will suffice.</p>
<p><code>Cat</code> does not have any progress information during read operations.</p>
<h3 id="using-dd">Using <code>dd</code></h3>
<p>The program <code>dd</code> requires more user interaction during the setup phase. To use <code>dd</code> you have to give the <em>if=</em> argument. The use of different blocksizes (<em>bs</em>) will not have that much of an impact on the speed. Feel free to have a look at this <a href="https://goatpr0n.farm/2019/01/23/what-if-the-cult-of-dd-is-right/">this</a>.</p>
<p><img src="https://dl.goatpr0n.events/$/VAN9L" alt=""></p>
<p><em>Wow. So scientific! Much CLI.</em></p>
<h2 id="examples">Examples</h2>
<p>A simple example with no output to the terminal except of errors. The output to <em>stderr</em> is not suppressed.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ <span style="color:#75715e"># Using cat to copy /dev/sda</span>
$ ssh &lt;user@remotehost&gt; <span style="color:#e6db74">&#39;cat /dev/sda&#39;</span> &gt; sda.raw
</code></pre></div><p>If you want to suppress errors, use:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ <span style="color:#75715e"># Using cat to copy /dev/sda</span>
$ ssh &lt;user@remotehost&gt; <span style="color:#e6db74">&#39;cat /dev/sda 2&gt;/dev/null&#39;</span> &gt; sda.raw
</code></pre></div><p>The next example will demonstrate the use of <code>dd</code>.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ <span style="color:#75715e"># Using dd to copy /dev/sda</span>
$ ssh &lt;user@remotehost&gt; <span style="color:#e6db74">&#39;dd if=/dev/sda&#39;</span> &gt; sda.raw
</code></pre></div><p>Of course you can suppress errors as well.</p>
<h2 id="speeding-up-the-data-acquisition-and-minor-tweaks">Speeding up the data acquisition and minor tweaks</h2>
<p>With the basics covered, we can begin optimizing our data transfer. In the first step we speed up the transfer with <code>gzip</code>.</p>
<p>The argument <em>-c</em> will write the compressed data to <em>stdout</em> which will be piped to your local system.</p>
<p>Of course you can use this with <code>cat</code> as well.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ ssh &lt;user@remotehost&gt; <span style="color:#e6db74">&#39;dd if=/dev/sda | gzip -c&#39;</span> | gunzip &gt; sda.raw
</code></pre></div><p>To add some progress information, you have two options with <code>dd</code>.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ <span style="color:#75715e"># dd status</span>
$ ssh &lt;user@remotehost&gt; <span style="color:#e6db74">&#39;dd if=/dev/sda status=progress | gzip -c&#39;</span> <span style="color:#ae81ff">\
</span><span style="color:#ae81ff"></span>&gt; | gunzip &gt; sda.raw
</code></pre></div><p>The <em>status</em> argument writes the output to <em>stderr</em> and will not end up in your local copy.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ <span style="color:#75715e"># dd through pv</span>
$ ssh &lt;user@remotehost&gt; <span style="color:#e6db74">&#39;dd if=/dev/sda | gzip -c&#39;</span> <span style="color:#ae81ff">\
</span><span style="color:#ae81ff"></span>&gt; | pv | gunzip &gt; sda.raw
</code></pre></div><p><code>Pv</code> needs to be installed separatly. Check your packet manager. 0r teh Googlez!</p>
<p>KTHXBYE.</p>
<h4 id="update-01">Update #01</h4>
<p>Fixed a problem within the examples. Had a pipe too much. #Fail</p>
<h4><a href="https://goatpr0n.farm/">Back to Home</a></h4>
</div>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,468 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<div class="row-fluid navmargin">
<div class="page-header">
<h1>Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com - Wed, Jul 24, 2019</h1>
</div>
<p class="lead"></p>
<p><em>#MemeFreeEdition</em></p>
<h2 id="the-challenge">The Challenge</h2>
<p>You are provided a zip file containing two files.</p>
<ul>
<li><code>program</code></li>
<li><code>vm.py</code></li>
</ul>
<p>The file <code>program</code> contains instructions encoded as emojis for a virtual machine called <code>vm.py</code>. At the bottom of <code>vm.py</code> I found a list, or lets call it a translation table, with emojis and their function name counter part.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"> OPERATIONS <span style="color:#f92672">=</span> {
<span style="color:#e6db74">&#39;🍡&#39;</span>: add,
<span style="color:#e6db74">&#39;🤡&#39;</span>: clone,
<span style="color:#e6db74">&#39;📐&#39;</span>: divide,
<span style="color:#e6db74">&#39;😲&#39;</span>: if_zero,
<span style="color:#e6db74">&#39;😄&#39;</span>: if_not_zero,
<span style="color:#e6db74">&#39;🏀&#39;</span>: jump_to,
<span style="color:#e6db74">&#39;🚛&#39;</span>: load,
<span style="color:#e6db74">&#39;📬&#39;</span>: modulo,
<span style="color:#e6db74">&#39;&#39;</span>: multiply,
<span style="color:#e6db74">&#39;🍿&#39;</span>: pop,
<span style="color:#e6db74">&#39;📤&#39;</span>: pop_out,
<span style="color:#e6db74">&#39;🎤&#39;</span>: print_top,
<span style="color:#e6db74">&#39;📥&#39;</span>: push,
<span style="color:#e6db74">&#39;🔪&#39;</span>: sub,
<span style="color:#e6db74">&#39;🌓&#39;</span>: xor,
<span style="color:#e6db74">&#39;&#39;</span>: jump_top,
<span style="color:#e6db74">&#39;&#39;</span>: exit
}
</code></pre></div><p>To execute <code>program</code> with <code>vm.py</code> I ran:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ python vm.py program
http://^C
</code></pre></div><p>The program started printing letters to the terminal, but became horribly slow, until I decided to terminate the execution. So the challenge seemed to be, to convince <code>program</code> to give me its secret. With the first characters looking like an URL, the flag might be hidden within the URL or on the website the URL pointing to.</p>
<p>In which way I had to convince the program to reveal its secrets to me, I had yet to decide. One way could be to optimize the VM code, the other might be optimizing the code of <code>program</code>.</p>
<h2 id="the-solutions">The Solution(s)</h2>
<h3 id="solving-the-challenge-trail-and-error">Solving the Challenge: Trail and Error</h3>
<p>The python script <code>vm.py</code> defines a class named <code>VM</code> with the following constructor:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#66d9ef">def</span> <span style="color:#f92672">**</span>init<span style="color:#f92672">**</span>(self, rom):
self<span style="color:#f92672">.</span>rom <span style="color:#f92672">=</span> rom
self<span style="color:#f92672">.</span>accumulator1 <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
self<span style="color:#f92672">.</span>accumulator2 <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
self<span style="color:#f92672">.</span>instruction_pointer <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>
self<span style="color:#f92672">.</span>stack <span style="color:#f92672">=</span> \[\]
</code></pre></div><p>The VM stores the program code in the variable <code>self.rom</code>. It is filled on creation by reading the source file (<code>program</code>) given as argument. The source is stored as a list (returned by <code>.read().split()</code> of a <code>file</code> object). Two accumulator registers, <code>self.accumulator1</code> and <code>self.accumulator2</code>, are initialized with &lsquo;0&rsquo;. A third register is the <code>self.instruction_pointer</code>, it will the the VM which operation in <code>self.rom</code> will be executed next. It starts at &lsquo;1&rsquo; and not at &lsquo;0&rsquo;. The list containing the rom is initialized with an empty string (<code>['']</code>) and then extended by the program code. The last variable is <code>self.stack</code> which is empty list.</p>
<p>Lists in Python can be used as a stack like structure. With <code>list.append()</code> (<code>push</code>) and <code>list.pop()</code> (<code>pop</code>) the behavior of these data structures is identical.</p>
<p>I decided to translate the emoji code of <code>program</code> into a more human readable version as a beginning. A dictionary of all operations is at the bottom of the code.</p>
<p>The first version of my script did not translate all emojis in the code. I started digging around further in <code>vm.py</code> to find some more emojis I had to consider. As a result a almost completely emoji free version of the program could be generated. The &ldquo;final&rdquo; version of my script <a href="https://git.goatpr0n.de/snippets/4">emoji2mnemonic.py</a> had the following dictionary to translate <code>program</code>.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"> OPERATIONS <span style="color:#f92672">=</span> {
<span style="color:#e6db74">&#39;🍡&#39;</span>: <span style="color:#e6db74">&#39;add&#39;</span>,
<span style="color:#e6db74">&#39;🤡&#39;</span>: <span style="color:#e6db74">&#39;clone&#39;</span>,
<span style="color:#e6db74">&#39;📐&#39;</span>: <span style="color:#e6db74">&#39;divide&#39;</span>,
<span style="color:#e6db74">&#39;😲&#39;</span>: <span style="color:#e6db74">&#39;if_zero&#39;</span>,
<span style="color:#e6db74">&#39;😄&#39;</span>: <span style="color:#e6db74">&#39;if_not_zero&#39;</span>,
<span style="color:#e6db74">&#39;🏀&#39;</span>: <span style="color:#e6db74">&#39;jump_to&#39;</span>,
<span style="color:#e6db74">&#39;🚛&#39;</span>: <span style="color:#e6db74">&#39;load&#39;</span>,
<span style="color:#e6db74">&#39;📬&#39;</span>: <span style="color:#e6db74">&#39;modulo&#39;</span>,
<span style="color:#e6db74">&#39;&#39;</span>: <span style="color:#e6db74">&#39;multiply&#39;</span>,
<span style="color:#e6db74">&#39;🍿&#39;</span>: <span style="color:#e6db74">&#39;pop&#39;</span>,
<span style="color:#e6db74">&#39;📤&#39;</span>: <span style="color:#e6db74">&#39;pop_out&#39;</span>,
<span style="color:#e6db74">&#39;🎤&#39;</span>: <span style="color:#e6db74">&#39;print_top&#39;</span>,
<span style="color:#e6db74">&#39;📥&#39;</span>: <span style="color:#e6db74">&#39;push&#39;</span>,
<span style="color:#e6db74">&#39;🔪&#39;</span>: <span style="color:#e6db74">&#39;sub&#39;</span>,
<span style="color:#e6db74">&#39;🌓&#39;</span>: <span style="color:#e6db74">&#39;xor&#39;</span>,
<span style="color:#e6db74">&#39;&#39;</span>: <span style="color:#e6db74">&#39;jump_top&#39;</span>,
<span style="color:#e6db74">&#39;&#39;</span>: <span style="color:#e6db74">&#39;exit&#39;</span>,
<span style="color:#e6db74">&#39;&#39;</span>: <span style="color:#e6db74">&#39;;&#39;</span>,
<span style="color:#e6db74">&#39;🥇&#39;</span>: <span style="color:#e6db74">&#39;[acc=1]&#39;</span>,
<span style="color:#e6db74">&#39;🥈&#39;</span>: <span style="color:#e6db74">&#39;[acc=2]&#39;</span>,
<span style="color:#e6db74">&#39;💰&#39;</span>: <span style="color:#e6db74">&#39;@&#39;</span>,
<span style="color:#e6db74">&#39;😐&#39;</span>: <span style="color:#e6db74">&#39;end_if&#39;</span>,
<span style="color:#e6db74">&#39;🖋&#39;</span>: <span style="color:#e6db74">&#39;func_&#39;</span>,
<span style="color:#e6db74">&#39;🏀&#39;</span>: <span style="color:#e6db74">&#39;BRK&lt;&#39;</span>,
<span style="color:#e6db74">&#39;&#39;</span>: <span style="color:#e6db74">&#39;BRK!&#39;</span>,
<span style="color:#e6db74">&#39;💠🔶🎌🚩🏁&#39;</span>: <span style="color:#e6db74">&#39;Label01&#39;</span>,
<span style="color:#e6db74">&#39;💠🏁🎌🔶🚩&#39;</span>: <span style="color:#e6db74">&#39;Label02&#39;</span>,
<span style="color:#e6db74">&#39;🚩💠🎌🔶🏁&#39;</span>: <span style="color:#e6db74">&#39;Label03&#39;</span>,
<span style="color:#e6db74">&#39;🏁🚩🎌💠🔶&#39;</span>: <span style="color:#e6db74">&#39;Label04&#39;</span>,
<span style="color:#e6db74">&#39;🔶🎌🚩💠🏁&#39;</span>: <span style="color:#e6db74">&#39;Label05&#39;</span>,
<span style="color:#e6db74">&#39;🎌🏁🚩🔶💠&#39;</span>: <span style="color:#e6db74">&#39;Label06&#39;</span>,
<span style="color:#e6db74">&#39;🔶🚩💠🏁🎌&#39;</span>: <span style="color:#e6db74">&#39;Label07&#39;</span>,
<span style="color:#e6db74">&#39;🚩🔶🏁🎌💠&#39;</span>: <span style="color:#e6db74">&#39;Label08&#39;</span>,
<span style="color:#e6db74">&#39;🎌🚩💠🔶🏁&#39;</span>: <span style="color:#e6db74">&#39;Label09&#39;</span>,
<span style="color:#e6db74">&#39;🎌🏁💠🔶🚩&#39;</span>: <span style="color:#e6db74">&#39;Label10&#39;</span>,
<span style="color:#e6db74">&#39;🏁💠🔶🚩🎌&#39;</span>: <span style="color:#e6db74">&#39;Label11&#39;</span>,
<span style="color:#e6db74">&#39;💠🎌🏁🚩🔶&#39;</span>: <span style="color:#e6db74">&#39;Label12&#39;</span>,
<span style="color:#e6db74">&#39;0&#39;</span>: <span style="color:#e6db74">&#39;0&#39;</span>,
<span style="color:#e6db74">&#39;1&#39;</span>: <span style="color:#e6db74">&#39;1&#39;</span>,
<span style="color:#e6db74">&#39;2&#39;</span>: <span style="color:#e6db74">&#39;2&#39;</span>,
<span style="color:#e6db74">&#39;3&#39;</span>: <span style="color:#e6db74">&#39;3&#39;</span>,
<span style="color:#e6db74">&#39;4&#39;</span>: <span style="color:#e6db74">&#39;4&#39;</span>,
<span style="color:#e6db74">&#39;5&#39;</span>: <span style="color:#e6db74">&#39;5&#39;</span>,
<span style="color:#e6db74">&#39;6&#39;</span>: <span style="color:#e6db74">&#39;6&#39;</span>,
<span style="color:#e6db74">&#39;7&#39;</span>: <span style="color:#e6db74">&#39;7&#39;</span>,
<span style="color:#e6db74">&#39;8&#39;</span>: <span style="color:#e6db74">&#39;8&#39;</span>,
<span style="color:#e6db74">&#39;9&#39;</span>: <span style="color:#e6db74">&#39;9&#39;</span>,
}
</code></pre></div><p>The language for <code>vm.py</code> also knows labels for the <code>jump_to</code> operations and a symbol to distinguish between the accumulators to use.</p>
<p>A look at the translated source was a little bit more helpful. The example below shows a cleaned up, but shortened version of my interpretation of the syntax after translation.</p>
<pre><code>load \[acc=1\] 0;
push \[acc=1\]
load \[acc=1\] 17488;
push \[acc=1\]
load \[acc=1\] 16758;
push \[acc=1\]
load \[acc=1\] 16599;
push \[acc=1\]
load \[acc=1\] 16285;
...
push \[acc=1\]
load \[acc=2\] 1;
func Label01
pop \[acc=1\]
push \[acc=2\]
push \[acc=1\]
load \[acc=1\] 389;
push \[acc=1\]
push \[acc=2\]
jump_to $\[ Label04
xor
print_top
load \[acc=1\] 1;
push \[acc=1\]
add
pop \[acc=2\]
if\_not\_zero
jump_to $\[ Label01
end_if
...
</code></pre><p>To find out what each operation does, I looked at the source code of <code>vm.py</code>. The <code>load</code> instruction reads as follows: &ldquo;Load accumulator1 with the immediate value 0&rdquo;. With push the value stored in the accumulator1 is pushed to the stack. Other operations take the top two items from the stack to process them (addition, subtraction, multiplication, division, modulo, xor, &hellip;).</p>
<p>By only looking at the code I had no clue what was going on, but with all the jumps, I though about visualizing the program flow. I used my translated program and formatted the code to be a compatible <a href="https://www.graphviz.org/">Graphviz</a> <a href="https://git.goatpr0n.de/snippets/5">dot file</a>. The resulting graph was again a little bit more of an help.</p>
<p><img src="https://goatpr0n.farm/wp-content/uploads/2019/07/program.png" alt=""></p>
<p>Call graph of program</p>
<p>The graph shows a bunch of instructions to fill the stack of the VM. The right side has some more &ldquo;complicated&rdquo; instructions with modulo, division, xor, &hellip;.</p>
<p>When I see xor instructions, I often think of encryption and with multiplications and modulo instructions right next to it this though hardens.</p>
<p>But starring at the graph and the translated code did not help.</p>
<h3 id="solving-the-challenge-finally">Solving the Challenge: Finally</h3>
<p>It took me a while of starring until I realized, that I should try something else.</p>
<p>My next approach to solve this challenge was to write a trace log of the program execution step by step.</p>
<p>In each instruction function in <code>vm.py</code> I added some additional code to store the current status of the registers <code>self.instruction_pointer</code>, <code>self.accumulator1</code>, <code>self.accumulator2</code> and translated each operation into its human readable counter part. I also added (if possible) the parameters and the result of calculations.</p>
<pre><code>00000002 \[acc1=00000000\]\[acc2=00000000\]: load(&quot;acc1&quot;, 0)
00000006 \[acc1=00000000\]\[acc2=00000000\]: push(acc1) = 0
00000008 \[acc1=00017488\]\[acc2=00000000\]: load(&quot;acc1&quot;, 17488)
00000016 \[acc1=00017488\]\[acc2=00000000\]: push(acc1) = 17488
00000018 \[acc1=00016758\]\[acc2=00000000\]: load(&quot;acc1&quot;, 16758)
00000026 \[acc1=00016758\]\[acc2=00000000\]: push(acc1) = 16758
00000028 \[acc1=00016599\]\[acc2=00000000\]: load(&quot;acc1&quot;, 16599)
00000036 \[acc1=00016599\]\[acc2=00000000\]: push(acc1) = 16599
00000038 \[acc1=00016285\]\[acc2=00000000\]: load(&quot;acc1&quot;, 16285)
...
00000386 \[acc1=00000389\]\[acc2=00000001\]: push(acc2) = 1
00000388 \[acc1=00000389\]\[acc2=00000001\]: jump_to(Label04) @1040
00001041 \[acc1=00000002\]\[acc2=00000001\]: load(&quot;acc1&quot;, 2)
00001045 \[acc1=00000002\]\[acc2=00000001\]: push(acc1) = 2
00001048 \[acc1=00000002\]\[acc2=00000001\]: jump_to(Label08) @1098
00001099 \[acc1=00000002\]\[acc2=00000001\]: clone() = 2
00001100 \[acc1=00000002\]\[acc2=00000001\]: load(&quot;acc1&quot;, 2)
00001104 \[acc1=00000002\]\[acc2=00000001\]: push(acc1) = 2
00001107 \[acc1=00000002\]\[acc2=00000001\]: sub(b=2, a=2) = 0
00001108 \[acc1=00000002\]\[acc2=00000001\]: if_zero() = 0
00001109 \[acc1=00000002\]\[acc2=00000001\]: pop_out() // 0
00001110 \[acc1=00000001\]\[acc2=00000001\]: load(&quot;acc1&quot;, 1)
00001114 \[acc1=00000001\]\[acc2=00000001\]: push(acc1) = 1
00001115 \[acc1=00000001\]\[acc2=00000001\]: end_if = 🏀
00001115 \[acc1=00000001\]\[acc2=00000001\]: …cont… if_zero()
00001116 \[acc1=00000001\]\[acc2=00000001\]: jump_to(Label05) @1050
00001051 \[acc1=00000001\]\[acc2=00000001\]: if_zero() = 1
00001055 \[acc1=00000001\]\[acc2=00000001\]: end_if
00001057 \[acc1=00000001\]\[acc2=00000001\]: pop_out() // 1
...
</code></pre><p>There are still a few emojis left, but I did not care about them. With the trace log I could observe the program being executed and calculating the URL, or at least see the trace part where the <code>print_top</code> of the characters happens.</p>
<pre><code>00001076 \[acc1=00000002\]\[acc2=00000001\]: if_zero() = 0
00001077 \[acc1=00000002\]\[acc2=00000001\]: pop_out() // 0
00001078 \[acc1=00000002\]\[acc2=00000389\]: pop(acc2) = 389
00001080 \[acc1=00000002\]\[acc2=00000389\]: push(acc1) = 2
00001082 \[acc1=00000002\]\[acc2=00000389\]: push(acc2) = 389
00001083 \[acc1=00000002\]\[acc2=00000389\]: end_if = ⛰
00001083 \[acc1=00000002\]\[acc2=00000389\]: …cont… if_zero()
**00001084 \[acc1=00000002\]\[acc2=00000389\]: jump_top() @389
00000390 \[acc1=00000002\]\[acc2=00000389\]: xor(b=106, a=2) = 104**
00000391 \[acc1=00000002\]\[acc2=00000389\]: print_top(&quot;h&quot;)
00000392 \[acc1=00000001\]\[acc2=00000389\]: load(&quot;acc1&quot;, 1)
00000396 \[acc1=00000001\]\[acc2=00000389\]: push(acc1) = 1
00000398 \[acc1=00000001\]\[acc2=00000389\]: add(a=1, b=1) = 2
00000399 \[acc1=00000001\]\[acc2=00000002\]: pop(acc2) = 2
00000401 \[acc1=00000001\]\[acc2=00000002\]: if\_not\_zero() = 119
00000401 \[acc1=00000001\]\[acc2=00000002\]: end_if = 🏀
00000401 \[acc1=00000001\]\[acc2=00000002\]: …cont… if_zero()
00000402 \[acc1=00000001\]\[acc2=00000002\]: jump_to(Label01) @371
</code></pre><p>The <code>print_top</code> instruction takes the item from the top of the stack and prints it out. The stack only stores numbers, so the number is converted into a character before output. Right before the <code>print_top</code> is a <code>xor</code>.</p>
<p>The <code>xor</code> takes the two top items from the stack to get the result of &lsquo;104&rsquo; which is the letter &ldquo;h&rdquo;. The number &lsquo;106&rsquo; was pushed to the stack in the beginning, but where does the &lsquo;2&rsquo; come from? This took be a while to find out. But only after letting the program run bit longer.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ grep -A1 xor trace.log
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000002<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>106, a<span style="color:#f92672">=</span>2<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">104</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000002<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;h&#34;</span><span style="color:#f92672">)</span>
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000003<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>119, a<span style="color:#f92672">=</span>3<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">116</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000003<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;t&#34;</span><span style="color:#f92672">)</span>
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000005<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>113, a<span style="color:#f92672">=</span>5<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">116</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000005<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;t&#34;</span><span style="color:#f92672">)</span>
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000007<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>119, a<span style="color:#f92672">=</span>7<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">112</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000007<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;p&#34;</span><span style="color:#f92672">)</span>
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000011<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>49, a<span style="color:#f92672">=</span>11<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">58</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000011<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;:&#34;</span><span style="color:#f92672">)</span>
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000101<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>74, a<span style="color:#f92672">=</span>101<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">47</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000101<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;/&#34;</span><span style="color:#f92672">)</span>
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000131<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>172, a<span style="color:#f92672">=</span>131<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">47</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000131<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;/&#34;</span><span style="color:#f92672">)</span>
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000151<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>242, a<span style="color:#f92672">=</span>151<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">101</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000151<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;e&#34;</span><span style="color:#f92672">)</span>
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000181<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>216, a<span style="color:#f92672">=</span>181<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">109</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000181<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;m&#34;</span><span style="color:#f92672">)</span>
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000191<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>208, a<span style="color:#f92672">=</span>191<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">111</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000191<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;o&#34;</span><span style="color:#f92672">)</span>
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000313<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>339, a<span style="color:#f92672">=</span>313<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">106</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000313<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;j&#34;</span><span style="color:#f92672">)</span>
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000353<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>264, a<span style="color:#f92672">=</span>353<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">105</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000353<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;i&#34;</span><span style="color:#f92672">)</span>
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000373<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>344, a<span style="color:#f92672">=</span>373<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">45</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000373<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;-&#34;</span><span style="color:#f92672">)</span>
<span style="color:#ae81ff">00000390</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000383<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: xor<span style="color:#f92672">(</span>b<span style="color:#f92672">=</span>267, a<span style="color:#f92672">=</span>383<span style="color:#f92672">)</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">116</span>
<span style="color:#ae81ff">00000391</span> <span style="color:#ae81ff">\[</span>acc1<span style="color:#f92672">=</span>00000383<span style="color:#ae81ff">\]\[</span>acc2<span style="color:#f92672">=</span>00000389<span style="color:#ae81ff">\]</span>: print_top<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;t&#34;</span><span style="color:#f92672">)</span>
</code></pre></div><p>Again after a long round of starring at the output, it hit me. The argument <code>a</code> is always a prime number, but these are special primes. All primes are palindromes. The argument <code>b</code> is the value from the stack.</p>
<p>In my next step I wrote a script to calculate the palindrome primes and xor them with the values from the stack. I also discarded the idea to optimize the one of the components to solve this challenge.</p>
<p>As my final solution does not use the next code blocks anymore I will only highlight some ideas and problems I encountered.</p>
<p>I found a algorithm to calculate palindrome prime numbers on <a href="https://stackoverflow.com/questions/22699625/palindromic-prime-number-in-python">Stackoverflow</a> and modified it to my needs.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">gen</span>\_pal\_prime(a, b):
<span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(a, b):
y <span style="color:#f92672">=</span> True
<span style="color:#66d9ef">if</span> str(i) <span style="color:#f92672">==</span> str(i)\[::<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>\]:
<span style="color:#66d9ef">if</span>(i <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">2</span>):
<span style="color:#66d9ef">for</span> a <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">2</span>, i):
<span style="color:#66d9ef">if</span> i <span style="color:#f92672">%</span> a <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>:
y <span style="color:#f92672">=</span> False
<span style="color:#66d9ef">break</span>
<span style="color:#66d9ef">if</span> y:
<span style="color:#66d9ef">yield</span> i
palindromes <span style="color:#f92672">=</span> \[_ <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> gen\_pal\_prime(<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">999999</span>)\]
</code></pre></div><p>The problem with this was, depending on the second parameter it takes a long time to calculate all primes and the other problem was, it did not work. Or it stopped working after the 39th character.</p>
<p>The algorithm failed to calculate the correct xor value for &lsquo;93766&rsquo;. As the string read until it broke &ldquo;<a href="http://emoji-t0anaxnr3nacpt4na.web.ctfco">http://emoji-t0anaxnr3nacpt4na.web.ctfco</a>&rdquo; my guess was, that the next character has to be a &lsquo;m&rsquo; (ctfcompetition).</p>
<p>Brute forcing the prime number for &lsquo;93766&rsquo; returned &lsquo;93739&rsquo;. What left me puzzled again. The previous prime number was &lsquo;17471&rsquo;. So I split up the whole blocks of pushing numbers to the stack into three blocks.</p>
<pre><code>+-----------+-----------+-----------+
| Block 1 | Block 2 | Block3 |
+-----------+-----------+-----------+
| 17488 | 98426 | 101141058 |
| 16758 | 97850 | 101060206 |
| 16599 | 97604 | 101030055 |
| 16285 | 97280 | 100998966 |
| 16094 | 96815 | 100887990 |
| 15505 | 96443 | 100767085 |
| 15417 | 96354 | 100707036 |
| 14832 | 95934 | 100656111 |
| 14450 | 94865 | 100404094 |
| 13893 | 94952 | 100160922 |
| 13926 | 94669 | 100131019 |
| 13437 | 94440 | 100111100 |
| 12833 | 93969 | 100059926 |
| 12741 | 93766 | 100049982 |
| 12533 | 99 | 100030045 |
| 11504 | | 9989997 |
| 11342 | | 9981858 |
| 10503 | | 9980815 |
| 10550 | | 9978842 |
| 10319 | | 9965794 |
| 975 | | 9957564 |
| 1007 | | 9938304 |
| 892 | | 9935427 |
| 893 | | 9932289 |
| 660 | | 9931494 |
| 743 | | 9927388 |
| 267 | | 9926376 |
| 344 | | 9923213 |
| 264 | | 9921394 |
| 339 | | 9919154 |
| 208 | | 9918082 |
| 216 | | 9916239 |
| 242 | | 765 |
| 172 | | |
| 74 | | |
| 49 | | |
| 119 | | |
| 113 | | |
| 119 | | |
| 106 | | |
| 1 | | |
+-----------+-----------+-----------+
</code></pre><p>The purpose of the last number of each block opened up to me, when I finally found the correct prime for the third block. To decode the correct URL I ignored these numbers (&lsquo;1&rsquo;, &lsquo;99&rsquo;, &lsquo;765&rsquo;) and started building special cases into my decoding function.</p>
<p>The code below almost worked fine. Each block would be separately being decoded, after a certain number of iterations (<code>i</code>). I tried to make some sense of these numbers at the bottom of each block.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#66d9ef">print</span>(<span style="color:#e6db74">&#39;Palindrome Primes #1&#39;</span>)
palindromes1 <span style="color:#f92672">=</span> \[_ <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> gen\_pal\_prime(<span style="color:#ae81ff">1</span>, <span style="color:#ae81ff">18000</span>)\]
palindromes1<span style="color:#f92672">.</span>insert(<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">2</span>) <span style="color:#75715e"># manually add the number 2.</span>
<span style="color:#66d9ef">print</span>(<span style="color:#e6db74">&#39;Palindrome Primes #2&#39;</span>)
palindromes2 <span style="color:#f92672">=</span> \[_ <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> gen\_pal\_prime(<span style="color:#ae81ff">93766</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">99</span>, <span style="color:#ae81ff">999999</span>)\]
<span style="color:#66d9ef">print</span>(<span style="color:#e6db74">&#39;Palindrome Primes #3&#39;</span>)
palindromes3 <span style="color:#f92672">=</span> \[_ <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> gen\_pal\_prime(<span style="color:#ae81ff">9916239</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">765</span>, <span style="color:#ae81ff">19916239</span>)\]
palindromes <span style="color:#f92672">=</span> palindromes1
stack<span style="color:#f92672">.</span>reverse()
<span style="color:#66d9ef">for</span> i, val <span style="color:#f92672">in</span> enumerate(stack):
<span style="color:#66d9ef">if</span> i <span style="color:#f92672">==</span> <span style="color:#ae81ff">40</span>:
mode <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;stack2&#39;</span>
palindromes <span style="color:#f92672">=</span> palindromes2
<span style="color:#66d9ef">if</span> mode <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;stack2&#39;</span>:
i <span style="color:#f92672">-=</span> <span style="color:#ae81ff">40</span>
<span style="color:#66d9ef">if</span> i <span style="color:#f92672">==</span> <span style="color:#ae81ff">14</span>:
mode <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;stack3&#39;</span>
palindromes <span style="color:#f92672">=</span> palindromes3
<span style="color:#66d9ef">if</span> mode <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;stack3&#39;</span>:
i <span style="color:#f92672">-=</span> <span style="color:#ae81ff">13</span>
c <span style="color:#f92672">=</span> val <span style="color:#f92672">^</span> palindromes\[i\]
<span style="color:#66d9ef">print</span>(f<span style="color:#e6db74">&#39;{i:&lt;8d}| {val:8d} ^ {palindromes\[i\]:&lt;8} = {c:3d}&#39;</span>, chr(c))
</code></pre></div><p>While my program ran, I encountered yet again a problem but this time during decoding the third block of numbers. The calculation of my palindrome primes took quite some time and did not result in printable/human readable characters.</p>
<p>Talking to a colleague of mine, he came up with the idea to look up lists of precalculated prime numbers and I found a website which provides lists of the first 2 billion prime numbers as downloadable files.</p>
<p>The site <a href="http://www.primos.mat.br/2T_en.html">http://www.primos.mat.br/2T_en.html</a> provides individual compressed text files, with 10 million primes each file. For this challenge the prime numbers from 2 to 179424673 should suffice.</p>
<p>After decompressing the file I had to convert the file from columns separated by tabs to a easier to read format for my Python programs. To remove the columns and only have one prime per line I used the program <code>tr</code>.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ tr <span style="color:#e6db74">&#39;\\t&#39;</span> <span style="color:#e6db74">&#39;\\n&#39;</span> &lt; 2T_part1.txt &gt; primes.txt
</code></pre></div><p>I wrote a function to read this file to only return the palindrome primes as a list. The <code>str(_.rstrip()) == str(_.rstrip())[::-1]</code> part of the condition will check if the number is a palindrome, by comparing the number as string against it reversed counterpart.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">load_primes</span>(filename):
<span style="color:#66d9ef">with</span> open(filename, <span style="color:#e6db74">&#39;rt&#39;</span>) <span style="color:#66d9ef">as</span> handle:
<span style="color:#66d9ef">return</span> \[int(_) <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> handle<span style="color:#f92672">.</span>readlines()
<span style="color:#66d9ef">if</span> str(_<span style="color:#f92672">.</span>rstrip()) <span style="color:#f92672">==</span> str(_<span style="color:#f92672">.</span>rstrip())\[::<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>\]\]
</code></pre></div><p>With this list of palindrome primes I wrote a short brute force solution to find the correct prime number to decode the third block, or to be more precise, where in this list of primes can I find it.</p>
<p>As a constraint I iterated through all primes until the prime <code>p</code> from <code>primes</code> is greater than the number (&lsquo;9916239&rsquo;) I am looking for. Then I know, that my prime had to be within the first 765 primes.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#f92672">&gt;&gt;</span>\<span style="color:#f92672">&gt;</span> primes <span style="color:#f92672">=</span> solver<span style="color:#f92672">.</span>load_primes(<span style="color:#e6db74">&#39;primes.txt&#39;</span>)
<span style="color:#f92672">&gt;&gt;</span>\<span style="color:#f92672">&gt;</span> <span style="color:#66d9ef">for</span> i, p <span style="color:#f92672">in</span> enumerate(primes):
<span style="color:#f92672">...</span> <span style="color:#66d9ef">if</span> p <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">9916239</span>:
<span style="color:#f92672">...</span> <span style="color:#66d9ef">print</span>(i)
<span style="color:#f92672">...</span> <span style="color:#66d9ef">break</span>
<span style="color:#f92672">...</span>
<span style="color:#ae81ff">765</span>
</code></pre></div><p>At this point the 3 numbers I could not figure out until now, now made sense. These are the n-th number prime from a list of consecutive palindrome primes. The first block begins at the the 1st prime from my list of primes, the second block begins at the 99th prime number and the third block at the 765th prime number from my list.</p>
<p>And now it also makes sense, why <code>program</code> becomes slower with each iteration. The code block (see the call graph above) calculates palindrome prime numbers, which becomes more and more of a problem regarding performance when it hits greater numbers.</p>
<p>How does my final solution look like? I wrote a script called <code>solver.py</code>, put all numbers from all three blocks into a single list and wrote my decryption function.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#75715e">#! /usr/bin/env python</span>
<span style="color:#75715e">#\-\*\- coding: utf-8 -*-</span>
stack <span style="color:#f92672">=</span> \[<span style="color:#ae81ff">101141058</span>, <span style="color:#ae81ff">101060206</span>, <span style="color:#ae81ff">101030055</span>, <span style="color:#ae81ff">100998966</span>, <span style="color:#ae81ff">100887990</span>,
<span style="color:#ae81ff">100767085</span>, <span style="color:#ae81ff">100707036</span>, <span style="color:#ae81ff">100656111</span>, <span style="color:#ae81ff">100404094</span>, <span style="color:#ae81ff">100160922</span>,
<span style="color:#ae81ff">100131019</span>, <span style="color:#ae81ff">100111100</span>, <span style="color:#ae81ff">100059926</span>, <span style="color:#ae81ff">100049982</span>, <span style="color:#ae81ff">100030045</span>,
<span style="color:#ae81ff">9989997</span>, <span style="color:#ae81ff">9981858</span>, <span style="color:#ae81ff">9980815</span>, <span style="color:#ae81ff">9978842</span>, <span style="color:#ae81ff">9965794</span>, <span style="color:#ae81ff">9957564</span>,
<span style="color:#ae81ff">9938304</span>, <span style="color:#ae81ff">9935427</span>, <span style="color:#ae81ff">9932289</span>, <span style="color:#ae81ff">9931494</span>, <span style="color:#ae81ff">9927388</span>, <span style="color:#ae81ff">9926376</span>,
<span style="color:#ae81ff">9923213</span>, <span style="color:#ae81ff">9921394</span>, <span style="color:#ae81ff">9919154</span>, <span style="color:#ae81ff">9918082</span>, <span style="color:#ae81ff">9916239</span>, <span style="color:#75715e"># Block 3</span>
<span style="color:#ae81ff">98426</span>, <span style="color:#ae81ff">97850</span>, <span style="color:#ae81ff">97604</span>, <span style="color:#ae81ff">97280</span>, <span style="color:#ae81ff">96815</span>, <span style="color:#ae81ff">96443</span>, <span style="color:#ae81ff">96354</span>, <span style="color:#ae81ff">95934</span>,
<span style="color:#ae81ff">94865</span>, <span style="color:#ae81ff">94952</span>, <span style="color:#ae81ff">94669</span>, <span style="color:#ae81ff">94440</span>, <span style="color:#ae81ff">93969</span>, <span style="color:#ae81ff">93766</span>, <span style="color:#75715e"># Block 2</span>
<span style="color:#ae81ff">17488</span>, <span style="color:#ae81ff">16758</span>, <span style="color:#ae81ff">16599</span>, <span style="color:#ae81ff">16285</span>, <span style="color:#ae81ff">16094</span>, <span style="color:#ae81ff">15505</span>, <span style="color:#ae81ff">15417</span>, <span style="color:#ae81ff">14832</span>,
<span style="color:#ae81ff">14450</span>, <span style="color:#ae81ff">13893</span>, <span style="color:#ae81ff">13926</span>, <span style="color:#ae81ff">13437</span>, <span style="color:#ae81ff">12833</span>, <span style="color:#ae81ff">12741</span>, <span style="color:#ae81ff">12533</span>, <span style="color:#ae81ff">11504</span>,
<span style="color:#ae81ff">11342</span>, <span style="color:#ae81ff">10503</span>, <span style="color:#ae81ff">10550</span>, <span style="color:#ae81ff">10319</span>, <span style="color:#ae81ff">975</span>, <span style="color:#ae81ff">1007</span>, <span style="color:#ae81ff">892</span>, <span style="color:#ae81ff">893</span>, <span style="color:#ae81ff">660</span>,
<span style="color:#ae81ff">743</span>, <span style="color:#ae81ff">267</span>, <span style="color:#ae81ff">344</span>, <span style="color:#ae81ff">264</span>, <span style="color:#ae81ff">339</span>, <span style="color:#ae81ff">208</span>, <span style="color:#ae81ff">216</span>, <span style="color:#ae81ff">242</span>, <span style="color:#ae81ff">172</span>, <span style="color:#ae81ff">74</span>, <span style="color:#ae81ff">49</span>, <span style="color:#ae81ff">119</span>,
<span style="color:#ae81ff">113</span>, <span style="color:#ae81ff">119</span>, <span style="color:#ae81ff">106</span>\] <span style="color:#75715e"># Block 1</span>
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">load_primes</span>(filename):
<span style="color:#66d9ef">with</span> open(filename, <span style="color:#e6db74">&#39;rt&#39;</span>) <span style="color:#66d9ef">as</span> handle:
<span style="color:#66d9ef">return</span> \[int(_) <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> handle<span style="color:#f92672">.</span>readlines()
<span style="color:#66d9ef">if</span> str(_<span style="color:#f92672">.</span>rstrip()) <span style="color:#f92672">==</span> str(_<span style="color:#f92672">.</span>rstrip())\[::<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>\]\]
<span style="color:#66d9ef">if</span> \_\_name\_\_ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;\_\_main\_\_&#39;</span>:
palindromes <span style="color:#f92672">=</span> load_primes(<span style="color:#e6db74">&#39;primes.txt&#39;</span>)
stack<span style="color:#f92672">.</span>reverse()
offset <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
<span style="color:#66d9ef">for</span> i, val <span style="color:#f92672">in</span> enumerate(stack):
<span style="color:#66d9ef">if</span> i <span style="color:#f92672">==</span> <span style="color:#ae81ff">40</span>:
offset <span style="color:#f92672">=</span> <span style="color:#ae81ff">98</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">40</span>
<span style="color:#66d9ef">if</span> i <span style="color:#f92672">==</span> <span style="color:#ae81ff">54</span>:
offset <span style="color:#f92672">=</span> <span style="color:#ae81ff">764</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">54</span>
c <span style="color:#f92672">=</span> val <span style="color:#f92672">^</span> palindromes\[i <span style="color:#f92672">+</span> offset\]
<span style="color:#66d9ef">print</span>(chr(c), end<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;&#39;</span>)
<span style="color:#66d9ef">print</span>()
</code></pre></div><p>Running this script will produce the URL &ldquo;<code>http://emoji-t0anaxnr3nacpt4na.web.ctfcompetition.com/humans_and_cauliflowers_network/</code>&rdquo;. Visiting this URL gives a choice for three sub pages of different people. The flag is stored in the personal page of Amber within a picture. The flag reads &ldquo;<code>CTF{Peace_from_Cauli!}</code>&rdquo;.</p>
<h2 id="lessons-learned">Lessons learned</h2>
<p>Doing CTFs sometimes require you to think out of the box and/or ignore the first possible solutions which might seem to be the obvious ones, but might lead you nowhere or are just there to keep you side tracked.</p>
<p>This challenge first got me thinking about modifying and changing the behavior of the provided files <code>program</code> and <code>vm.py</code>. While working through the challenge, which kept me busy for quite some time, I found a different solution.</p>
<p>The previous tries to solve this challenge were not for nothing, especially the addition of my trace log addition, which finally helped me understanding the problem and getting my on the right track to the solution.</p>
<h4><a href="https://goatpr0n.farm/">Back to Home</a></h4>
</div>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

137
public/posts/index.html Normal file
View File

@ -0,0 +1,137 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>Blog</h1>
</header>
<h1 id="all-posts">All posts</h1>
</article>
<ul>
<li>
<a href="https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/">2019-11-28 | Reverse Engineering of a Flash Programmer :: EZP2010</a>
</li>
<li>
<a href="https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/">2019-09-25 | Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</a>
</li>
<li>
<a href="https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/">2019-07-24 | Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</a>
</li>
<li>
<a href="https://goatpr0n.farm/posts/reverse-engineering-of-the-skyrc-mc3000-battery-charger-usb-protocol/">2019-03-18 | Reverse Engineering of the SkyRC MC3000 Battery Charger USB Protocol</a>
</li>
<li>
<a href="https://goatpr0n.farm/posts/teaser-how-to-reverse-engineer-communication-protocols-of-embedded-devices/">2019-02-16 | [Teaser] How to reverse engineer communication protocols of embedded devices</a>
</li>
<li>
<a href="https://goatpr0n.farm/25.html">2019-02-05 | Hack back during #cyberwar</a>
</li>
<li>
<a href="https://goatpr0n.farm/posts/welcome-to-the-farm/">2019-02-05 | Welcome to the farm!</a>
</li>
<li>
<a href="https://goatpr0n.farm/posts/can-i-haz-ur-dataz/">2019-02-01 | Can I haz ur dataz</a>
</li>
<li>
<a href="https://goatpr0n.farm/posts/what-if-the-cult-of-dd-is-right/">2019-01-23 | What if the cult of dd is right?</a>
</li>
<li>
<a href="https://goatpr0n.farm/posts/there-is-not-enough-cyber-in-the-world/">2019-01-21 | There is not enough cyber in the world</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

126
public/posts/index.xml Normal file
View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Blog on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/posts/</link>
<description>Recent content in Blog on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Thu, 28 Nov 2019 12:01:53 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/posts/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Reverse Engineering of a Flash Programmer :: EZP2010</title>
<link>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</guid>
<description>Preface In today&amp;rsquo;s adventure I like to take you with me on my journey of reverse engineering another USB device. The EZP2010 is an USB programmer for flash memory as used by mainboard manufactures to store the BIOS, or embedded devices to store the firmware (or settings). When it comes to data recovery on hard drives, or similar storage devices, these flashers can also become handy.
EZP2010 USB-Highspeed programmer
This particular programmer can be bought on many Chinese store or Amazon.</description>
</item>
<item>
<title>Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</title>
<link>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</link>
<pubDate>Wed, 25 Sep 2019 15:22:58 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</guid>
<description>TL;DR; Short the ERASE pin with VDDCORE, if ERASE == PIN_55 &amp;amp;&amp;amp; VDDCORE == PIN_54
According to complains in the internet, users report bricking their Proxmark3 EASY, when they try to flash the latest firmware with the &amp;lsquo;flasher&amp;rsquo; software tool.
Sometimes flashing process of firmware can go wrong, but it can often be recovered with JTAG programmers, or similar programmers.
I will not about setting up the environment to build, and flash the firmware, but I will tell you what you might be missing out and why it might be not working.</description>
</item>
<item>
<title>Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</title>
<link>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</link>
<pubDate>Wed, 24 Jul 2019 12:19:47 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</guid>
<description>#MemeFreeEdition
The Challenge You are provided a zip file containing two files.
program vm.py The file program contains instructions encoded as emojis for a virtual machine called vm.py. At the bottom of vm.py I found a list, or lets call it a translation table, with emojis and their function name counter part.
OPERATIONS = { &amp;#39;🍡&amp;#39;: add, &amp;#39;🤡&amp;#39;: clone, &amp;#39;📐&amp;#39;: divide, &amp;#39;😲&amp;#39;: if_zero, &amp;#39;😄&amp;#39;: if_not_zero, &amp;#39;🏀&amp;#39;: jump_to, &amp;#39;🚛&amp;#39;: load, &amp;#39;📬&amp;#39;: modulo, &amp;#39;⭐&amp;#39;: multiply, &amp;#39;🍿&amp;#39;: pop, &amp;#39;📤&amp;#39;: pop_out, &amp;#39;🎤&amp;#39;: print_top, &amp;#39;📥&amp;#39;: push, &amp;#39;🔪&amp;#39;: sub, &amp;#39;🌓&amp;#39;: xor, &amp;#39;⛰&amp;#39;: jump_top, &amp;#39;⌛&amp;#39;: exit } To execute program with vm.</description>
</item>
<item>
<title>Reverse Engineering of the SkyRC MC3000 Battery Charger USB Protocol</title>
<link>https://goatpr0n.farm/posts/reverse-engineering-of-the-skyrc-mc3000-battery-charger-usb-protocol/</link>
<pubDate>Mon, 18 Mar 2019 16:49:39 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/reverse-engineering-of-the-skyrc-mc3000-battery-charger-usb-protocol/</guid>
<description>Software Requirements Decompiler for .NET programs
dotPeek The implementation of the protocol is then written in Python. Let&amp;rsquo;s hear what the curator has to say:
Tell me about Python.
&amp;gt; Wow. Much Snake. Easy programming! &amp;gt; &amp;gt; \- Doge Tell me about dotPeek.
&amp;gt; Easy decompilation. Readable syntax. Very easy. &amp;gt; &amp;gt; \- Doge Analyzing MC3000_Monitor Decompiling Start dotPeek and use Drag&amp;rsquo;n&amp;rsquo;Drop to load the Application. Or uSe CtRL+O anD LoCATe tHe fILe uSiNg ThE bOrwsEr.</description>
</item>
<item>
<title>[Teaser] How to reverse engineer communication protocols of embedded devices</title>
<link>https://goatpr0n.farm/posts/teaser-how-to-reverse-engineer-communication-protocols-of-embedded-devices/</link>
<pubDate>Sat, 16 Feb 2019 01:25:34 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/teaser-how-to-reverse-engineer-communication-protocols-of-embedded-devices/</guid>
<description>Sneak Preview These letters. Such announcement. Many words.
In the next few days I will publish two - not one - but two articles on how to approach a problem on how to reverse engineer protocols. There have been to applications I looked into to code a library for my home uses.
#1 - MC3000 Charger MC3000_Charger provides an USB and Bluetooth (BT) interface (Spoiler: I am not covering the BT interface.</description>
</item>
<item>
<title>Hack back during #cyberwar</title>
<link>https://goatpr0n.farm/25.html</link>
<pubDate>Tue, 05 Feb 2019 18:45:08 +0000</pubDate>
<guid>https://goatpr0n.farm/25.html</guid>
<description>According this article people want us to hack back, and the government is like:
The GIF is probably copyrighted material by the The Fine Brothers. Plz Don&amp;rsquo;t sue me. I no make cyber moneyz with this blog
KTHXBYE.</description>
</item>
<item>
<title>Welcome to the farm!</title>
<link>https://goatpr0n.farm/posts/welcome-to-the-farm/</link>
<pubDate>Tue, 05 Feb 2019 18:17:12 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/welcome-to-the-farm/</guid>
<description>This magnificent piece of blog is now available under https://goatpr0n.farm/. Marvelous!</description>
</item>
<item>
<title>Can I haz ur dataz</title>
<link>https://goatpr0n.farm/posts/can-i-haz-ur-dataz/</link>
<pubDate>Fri, 01 Feb 2019 09:55:07 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/can-i-haz-ur-dataz/</guid>
<description>Remote data acquisitions over ssh To get your data trough ssh to your local storage, you simply use pipes. It does not matter if you use cat, dd or any other command line tool which outputs the data on standard output (stdout).
Using cat When using cat the there is no need to add any additional parameters in your command chain. A simple cat &amp;lt;input&amp;gt; will suffice.
Cat does not have any progress information during read operations.</description>
</item>
<item>
<title>What if the cult of dd is right?</title>
<link>https://goatpr0n.farm/posts/what-if-the-cult-of-dd-is-right/</link>
<pubDate>Wed, 23 Jan 2019 00:47:15 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/what-if-the-cult-of-dd-is-right/</guid>
<description>Are you a believer? There are articles out there talking about the useless usage of dd and why cat is better. Cat is faster because it automatically adjusts the blocksize and dd is slow because it internally only works with 512 byte blocks. This and That.
I did some simple tests with time, dd and cat, added some obscure parameters to dd, because cat is better.
Testing dd with status and specific blocksize $ time dd if=/dev/sdd of=test.</description>
</item>
<item>
<title>There is not enough cyber in the world</title>
<link>https://goatpr0n.farm/posts/there-is-not-enough-cyber-in-the-world/</link>
<pubDate>Mon, 21 Jan 2019 15:21:23 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/there-is-not-enough-cyber-in-the-world/</guid>
<description>My recent favuorite hash tags in social networks are:
- cyberwar / cyberkrieg - cold-cyberwar / kalter cyberkrieg KTHXBYE</description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,113 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<div class="row-fluid navmargin">
<div class="page-header">
<h1>Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate) - Wed, Sep 25, 2019</h1>
</div>
<p class="lead"></p>
<p>TL;DR; Short the ERASE pin with VDDCORE, if ERASE == PIN_55 &amp;&amp; VDDCORE == PIN_54</p>
<p>According to complains in the internet, users report bricking their Proxmark3 EASY, when they try to flash the latest firmware with the &lsquo;flasher&rsquo; software tool.</p>
<p>Sometimes flashing process of firmware can go wrong, but it can often be recovered with JTAG programmers, or similar programmers.</p>
<p>I will not about setting up the environment to build, and flash the firmware, but I will tell you what you might be missing out and why it might be not working.</p>
<p>If you do not know where to start with flashing your Proxmark3, than have a look <a href="https://github.com/Proxmark/proxmark3/wiki/flashing">here</a>, <a href="https://github.com/Proxmark/proxmark3/wiki/Debricking-Proxmark3-with-buspirate">here</a>, <a href="https://github.com/Proxmark/proxmark3/wiki/De-Bricking-Segger">here</a> or <a href="https://joanbono.github.io/PoC/Flashing_Proxmark3.html">here</a>. The first link describes the standard way of upgrading your firmware, which can fail, if you are unlucky. The other three links describe ways to recover your Proxmark3.</p>
<p>Why can upgrading the firmware fail? There are quite some reasons it can go wrong.</p>
<ul>
<li>bad firmware image</li>
<li>wrong parameters</li>
<li>power loss</li>
<li>chip security measurements</li>
</ul>
<p>With the Proxmark3 EASY it seems, that some devices have the <em>Security Bit</em> of the AT91SAM7S512 processor set. The <a href="http://ww1.microchip.com/downloads/en/DeviceDoc/doc6175.pdf">datasheet</a> (see page 113, paragraph 19.2.4.5) says: &ldquo;The goal of the security bit is to prevent external access to the internal bus system. [&hellip;] JTAG, Fast Flash Programming and Flash Serial Test Interface features are disabled. Once set,this bit can be reset only by an external hardware ERASE request to the chip. [&hellip;]&quot;.</p>
<p>To unlock the chip again we can find interesting information in <a href="http://www.equinox-tech.com/downloads/equinox/ApplicationNotes/AN122%20Atmel%20AT91SAM7%20ISP%20Programming_V1-13_250110.pdf">this document</a> on page 20 in paragraph 2.5. Which describes the unlocking the chip by applying <em>Vcc</em> to the <em>ERASE</em> pin. Applying voltage to the pin will wipe the security bit, but also all contents of the flash!</p>
<p>Unfortunately the ERASE pin, which is pin number 55 on the AT91SAM7S512, has no connection. The first idea was to solder a jumper wire to <em>Vcc</em>. On second guess and looking at the datasheets again, reveals pin 54 is <em>VDDCORE</em>, which applies 1.65V to 1.95V (1.8V typical) to the CPU for operation.</p>
<p>To erase and reset the Proxmark, I shortened pin 54 and pin 55 with the tip of a multimeter, applied power via USB to the Proxmark3. After &gt;300ms the flash and security bit is erased and the device can be powered off.</p>
<p>The JTAG interface is now enabled again. Next I flashed the bootloader, and the fullimage using the Bus Pirate v4 using as described in one of the first links mentioned above.</p>
<p>#hackinghackertools</p>
<h4><a href="https://goatpr0n.farm/">Back to Home</a></h4>
</div>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,348 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<div class="row-fluid navmargin">
<div class="page-header">
<h1>Reverse Engineering of a Flash Programmer :: EZP2010 - Thu, Nov 28, 2019</h1>
</div>
<p class="lead"></p>
<h2 id="preface">Preface</h2>
<p>In today&rsquo;s adventure I like to take you with me on my journey of reverse engineering <a href="https://goatpr0n.farm/?p=35">another</a> USB device. The EZP2010 is an USB programmer for flash memory as used by mainboard manufactures to store the BIOS, or embedded devices to store the firmware (or settings). When it comes to data recovery on hard drives, or similar storage devices, these flashers can also become handy.</p>
<p><img src="https://dl.goatpr0n.events/$/7KvdF" alt=""></p>
<p>EZP2010 USB-Highspeed programmer</p>
<p>This particular programmer can be bought on many Chinese store or Amazon. The prize range varies form $8 to $24. Unfortunately the software and drivers which come with this programmer are windows only.</p>
<p>The micro controller unit (<em>MCU</em>) used is the <a href="https://www.silabs.com/documents/public/data-sheets/C8051F34x.pdf">C8051F340</a>. It was easily identified by opening the enclosure and looking at the markings of the <em>MCU</em>.</p>
<h2 id="start-of-an-adventure">Start of an adventure</h2>
<p><img src="https://dl.goatpr0n.events/$/Ulrgo" alt=""></p>
<p>Realistic representation of me, being outside and enjoining it. But without the running and the joy. I also have shoes and longer trousers.</p>
<p>As already mentioned, this adventure will be about reversing the USB protocol of this programmer.</p>
<p>To start with analyzing the programmer a virtual machine would be an easy solution. And here I came across another problem this programmer has. It is not necessarily the fault of the hardware, but of the drivers and software provided to use it.</p>
<p>I worked on this project on different host machines and different versions of a virtual machine. The main difference was the architecture used. One VM was a 64bit Windows 10 and the other a 32bit Windows 10. Trying to run the software on a 32bit system failed, the software was unable to connect to the programmer, but I could not find any drawback in using a 64bit Windows.</p>
<h3 id="information-gathering">Information Gathering</h3>
<p><img src="https://dl.goatpr0n.events/$/4vfbw" alt=""></p>
<p>Me looking for information.</p>
<p>The most obvious things to do are <code>lsusb</code> and opening up the enclosure. <code>Lsusb</code> will output all connected USB devices connected on a Linux machine and get the description, as well as the vendor id and product id for device identification.</p>
<p>The output of <code>lsusb</code> gives information on how to talk to the device. With the product and vendor id the verbose output of <code>lsusb</code> can be limited to display only the device of interest. USB devices have separate input and output &ldquo;endpoints&rdquo;. On this particular device the endpoint to send our data to is <code>0x02 EP 2 OUT</code> and <code>0x81 EP 1 IN</code> where I can receive the responses and incoming data.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ lsusb
<span style="color:#ae81ff">\[</span>...<span style="color:#ae81ff">\]</span>
Bus <span style="color:#ae81ff">003</span> Device 027: ID 10c4:f5a0 Cygnal Integrated Products, Inc.
<span style="color:#ae81ff">\[</span>...<span style="color:#ae81ff">\]</span>
$ lsusb -v -d 10c4:f5a0
Bus <span style="color:#ae81ff">003</span> Device 027: ID 10c4:f5a0 Cygnal Integrated Products, Inc.
Couldn<span style="color:#960050;background-color:#1e0010">&#39;</span>t open device, some information will be missing
Device Descriptor:
bLength <span style="color:#ae81ff">18</span>
bDescriptorType <span style="color:#ae81ff">1</span>
bcdUSB 2.00
bDeviceClass <span style="color:#ae81ff">0</span>
bDeviceSubClass <span style="color:#ae81ff">0</span>
bDeviceProtocol <span style="color:#ae81ff">0</span>
bMaxPacketSize0 <span style="color:#ae81ff">64</span>
** idVendor 0x10c4 Cygnal Integrated Products, Inc.
idProduct 0xf5a0**
bcdDevice 0.00
iManufacturer <span style="color:#ae81ff">0</span>
iProduct <span style="color:#ae81ff">0</span>
iSerial <span style="color:#ae81ff">0</span>
**bNumConfigurations 1**
Configuration Descriptor:
bLength <span style="color:#ae81ff">9</span>
bDescriptorType <span style="color:#ae81ff">2</span>
wTotalLength 0x0020
**bNumInterfaces 1**
bConfigurationValue <span style="color:#ae81ff">1</span>
**iConfiguration 0**
bmAttributes 0x80
<span style="color:#f92672">(</span>Bus Powered<span style="color:#f92672">)</span>
MaxPower 480mA
Interface Descriptor:
bLength <span style="color:#ae81ff">9</span>
bDescriptorType <span style="color:#ae81ff">4</span>
**bInterfaceNumber 0**
bAlternateSetting <span style="color:#ae81ff">0</span>
**bNumEndpoints 2**
bInterfaceClass <span style="color:#ae81ff">0</span>
bInterfaceSubClass <span style="color:#ae81ff">0</span>
bInterfaceProtocol <span style="color:#ae81ff">0</span>
**iInterface 0**
Endpoint Descriptor:
bLength <span style="color:#ae81ff">7</span>
bDescriptorType <span style="color:#ae81ff">5</span>
**bEndpointAddress 0x81 EP <span style="color:#ae81ff">1</span> IN**
bmAttributes <span style="color:#ae81ff">2</span>
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x <span style="color:#ae81ff">64</span> bytes
bInterval <span style="color:#ae81ff">5</span>
Endpoint Descriptor:
bLength <span style="color:#ae81ff">7</span>
bDescriptorType <span style="color:#ae81ff">5</span>
**bEndpointAddress 0x02 EP <span style="color:#ae81ff">2</span> OUT**
bmAttributes <span style="color:#ae81ff">2</span>
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x <span style="color:#ae81ff">64</span> bytes
bInterval <span style="color:#ae81ff">5</span>
</code></pre></div><p>In the beginning of this post, I already mentioned the used MCU for this programmer. It will not be of much of significance for this project but information is always nice to have. So the <em>C8051F340</em> by Silicon Labs can do different things, but the most important ones are Universal Serial Bus (USB) Controller and the Serial Peripheral Interface (SPI). The USB connection manages the communication between the host (PC) and the device. The SPI will manage the programming of the flash memory.</p>
<h3 id="vm-setup">VM Setup</h3>
<p>As previously told, I have used a 64bit Windows 10 virtual machine. For capturing the USB traffic I used <a href="https://wiki.wireshark.org/CaptureSetup/USB#Windows">Wireshark and USBPcap</a>. The workflow is the same as it is with network packet capturing. Instead of selecting a network interface, a USB root hub is selected where the device of interest is connected.</p>
<h3 id="packet-capturing">Packet Capturing</h3>
<p>At first I setup the packet capturing with Wireshark and select the USB root hub I want to monitor - and where I connect the programmer.</p>
<p>The next steps include a straight forward workflow, after Wireshark was configured and running. I started the programmer software. If Wireshark is configured correctly it reports the first packets captured during device initialization and opening the device by the software.</p>
<p>As there are not special device specific commands transferred during device and software initialization, these steps won&rsquo;t be necessary to cover here.</p>
<p>Now, if I press any button in the software to interact with the programmer, a corresponding reaction should be captured in Wireshark. To keep track which action resulted in which packets, Wireshark supports <em>comments</em> for their <em>pcapng</em> fileformat. When I press a button in the software, I comment the first packet captured and the last packet incoming.</p>
<p><img src="https://dl.goatpr0n.events/$/ijnRU" alt=""></p>
<p>Firmware version read from programmer device.</p>
<p>To keep it simple, I will illustrate this on the command to request the firmware version of the device. The button is labeled &ldquo;Ver&rdquo; in the toolbar. When clicked, two messages are transmitted between the host and the device which are captured by Wireshark.</p>
<p><img src="https://dl.goatpr0n.events/$/Pmke9" alt=""></p>
<p>Request and response packet content.</p>
<p>In the screen shot above, I commented the outgoing packet from the host to the programmer and labeled it &ldquo;Request firmware&rdquo;. The answer - which came immediately after the outgoing message. I labeled the packet as &ldquo;Request firmware: Answer&rdquo;. When I look into this dump a few days later, I will still be able to figure out what the cause of these packets were.</p>
<p>The firmware version request command are two bytes (<em>Leftover Capture Data</em> in the Wireshark window) <code>0x17 0x00</code>. The answer will be the version string <code>EZP2010 V3.0</code> and a few more bytes.</p>
<p>This way I worked through every function provided by the software to capture all possible commands. The &ldquo;Read&rdquo; and &ldquo;Prog&rdquo; ROM commands will produce a few more packets depending on the size of the flash chip. The outgoing or incoming packets either be the contents read from the flash chip or the data going to be written to the flash chip.</p>
<p>While capturing the packets should be almost enough, a look at the decompiled code of the program can help finding possible pitfalls.</p>
<h3 id="reversing-the-programmer-windows-software">Reversing the Programmer Windows Software</h3>
<p>This part was not really necessary, but helped in the process of packet analysis as well in matching the captured command packets with a function in the disassembled program.</p>
<p><img src="https://dl.goatpr0n.events/$/SeDcb" alt=""></p>
<p>Functions interacting with the programmer.</p>
<p>Each command supported by the programmer has a corresponding function. Matching all functions and command codes, I could see if I had found and captured all available commands the programmer hardware supports.</p>
<p>Refactoring the code generated by <a href="https://ghidra-sre.org/">Ghidra</a>, the result of reversing engineering a function could look like this. I am going through the code to request the firmware version.</p>
<p><img src="https://dl.goatpr0n.events/$/pKHQO" alt=""></p>
<p>Example of a reversed function to query the firmware version.</p>
<p>The code in the screenshot above sends two bytes to the programmer and than tries to read 23 (0x17) bytes as answer. The while loop at the bottom copies the contents of the <code>bufferIn</code> variable into the output argument variable <code>version</code>.</p>
<p>Just to clarify, the variables are pointers to a memory location at this point. the variable will store the address where the value (version string) is stored.</p>
<h3 id="writing-a-poc">Writing a POC</h3>
<p><img src="https://dl.goatpr0n.events/$/DQSgq" alt=""></p>
<p>Actual video of me coding a POC.</p>
<h4 id="python-poc">Python POC</h4>
<p>I often try to build my first proof of concept, or to validate my ideas, with a small Python program.</p>
<p>The code is based on the tutorial example provided by <a href="https://github.com/walac/pyusb/blob/master/docs/tutorial.rst">PyUSB</a>. I just added the other endpoint to read the responses from the programmer.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#75715e">#!/usr/bin/env python</span>
<span style="color:#f92672">import</span> usb.core
<span style="color:#f92672">import</span> usb.util
dev <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>find(idVendor<span style="color:#f92672">=</span><span style="color:#ae81ff">0x10c4</span>, idProduct<span style="color:#f92672">=</span><span style="color:#ae81ff">0xf5a0</span>)
dev<span style="color:#f92672">.</span>set_configuration()
cfg <span style="color:#f92672">=</span> dev<span style="color:#f92672">.</span>get\_active\_configuration()
intf <span style="color:#f92672">=</span> cfg\[(<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">0</span>)\]
epo <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find\_descriptor(intf, custom\_match<span style="color:#f92672">=</span><span style="color:#66d9ef">lambda</span> e:
usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress)
<span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_OUT)
epi <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find\_descriptor(intf, custom\_match<span style="color:#f92672">=</span><span style="color:#66d9ef">lambda</span> e:
usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress)
<span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_IN)
epo<span style="color:#f92672">.</span>write(\[<span style="color:#ae81ff">0x17</span>, <span style="color:#ae81ff">0x00</span>\])
s_buf <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;&#39;</span><span style="color:#f92672">.</span>join(\[chr(c) <span style="color:#66d9ef">for</span> c <span style="color:#f92672">in</span> epi<span style="color:#f92672">.</span>read(<span style="color:#ae81ff">256</span>)\])
<span style="color:#66d9ef">print</span>(s_buf)
</code></pre></div><p>Executing the test program will give something like &ldquo;<code>EZP2010 V3.0</code>&rdquo; and a few more additional bytes. Which should be expected, as the receiving buffer is defined with a size of 0x17 (23 bytes).</p>
<p>At the moment I have not looked into the remaining bytes and their purpose. The original software does not display any more information, but the version string.</p>
<h4 id="c-poc">C POC</h4>
<p>Doing it in C requires a bit more work. Below is the whole POC program source I have used to verify my work. The main part of the program is the USB device tree traversal to open and configure our target device. There is an easier to use function to do this with <a href="https://libusb.info/">libusb</a>.</p>
<p>But the function <a href="http://libusb.sourceforge.net/api-1.0/group__libusb__dev.html#ga11ba48adb896b1492bbd3d0bf7e0f665"><code>libusb_open_device_with_vid_pid()</code></a> gave me a bit of a trouble, as I was not able to configure the device properly to write and read data.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-c" data-lang="c"> <span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;stdlib.h&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span> <span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;stdio.h&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span> <span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;unistd.h&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;libusb-1.0/libusb.h&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#define EZP2010_VID 0x10c4
</span><span style="color:#75715e"></span> <span style="color:#75715e">#define EZP2010_PID 0xf5a0
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">static</span> libusb_device_handle <span style="color:#f92672">*</span>devh <span style="color:#f92672">=</span> NULL;
libusb_device_handle <span style="color:#f92672">*</span><span style="color:#a6e22e">open_ezp2010</span>()
{
ssize_t devc;
libusb_device <span style="color:#f92672">**</span>dev_list;
<span style="color:#66d9ef">static</span> libusb_device <span style="color:#f92672">*</span>dev <span style="color:#f92672">=</span> NULL;
<span style="color:#66d9ef">struct</span> libusb_device_descriptor dev_desc;
<span style="color:#66d9ef">struct</span> libusb_config_descriptor <span style="color:#f92672">*</span>dev_cfg <span style="color:#f92672">=</span> NULL;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">struct</span> libusb_interface <span style="color:#f92672">*</span>intf <span style="color:#f92672">=</span> NULL;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">struct</span> libusb_interface_descriptor <span style="color:#f92672">*</span>intf_desc <span style="color:#f92672">=</span> NULL;
<span style="color:#66d9ef">int</span> r <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
devc <span style="color:#f92672">=</span> libusb_get_device_list(NULL, <span style="color:#f92672">&amp;</span>dev_list);
<span style="color:#66d9ef">if</span> (devc <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">1</span>)
<span style="color:#66d9ef">return</span> NULL;
<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> devc; i<span style="color:#f92672">++</span>) {
dev <span style="color:#f92672">=</span> dev_list[i];
<span style="color:#66d9ef">if</span> (libusb_get_device_descriptor(dev, <span style="color:#f92672">&amp;</span>dev_desc))
<span style="color:#66d9ef">continue</span>;
<span style="color:#66d9ef">if</span> ((dev_desc.idVendor <span style="color:#f92672">!=</span> EZP2010_VID <span style="color:#f92672">||</span> dev_desc.idProduct <span style="color:#f92672">!=</span> EZP2010_PID))
<span style="color:#66d9ef">continue</span>;
r <span style="color:#f92672">=</span> libusb_open(dev, <span style="color:#f92672">&amp;</span>devh);
<span style="color:#66d9ef">if</span> (r <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">0</span>) {
perror(<span style="color:#e6db74">&#34;libusb_open&#34;</span>);
<span style="color:#66d9ef">return</span> NULL;
}
<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; j <span style="color:#f92672">&lt;</span> dev_desc.bNumConfigurations; j<span style="color:#f92672">++</span>) {
<span style="color:#66d9ef">if</span> (libusb_get_config_descriptor(dev, j, <span style="color:#f92672">&amp;</span>dev_cfg))
<span style="color:#66d9ef">continue</span>;
<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> k <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; k <span style="color:#f92672">&lt;</span> dev_cfg<span style="color:#f92672">-&gt;</span>bNumInterfaces; k<span style="color:#f92672">++</span>) {
intf <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>dev_cfg<span style="color:#f92672">-&gt;</span>interface[k];
<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> l <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; l <span style="color:#f92672">&lt;</span> intf<span style="color:#f92672">-&gt;</span>num_altsetting; l<span style="color:#f92672">++</span>) {
intf_desc <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>intf<span style="color:#f92672">-&gt;</span>altsetting[l];
<span style="color:#66d9ef">if</span> (libusb_kernel_driver_active(devh, intf_desc<span style="color:#f92672">-&gt;</span>bInterfaceNumber))
libusb_detach_kernel_driver(devh, intf_desc<span style="color:#f92672">-&gt;</span>bInterfaceNumber);
libusb_set_configuration(devh, dev_cfg<span style="color:#f92672">-&gt;</span>bConfigurationValue);
libusb_claim_interface(devh, intf_desc<span style="color:#f92672">-&gt;</span>bInterfaceNumber);
<span style="color:#66d9ef">int</span> e <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
<span style="color:#66d9ef">while</span> (libusb_claim_interface(devh, intf_desc<span style="color:#f92672">-&gt;</span>bInterfaceNumber) \
<span style="color:#f92672">&amp;&amp;</span> (e <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">10</span>)) {
sleep(<span style="color:#ae81ff">1</span>);
e<span style="color:#f92672">++</span>;
}
}
}
libusb_free_config_descriptor(dev_cfg);
}
<span style="color:#66d9ef">return</span> devh;
}
devh <span style="color:#f92672">=</span> NULL;
<span style="color:#66d9ef">return</span> NULL;
}
<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>(<span style="color:#66d9ef">int</span> argc, <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>argv[])
{
<span style="color:#66d9ef">int</span> r <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
<span style="color:#66d9ef">int</span> transferred <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
<span style="color:#66d9ef">unsigned</span> <span style="color:#66d9ef">char</span> buf[<span style="color:#ae81ff">256</span>];
r <span style="color:#f92672">=</span> libusb_init(NULL);
<span style="color:#66d9ef">if</span> (r <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">0</span>)
<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">1</span>;
open_ezp2010();
buf[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;\x17&#39;</span>;
buf[<span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;\x0&#39;</span>;
r <span style="color:#f92672">=</span> libusb_bulk_transfer(devh, <span style="color:#ae81ff">0x2</span>, buf, <span style="color:#ae81ff">2</span>, <span style="color:#f92672">&amp;</span>transferred, <span style="color:#ae81ff">500</span>);
<span style="color:#66d9ef">if</span> (r <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">0</span>) {
perror(<span style="color:#e6db74">&#34;libusb_claim_interface&#34;</span>);
fprintf(stderr, <span style="color:#e6db74">&#34;Error: %s</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>, libusb_strerror(r));
}
printf(<span style="color:#e6db74">&#34;Bytes sent: %d</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>, transferred);
r <span style="color:#f92672">=</span> libusb_bulk_transfer(devh, <span style="color:#ae81ff">0x81</span>, buf, <span style="color:#ae81ff">0x20</span>, <span style="color:#f92672">&amp;</span>transferred, <span style="color:#ae81ff">500</span>);
<span style="color:#66d9ef">if</span> (r <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">0</span>) {
perror(<span style="color:#e6db74">&#34;libusb_claim_interface&#34;</span>);
fprintf(stderr, <span style="color:#e6db74">&#34;Error: %s</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>, libusb_strerror(r));
}
printf(<span style="color:#e6db74">&#34;Bytes received: %d</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>, transferred);
printf(<span style="color:#e6db74">&#34;Packet: %s</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>, buf);
libusb_release_interface(devh, <span style="color:#ae81ff">0</span>);
libusb_reset_device(devh);
libusb_close(devh);
libusb_exit(NULL);
<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div><h3 id="future-work">Future Work</h3>
<p>My idea is to integrate it into existing programmer software, or to implement a small standalone tool for this programmer.</p>
<p>There is also still some research to do on the support for different flash chips. The original software provides a database with known and supported flash chips.</p>
<p>Looking at the code and figuring out the database structure might be the next step in further reverse engineering and developing further support for this programmer.</p>
<h4><a href="https://goatpr0n.farm/">Back to Home</a></h4>
</div>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,406 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<div class="row-fluid navmargin">
<div class="page-header">
<h1>Reverse Engineering of the SkyRC MC3000 Battery Charger USB Protocol - Mon, Mar 18, 2019</h1>
</div>
<p class="lead"></p>
<h2 id="software-requirements">Software Requirements</h2>
<p>Decompiler for .NET programs</p>
<ul>
<li><a href="https://www.jetbrains.com/decompiler/">dotPeek</a></li>
</ul>
<p>The implementation of the protocol is then written in <em>Python</em>. Let&rsquo;s hear what the curator has to say:</p>
<p>Tell me about <em>Python</em>.</p>
<pre><code>&gt; Wow. Much Snake. Easy programming!
&gt;
&gt; \- Doge
</code></pre>
<p>Tell me about <em>dotPeek</em>.</p>
<pre><code>&gt; Easy decompilation. Readable syntax. Very easy.
&gt;
&gt; \- Doge
</code></pre>
<h2 id="analyzing-mc3000_monitor">Analyzing MC3000_Monitor</h2>
<h3 id="decompiling">Decompiling</h3>
<p>Start <em>dotPeek</em> and use Drag&rsquo;n&rsquo;Drop to load the Application. Or uSe <strong>CtRL+O</strong> anD LoCATe tHe fILe uSiNg ThE bOrwsEr. I am not your mother! The file will show up in the <em>Assembly Explorer</em>. You can expand and collapse nodes within the tree. Familiarize yourself with the program structure. Try to find the entry point or other &ldquo;important&rdquo; functions, modules or resources.</p>
<p><img src="https://dl.goatpr0n.events/$/dQCmQ" alt=""></p>
<p>If you right click the <strong>MC3000_Monitor</strong> node you can export the project with individual source files. This project is stored as <em>*.cs</em> source files.</p>
<p>You should now have either the project loaded into <em>dotPeek</em> or - in addition - saved it as project and/or loaded it into <em>Visual Studio (VS)</em> (Not covered here). I cannot afford <em>VS</em>. Still saving money to upgrade my IDA Pro license.</p>
<pre><code> Intermission:
This is the curator speaking, and I command you to stop whining, 'JPK'.
</code></pre>
<p>As you can see, a lot of professionalism.</p>
<h3 id="exploring-the-code">Exploring the code</h3>
<p>For me the easiest way to begin, is to find parts of code where user interaction is required. Run the program and look at the user interface. In this particular case we have four buttons next to a label each.</p>
<p>Lets explore the code in <em>dotPeek</em> and see if we can find some code that might look familiar.</p>
<p><img src="https://dl.goatpr0n.events/$/yWSxh" alt=""></p>
<p>Pressing one of the buttons opens another window where you can configure the charger slot. By further reading through the different functions you might come across the function <code>InitializeComponents():void</code>. Each window element gets setup and function callbacks/events are registered.</p>
<p>You eventually find something like this (see the picture below).</p>
<p><img src="https://dl.goatpr0n.events/$/lRBYC" alt=""></p>
<p>Let&rsquo;s put on our smart looking spec ticals and read line 3468 and 3470. Line 3468 is the creation of the button text, which should look familiar. If not, search for hints on <a href="https://goatpr0n.farm">this page</a>. Line 3470 binds a function to the button press. With a <strong>Ctrl+Left click</strong> we jump to the function definition in <em>dotPeek</em>.</p>
<p>The function <code>private void button1_Click_1(object sender, EventArgs e)</code> is pretty simple to read. When the button is clicked, get the button name (e.g. &ldquo;button1&rdquo; [1]) and check if there is either the number <code>1</code>, <code>2</code>, <code>3</code> or <code>4</code> in the name.</p>
<p><img src="https://dl.goatpr0n.events/$/Wul71" alt=""></p>
<p>Can you see the problem here? There is no error handling if button number is smaller than one or greater four. As an array is indexed, the program will probably crash. At this point we don&rsquo;t care. We want to make our own library, to make it better or different. After the name checking to know which slot is addressed, it calls a function <code>public void Set_Battery_Type_Caps(ChargerData[]data, int index)</code>. The functions sets the parameters of each battery slot and saves the values to an array.</p>
<p>This function sums up all parameters we need to know to setup a charger slot by or self. And we now know the default values. The below listing is the exception code, if anything goes wrong in the code above, but not when using an index outside bounds.</p>
<pre><code>// Battery.cs:1195
data[index].Type = 0;
data[index].Caps = 2000;
data[index].Mode = 0;
data[index].Cur = 1000;
data[index].dCur = 500;
data[index].End_Volt = 4200;
data[index].Cut_Volt = 3300;
data[index].End_Cur = 100;
data[index].End_dCur = 400;
data[index].Cycle_Mode = 0;
data[index].Cycle_Count = 1;
data[index].Cycle_Delay = 10;
data[index].Peak_Sense = 3;
data[index].Trickle = 50;
data[index].Hold_Volt = 4180;
data[index].CutTemp = 450;
data[index].CutTime = 180;
</code></pre>
<p>The data structure <code>ChargerData</code> can be looked up as well, but the above listing is a little bit easier to read.</p>
<p>What we haven&rsquo;t seen at this point were bytes transferred to or from the device.</p>
<p><img src="https://dl.goatpr0n.events/$/DVfA2" alt=""></p>
<p>At this point, there are multiple ways to get a good starting point on finding the functions where data is transmitted or received. One option is to look at the Assembly Explorer again for functions names of possible interest.</p>
<p><img src="https://dl.goatpr0n.events/$/WJAOM" alt=""></p>
<p>These convenient looking functions. Or should I say obvious function names are obvious, are used to handle the USB device communication. Try right clicking a function to find out where it is used. I have used <code>usbOnDataRecieved</code>. In the below window with search results you can find a reference located in the constructor [2] of the class <code>FormLoader</code>.</p>
<pre><code>// FormLoader.cs:352
this.usb = new UsbHidPort();
this.usb.ProductId = 1;
this.usb.VendorId = 0;
this.usb.OnSpecifiedDeviceArrived += new EventHandler(this.usbOnSpecifiedDeviceArrived);
this.usb.OnSpecifiedDeviceRemoved += new EventHandler(this.usbOnSpecifiedDeviceRemoved);
this.usb.OnDeviceArrived += new EventHandler(this.usbOnDeviceArrived);
this.usb.OnDeviceRemoved += new EventHandler(this.usbOnDeviceRemoved);
this.usb.OnDataRecieved += new DataRecievedEventHandler(this.usbOnDataRecieved);
this.usb.OnDataSend += new EventHandler(this.usbOnDataSend);
</code></pre>
<p>These lines above register event handlers with an instance of <code>UsbHidPort</code>. An event might be connecting or disconnecting the device (line: 355-358) or transferred data (line: 359-360). There is nothing special about the connect functions, except for <code>usbOnSpecifiedDevice...</code> ones. There is a call to stop and stop the <code>timer2</code> instance. We will look at this object in a second, but first we have a look at <code>usbOnDataSend</code> and <code>usbOnDataRecieved</code>.</p>
<pre><code>// FormLoader.cs:513
private void usbOnDataRecieved(object sender, DataRecievedEventArgs args)
{
if (this.InvokeRequired)
{
try
{
this.Invoke((Delegate) new DataRecievedEventHandler(this.usbOnDataRecieved), sender, (object) args);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
else
{
++this.packet_counter;
for (int index = 0; index &lt; 65; ++index)
this.inPacket[index] = args.data[index];
this.dataReceived = true;
}
}
...
// FormLoader.cs:580
private void usbOnDataSend(object sender, EventArgs e)
{
this.Text = &quot;ChargeMonitor V2 Connect&quot;;
this.label_usb_status.Text = &quot;USB ON&quot;;
this.label_usb_status.ForeColor = Color.Green;
}
</code></pre>
<p>The <code>usbOnDataSend</code> function is boring, and we can ignore it. There is no active sending of data to the usb device. <code>UsbOnDataReceived</code> on the other hand is actually doing something with an buffer of 64 bytes (line: 528-531).</p>
<p>When data is received an internal <code>packet_counter</code> is increased. Each packet has a size of 64 bytes (line: 529). The packet is copied into the <code>inPacket</code> array, and the <code>dataReceived</code> variable is set to true.</p>
<p>My guess is, that somewhere, something, somehow, might be, is waiting for a packet to arrive and waits until <code>dataReceived</code> is true. In <em>dotPeek</em> we can use the magic function &ldquo;Find Usages&rdquo; again, to find out more.</p>
<p><img src="https://dl.goatpr0n.events/$/HdRfX" alt=""></p>
<h3 id="prototyping-and-understanding-the-program">Prototyping and understanding the program</h3>
<p>Remember the <code>timer2</code> instance mentioned before? No, try to find the hint on <a href="https://goatpr0n.farm">this page</a>.</p>
<pre><code>// Formload.cs:1219
private void timer2_Tick(object sender, EventArgs e)
{
byte num1 = 0;
if (!this.dataReceived)
return;
this.dataReceived = false;
if ((int) this.inPacket[1] == 240)
{
if (this.bwrite_chrager_data)
return;
int num2 = (int) MessageBox.Show(&quot;OK!&quot;);
}
else if ((int) this.inPacket[1] == 95)
this.Get_Charge_Data((int) this.inPacket[2]);
else if ((int) this.inPacket[1] == 90)
{
this.Get_System_Data((int) this.inPacket[3]);
}
else
{
if ((int) this.inPacket[1] != 85)
return;
for (int index = 1; index &lt; 64; ++index)
num1 += this.inPacket[index];
if ((int) num1 != (int) this.inPacket[64])
return;
</code></pre>
<p>The <code>timer2</code> will process incoming data send from the device to the connected computer. The code begins with comparing index 1 of the <code>inPacket</code> with a series of values.</p>
<p>By looking at the code we might be able to assume we are looking at the first bytes necessary to communicate with the device. Here are some guesses:</p>
<pre><code>Value Description
240 (0xf0) Confirmation sent by charger.
95 (0x5f) Get charger data by information provided in index 2,
which is an number \[4\].
90 (0x5a) Get system data by information provided in index 3,
which is a number.
85 (0x55) Do not process the packet here. Otherwise calculate
the sum of all bytes in `num1` and compare it to the
information stored in index 64.
</code></pre>
<p>If these checks do not result in an premature <code>return</code>, the values from <code>inPacket</code> are copied into variables. Some variable names are recognizable and help in our guessing game to find out what this function does.</p>
<p><img src="https://dl.goatpr0n.events/$/nRAoH" alt=""></p>
<p>With the looks of it we are reading battery information. As an example on how the packet is decoded, we will have a look at the following code:</p>
<pre><code>this.Current[j] = (int) this.inPacket[11] * 256 + (int) this.inPacket[12];
</code></pre>
<p>The contents of <code>inPacket</code> index 11 and 12 is assigned the the variable <code>Current</code> at index <code>j</code>. Which is irrelevant at this point. But we need to understand what is happing with this multiplication and addition.</p>
<p>The multiplication by 256 is just a different way to express a left shift by 8. What happens, when we take the value 1 and multiply it by 256 or do a left shift by 8? In binary representation it will become very easy to understand.</p>
<pre><code> 1 =&gt; 0b1
256 =&gt; 0b100000000
</code></pre>
<p>So what if we take 256 times 1?</p>
<pre><code> 256 =&gt; 0b100000000
</code></pre>
<p>And if we take the value <code>0b1</code> and move the <code>1</code> exactly 8 positions to the left, like a left shift, <em>duh</em>?</p>
<pre><code> 1 &lt;&lt; 0 = 0b1
1 &lt;&lt; 1 = 0b10
1 &lt;&lt; 2 = 0b100
1 &lt;&lt; 3 = 0b1000
1 &lt;&lt; 4 = 0b10000
1 &lt;&lt; 5 = 0b100000
1 &lt;&lt; 6 = 0b1000000
1 &lt;&lt; 7 = 0b10000000
1 &lt;&lt; 8 = 0b100000000
</code></pre>
<p>This is just a step by step illustration. Computer do fast. Computer do in single step.</p>
<p>After the left shift, the second value is added to the variable. In other words, we are reading two bytes and concatenate it to have a word (2 bytes).</p>
<p>The same applies to the other functions <code>Get_Charge_Data</code> and <code>Get_System_Data</code> where the <code>inPacket</code> is read.</p>
<p>But how am I supposed to create my own library with this?</p>
<p><img src="https://dl.goatpr0n.events/$/ga4cq" alt=""></p>
<p>This is the part, where you take your favorite language, or a language good for prototyping and begin coding. First challenge would be to connect to the USB device. I am using the <code>pyusb</code> module with <em>Python</em>.</p>
<p>To connect an USB device we want to make sure we are using the right one. To do so, the USB devices can be identified by different properties, and one of them is the vendor and product id. The source of the program might give us enough information we need, as it needs to connect to the charger as well.</p>
<p>The product and vendor id can be found in the function <code>private void usbSendConnectData()</code> and is defined as:</p>
<pre><code>Field Value
Vendor ID 0
Product ID 1
</code></pre>
<h4 id="reading-data">Reading Data</h4>
<p>The people writing the firmware for the charger, did not care to give it some nice values, on the other hand 0 and 1 are nice. With these identifiers, it is possible to connect to our charger.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"> <span style="color:#f92672">import</span> usb
usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>find(idVendor<span style="color:#f92672">=</span><span style="color:#ae81ff">0</span>, idProduct<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>)
</code></pre></div><p>This will return a list of devices, even when the list is empty or contains just one element. Set up the USB device further and start building your first packet to send. Before blindly sending commands to the charger, what would be the most destructive - errr - non destructive command: getting device information.</p>
<p>Do some reads on the device without sending anything to it. Eventually you will receive a packet.</p>
<p>In this scenario the packets have a common format for receiving and sending. You might notice a <code>0x0f</code> at the beginning of each packet. As <em>dotPeek</em> is unable to tell you where it comes from and where it is designed, I am going to spoil it for you.</p>
<p>In file <code>FormLoader.cs</code> in line 201 we find the following definition:</p>
<pre><code>public const byte UART_DATA_START = 15;
</code></pre>
<p>The UART [6] we are basically telling the charger we are coming over USB. There is also a mobile application to send commands via Bluetooth, but I haven&rsquo;t done this one, yet.</p>
<p>There is function called <code>Get_System_Data</code>. When we look at the definition of the function the code is very messy.</p>
<p><img src="https://dl.goatpr0n.events/$/JP7Lc" alt=""></p>
<p>Alot [5]_ of constant values are assigned to variables, which are assigned to variables and then used as index. This looks confusing but the best way is to just begin prototyping it the same way.</p>
<pre><code>num1 = 0
str1 = ''
num2 = 4
# Do not kown this yet
inPacket = raw_packet # raw_packet is the contents read by pyusb.
index1 = num2
num3 = 1
num4 = index1 + num3
num5 = int(inPacket[index1], 16) # Python 3: probably bytes as input.
...
</code></pre>
<p>And so on. After building your prototyped function you will see parts which can be optimized, but do not care about it too much in the beginning. Try to understand how packets are constructed and what they contain. But for example the <code>num2 = 4</code> could be removed and replaced with <code>index1 = 4</code>, as <code>num2</code> is not used after that point.</p>
<p>By breaking the packet down, byte by byte (there are only 64 bytes), we then try to create data structures from it, like the one mentioned in the beginning. Each information gathered so far helps in decoding packets received and to later send packets.</p>
<p>For decoding packets I personally use the <code>[Python struct](https://docs.python.org/3/library/struct.html)</code> module. By reading the definition of <code>Get_System_Data</code> we define a system class, and <code>machine_info</code> as <code>FormLoader.cs</code> calls it.</p>
<p>With <code>struct</code> we define a data structure which can parse the 64 bytes each packet has and apply it to a named tuple in <em>Python</em>. After reading the original decompiled code, I came up with this definition:</p>
<pre><code>#: Machine response data
MACHINE_INFO_STRUCT = '&gt;3xBBBBBBBBBBBBB6sBBhBBBBbB'
#: Tuple for device information
MachineInfo = namedtuple('machine_info',
['Sys_Mem1', 'Sys_Mem2', 'Sys_Mem3', 'Sys_Mem4',
'Sys_Advance', 'Sys_tUnit', 'Sys_Buzzer_Tone',
'Sys_Life_Hide', 'Sys_LiHv_Hide',
'Sys_Eneloop_Hide', 'Sys_NiZn_Hide', 'Sys_Lcd_time',
'Sys_Min_Input', 'core_type', 'upgrade_type',
'is_encrypted', 'customer_id', 'language_id',
'software_version_hi', 'software_version_lo',
'hardware_version', 'reserved', 'checksum',
'software_version', 'machine_id'])
</code></pre>
<p>The struct definition <code>MACHINE_INFO_STRUCT</code> describes how each byte of the packet should be interpreted. In words:</p>
<ul>
<li>We decode it as big-endian.</li>
<li>Ignore 3 bytes as these are protocol commands.</li>
<li>Read 14 unsigned bytes (0..255), each into a separate variable.</li>
<li>Read 6 characters or a string of length 6.</li>
<li>Read 2 individual bytes.</li>
<li>Read a short (2 bytes).</li>
<li>Read 4 individual unsigned bytes.</li>
<li>Read a signed byte (-128..127).</li>
<li>Read a unsigned byte.</li>
</ul>
<p>The <code>MachineInfo</code> is a <code>[namedtuple](https://docs.python.org/3/library/collections.html#collections.namedtuple)</code>, to make it very easy to assign and access values. When we receive a packet and we have determined the type, we can do something like this:</p>
<pre><code>data = unpack(MACHINE_INFO_STRUCT, response[:32])
machine = MachineInfo(\*data, 0, machine_id)
</code></pre>
<h4 id="sending-data">Sending Data</h4>
<p>While reading data is one side, we also need send commands. When optimizing the code the <code>private bool Send_USB_CMD(int Solt, byte CMD)</code> function can be annoying, but refactoring the prototype code will very quickly tell you where to place your bytes.</p>
<p>Whilst the original code is hiding the <code>CMD</code> parameter position behind some index calculations (which lies in nature of decompilation) we can translate the following code:</p>
<p><img src="https://dl.goatpr0n.events/$/JEIdW" alt=""></p>
<p>To a single byte-string if we use the <code>Get_System_Data</code> CMD code 95:</p>
<pre><code>\x0f\x00\x5a\x00
</code></pre>
<p>One really annoying thing is the index counting. The program starts filling the <code>outPacket</code> at offset 1. Which is actually 0, which is always set to <code>0x0f</code>. It is protocol definition.</p>
<p>Tricky thing is the real offset 1. It has to be set to a specific value. To find out which one, we have to further investigate the code. This changes depending on the operation you want to call.</p>
<p><img src="https://dl.goatpr0n.events/$/JYRNp" alt=""></p>
<p>Going further through the code, we might find a location where it sets the offset 1 to a other value than 0. Eventually the offset becomes 4. The command so far is now:</p>
<pre><code>\x0f\x03\x5a\x00
</code></pre>
<p>Sending this to the device returns no result, therefore we are still missing something. Somewhere was a loop adding up all bytes of packet. This could be a checksum and/or the command is still incomplete. Let&rsquo;s look at the <code>Send_USB_CMD</code> again. When working through the code, it is help full to take notes.</p>
<p><em>I have removed a switch-case statement for your convenience.</em></p>
<p><img src="https://dl.goatpr0n.events/$/tkE9j" alt=""></p>
<p>After working through the code, taking notes. the resulting packet for <code>CMD=95, Solt=0</code> [7] should look like this:</p>
<pre><code>\x00\x0f\x03\x5a\x00\x00\x5d\xff\xff
</code></pre>
<p>The two bytes of <code>\xff</code> (255) at the end define the end a packet. Every packet is produced after this schema.</p>
<pre><code>Byte Description
1 It is always 0, you will learn soon enough why! _ARRGHGGHG_
2 Start of message (Always 0x0f (15)).
3 Calculate the value based on the index.
4 The command op code.
5 It is 0.
6 The slot index (0 to 3 (4 Slots)).
7 The sum of the variable data (Byte 3 to 6)
8 Is always 0xff (255)
9 Is always 0xff (255)
</code></pre>
<p>Sending this to the device is still not correct, why? To find out why, delving deeper into the nested classes we find an abomination. The decompiled code for SpecifiedOutputReport.cs in <code>class UsbLibrary.SpecifiedOutputReport</code>, there is this one function:</p>
<pre><code>public bool SendData(byte[] data)
{
byte[] buffer = this.Buffer;
for (int index = 1; index &lt; buffer.Length; ++index)
buffer[index] = data[index];
return true;
}
</code></pre>
<p>The line 19 defines a loop starting at index 1…</p>
<p><img src="https://dl.goatpr0n.events/$/N97jA" alt=""></p>
<p>With all this knowledge collected the final valid packet to send to your device is:</p>
<pre><code>\x0f\x03\x5a\x00\x00\x5d\xff\xff
</code></pre>
<p>That&rsquo;s it. We have done it.</p>
<p>KTHXBYE!</p>
<ol>
<li>BTW, giving descriptive names for your variables is totally over rated.</li>
<li>Bob, is it you? [3]</li>
<li>Stupidest joke so far. He is no constructor, he is a builder.</li>
<li>As you might have noticed. I am just reading and translating the code.</li>
<li>|alot| this was an intentional typo.</li>
<li>Universal Asynchronous Receiver/Transmitter</li>
<li>Solt <em>[SIC]</em></li>
</ol>
<h4><a href="https://goatpr0n.farm/">Back to Home</a></h4>
</div>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,108 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<div class="row-fluid navmargin">
<div class="page-header">
<h1>[Teaser] How to reverse engineer communication protocols of embedded devices - Sat, Feb 16, 2019</h1>
</div>
<p class="lead"></p>
<h2 id="sneak-preview">Sneak Preview</h2>
<p><img src="https://dl.goatpr0n.events/$/aAdcT" alt=""></p>
<p>These letters. Such announcement. Many words.</p>
<p>In the next few days I will publish two - not one - but two articles on how to approach a problem on how to reverse engineer protocols. There have been to applications I looked into to code a library for my home uses.</p>
<h2 id="1---mc3000-charger">#1 - MC3000 Charger</h2>
<p><a href="https://www.skyrc.com/MC3000_Charger">MC3000_Charger</a> provides an USB and Bluetooth (BT) interface (Spoiler: I am not covering the BT interface. Not yet). The USB interface is used to update the firmware and to program and interact with the charger during charging.</p>
<p>The Windows software provided by SkyRC can program each slot individually to support different types of batteries with different charging capacities.</p>
<p>As a result of my analysis, and this will be one of the upcoming articles, I reversed the application and wrote a Python library. To do so I dissected a .NET application. So no big magic here!</p>
<h2 id="2---lw12-wifi-led-controller">#2 - LW12 WiFi LED Controller</h2>
<p>This was a tricky one. It is a low budget Chinese WiFi LED controlled with a mobile app. The Android app I looked at was encrypted using a separate VM layer on-top of the Dalvik engine. (Spoiler: No need to reverse this, and I did not do it.)</p>
<p>Sometimes there are simpler solutions. This is what the second article will be about.</p>
<p>The controller itself comes by many names: <a href="https://www.amazon.de/Foxnovo-Wireless-Strip-Regler-Smartphone-Tabletten/dp/B00Q6FKPZI">Foxnovo</a> and I remember buying it as a <a href="https://www.amazon.de/LAGUTE-Strips-Controller-Android-System/dp/B00G55329A">Lagute</a>.</p>
<p>KTHXBYE.</p>
<h4><a href="https://goatpr0n.farm/">Back to Home</a></h4>
</div>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,100 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<div class="row-fluid navmargin">
<div class="page-header">
<h1>There is not enough cyber in the world - Mon, Jan 21, 2019</h1>
</div>
<p class="lead"></p>
<p>My recent favuorite hash tags in social networks are:</p>
<pre><code>- cyberwar / cyberkrieg
- cold-cyberwar / kalter cyberkrieg
</code></pre>
<p>KTHXBYE</p>
<h4><a href="https://goatpr0n.farm/">Back to Home</a></h4>
</div>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,96 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<div class="row-fluid navmargin">
<div class="page-header">
<h1>Welcome to the farm! - Tue, Feb 5, 2019</h1>
</div>
<p class="lead"></p>
<p>This magnificent piece of blog is now available under <a href="https://goatpr0n.farm/">https://goatpr0n.farm/</a>. Marvelous!</p>
<h4><a href="https://goatpr0n.farm/">Back to Home</a></h4>
</div>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,147 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<div class="row-fluid navmargin">
<div class="page-header">
<h1>What if the cult of dd is right? - Wed, Jan 23, 2019</h1>
</div>
<p class="lead"></p>
<h2 id="are-you-a-believer">Are you a believer?</h2>
<p>There are articles out there talking about the useless usage of <code>dd</code> and why <code>cat</code> is better. <code>Cat</code> is faster because it automatically adjusts the blocksize and <code>dd</code> is slow because it internally only works with 512 byte blocks. <a href="https://eklitzke.org/the-cult-of-dd">This</a> and <a href="https://www.vidarholen.net/contents/blog/?p=479">That</a>.</p>
<p>I did some simple tests with <code>time</code>, <code>dd</code> and <code>cat</code>, added some obscure parameters to <code>dd</code>, because <code>cat</code> is better.</p>
<h3 id="testing-dd-with-status-and-specific-blocksize">Testing <code>dd</code> with status and specific blocksize</h3>
<pre><code> $ time dd if=/dev/sdd of=test.dd status=progress bs=8M
15921577984 bytes (16 GB, 15 GiB) copied, 878 s, 18.1 MB/s
1899+1 records in
1899+1 records out
15931539456 bytes (16 GB, 15 GiB) copied, 879.018 s, 18.1 MB/s
0.04s user 23.33s system 2% cpu 14:39.03 total
</code></pre>
<h3 id="testing-dd">Testing <code>dd</code></h3>
<pre><code> $ dd if=/dev/sdd of=test.dd
31116288+0 records in
31116288+0 records out
15931539456 bytes (16 GB, 15 GiB) copied, 869.783 s, 18.3 MB/s
16.13s user 159.22s system 20% cpu 14:29.80 total
</code></pre>
<h3 id="testingcat-with-pv">Testing<code>cat</code> with <code>pv</code></h3>
<pre><code> $ time cat /dev/sdd | pv &gt; test.raw
14.8GiB 0:14:43 [17.2MiB/s] [ &lt;=&gt; ]
0.28s user 25.84s system 2% cpu 14:43.18 total
</code></pre>
<h3 id="testing-cat">Testing <code>cat</code></h3>
<pre><code> $ time dd if=/dev/sdd of=test.dd status=progress bs=8M
15921577984 bytes (16 GB, 15 GiB) copied, 878 s, 18.1 MB/s
1899+1 records in
1899+1 records out
15931539456 bytes (16 GB, 15 GiB) copied, 879.018 s, 18.1 MB/s
0.04s user 23.33s system 2% cpu 14:39.03 total
</code></pre>
<h3 id="testing-dd-1">Testing <code>dd</code></h3>
<pre><code> $ dd if=/dev/sdd of=test.dd
31116288+0 records in
31116288+0 records out
15931539456 bytes (16 GB, 15 GiB) copied, 869.783 s, 18.3 MB/s
16.13s user 159.22s system 20% cpu 14:29.80 total
</code></pre>
<h3 id="testing-catwith-pv">Testing <code>cat</code>with <code>pv</code></h3>
<pre><code> $ time cat /dev/sdd | pv &gt; test.raw
14.8GiB 0:14:43 [17.2MiB/s] [ &lt;=&gt; ]
0.28s user 25.84s system 2% cpu 14:43.18 total
</code></pre>
<h3 id="testing-cat-1">Testing <code>cat</code></h3>
<pre><code> $ time cat /dev/sdd &gt; test.raw
0.18s user 21.21s system 2% cpu 14:42.25 total
</code></pre>
<h3 id="y-u-do-it-wrong">Y U DO IT WRONG</h3>
<p>Somehow my <code>cat</code> is not as fast as <code>dd</code>.</p>
<p>KTHBYE</p>
<h4><a href="https://goatpr0n.farm/">Back to Home</a></h4>
</div>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1 @@
<!DOCTYPE html><html><head><title>https://goatpr0n.farm/posts/</title><link rel="canonical" href="https://goatpr0n.farm/posts/"/><meta name="robots" content="noindex"><meta charset="utf-8" /><meta http-equiv="refresh" content="0; url=https://goatpr0n.farm/posts/" /></head></html>

159
public/sitemap.xml Normal file
View File

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://goatpr0n.farm/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/posts/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/categories/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/tags/flasher/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/tags/ghidra/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/tags/hacking/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/tags/hardware/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/categories/hardware/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/tags/programmer/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/tags/reverse-engineering/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/categories/reverse-engineering/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/tags/rom/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/tags/</loc>
<lastmod>2019-11-28T12:01:53+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/categories/cyber/</loc>
<lastmod>2019-09-25T15:22:58+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</loc>
<lastmod>2019-09-25T15:22:58+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/tags/jtag/</loc>
<lastmod>2019-09-25T15:22:58+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/tags/ctf/</loc>
<lastmod>2019-07-24T12:19:47+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/categories/ctf/</loc>
<lastmod>2019-07-24T12:19:47+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</loc>
<lastmod>2019-07-24T12:19:47+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/tags/python/</loc>
<lastmod>2019-07-24T12:19:47+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/posts/reverse-engineering-of-the-skyrc-mc3000-battery-charger-usb-protocol/</loc>
<lastmod>2019-03-18T16:49:39+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/posts/teaser-how-to-reverse-engineer-communication-protocols-of-embedded-devices/</loc>
<lastmod>2019-02-16T01:25:34+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/categories/brain-fart/</loc>
<lastmod>2019-02-05T18:45:08+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/25.html</loc>
<lastmod>2019-02-05T18:45:08+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/categories/uncategorized/</loc>
<lastmod>2019-02-05T18:17:12+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/posts/welcome-to-the-farm/</loc>
<lastmod>2019-02-05T18:17:12+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/posts/can-i-haz-ur-dataz/</loc>
<lastmod>2019-02-01T09:55:07+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/posts/what-if-the-cult-of-dd-is-right/</loc>
<lastmod>2019-01-23T00:47:15+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/posts/there-is-not-enough-cyber-in-the-world/</loc>
<lastmod>2019-01-21T15:21:23+00:00</lastmod>
</url>
<url>
<loc>https://goatpr0n.farm/tags/index/</loc>
</url>
</urlset>

100
public/tags/ctf/index.html Normal file
View File

@ -0,0 +1,100 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>CTF</h1>
</header>
</article>
<ul>
<li>
<a href="/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/">2019-07-24 | Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

27
public/tags/ctf/index.xml Normal file
View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>CTF on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/tags/ctf/</link>
<description>Recent content in CTF on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Wed, 24 Jul 2019 12:19:47 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/tags/ctf/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</title>
<link>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</link>
<pubDate>Wed, 24 Jul 2019 12:19:47 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</guid>
<description>#MemeFreeEdition
The Challenge You are provided a zip file containing two files.
program vm.py The file program contains instructions encoded as emojis for a virtual machine called vm.py. At the bottom of vm.py I found a list, or lets call it a translation table, with emojis and their function name counter part.
OPERATIONS = { &amp;#39;🍡&amp;#39;: add, &amp;#39;🤡&amp;#39;: clone, &amp;#39;📐&amp;#39;: divide, &amp;#39;😲&amp;#39;: if_zero, &amp;#39;😄&amp;#39;: if_not_zero, &amp;#39;🏀&amp;#39;: jump_to, &amp;#39;🚛&amp;#39;: load, &amp;#39;📬&amp;#39;: modulo, &amp;#39;⭐&amp;#39;: multiply, &amp;#39;🍿&amp;#39;: pop, &amp;#39;📤&amp;#39;: pop_out, &amp;#39;🎤&amp;#39;: print_top, &amp;#39;📥&amp;#39;: push, &amp;#39;🔪&amp;#39;: sub, &amp;#39;🌓&amp;#39;: xor, &amp;#39;⛰&amp;#39;: jump_top, &amp;#39;⌛&amp;#39;: exit } To execute program with vm.</description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,100 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>flasher</h1>
</header>
</article>
<ul>
<li>
<a href="/posts/reverse-engineering-of-a-flash-programmer-ezp2010/">2019-11-28 | Reverse Engineering of a Flash Programmer :: EZP2010</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>flasher on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/tags/flasher/</link>
<description>Recent content in flasher on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Thu, 28 Nov 2019 12:01:53 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/tags/flasher/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Reverse Engineering of a Flash Programmer :: EZP2010</title>
<link>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</guid>
<description>Preface In today&amp;rsquo;s adventure I like to take you with me on my journey of reverse engineering another USB device. The EZP2010 is an USB programmer for flash memory as used by mainboard manufactures to store the BIOS, or embedded devices to store the firmware (or settings). When it comes to data recovery on hard drives, or similar storage devices, these flashers can also become handy.
EZP2010 USB-Highspeed programmer
This particular programmer can be bought on many Chinese store or Amazon.</description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,100 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>ghidra</h1>
</header>
</article>
<ul>
<li>
<a href="/posts/reverse-engineering-of-a-flash-programmer-ezp2010/">2019-11-28 | Reverse Engineering of a Flash Programmer :: EZP2010</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>ghidra on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/tags/ghidra/</link>
<description>Recent content in ghidra on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Thu, 28 Nov 2019 12:01:53 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/tags/ghidra/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Reverse Engineering of a Flash Programmer :: EZP2010</title>
<link>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</guid>
<description>Preface In today&amp;rsquo;s adventure I like to take you with me on my journey of reverse engineering another USB device. The EZP2010 is an USB programmer for flash memory as used by mainboard manufactures to store the BIOS, or embedded devices to store the firmware (or settings). When it comes to data recovery on hard drives, or similar storage devices, these flashers can also become handy.
EZP2010 USB-Highspeed programmer
This particular programmer can be bought on many Chinese store or Amazon.</description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,108 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>hacking</h1>
</header>
</article>
<ul>
<li>
<a href="/posts/reverse-engineering-of-a-flash-programmer-ezp2010/">2019-11-28 | Reverse Engineering of a Flash Programmer :: EZP2010</a>
</li>
<li>
<a href="/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/">2019-09-25 | Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</a>
</li>
<li>
<a href="/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/">2019-07-24 | Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>hacking on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/tags/hacking/</link>
<description>Recent content in hacking on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Thu, 28 Nov 2019 12:01:53 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/tags/hacking/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Reverse Engineering of a Flash Programmer :: EZP2010</title>
<link>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</guid>
<description>Preface In today&amp;rsquo;s adventure I like to take you with me on my journey of reverse engineering another USB device. The EZP2010 is an USB programmer for flash memory as used by mainboard manufactures to store the BIOS, or embedded devices to store the firmware (or settings). When it comes to data recovery on hard drives, or similar storage devices, these flashers can also become handy.
EZP2010 USB-Highspeed programmer
This particular programmer can be bought on many Chinese store or Amazon.</description>
</item>
<item>
<title>Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</title>
<link>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</link>
<pubDate>Wed, 25 Sep 2019 15:22:58 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</guid>
<description>TL;DR; Short the ERASE pin with VDDCORE, if ERASE == PIN_55 &amp;amp;&amp;amp; VDDCORE == PIN_54
According to complains in the internet, users report bricking their Proxmark3 EASY, when they try to flash the latest firmware with the &amp;lsquo;flasher&amp;rsquo; software tool.
Sometimes flashing process of firmware can go wrong, but it can often be recovered with JTAG programmers, or similar programmers.
I will not about setting up the environment to build, and flash the firmware, but I will tell you what you might be missing out and why it might be not working.</description>
</item>
<item>
<title>Google CTF 2019 - FriendSpaceBookPlusAllAccessRedPremium.com</title>
<link>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</link>
<pubDate>Wed, 24 Jul 2019 12:19:47 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/google-ctf-2019-friendspacebookplusallaccessredpremium-com/</guid>
<description>#MemeFreeEdition
The Challenge You are provided a zip file containing two files.
program vm.py The file program contains instructions encoded as emojis for a virtual machine called vm.py. At the bottom of vm.py I found a list, or lets call it a translation table, with emojis and their function name counter part.
OPERATIONS = { &amp;#39;🍡&amp;#39;: add, &amp;#39;🤡&amp;#39;: clone, &amp;#39;📐&amp;#39;: divide, &amp;#39;😲&amp;#39;: if_zero, &amp;#39;😄&amp;#39;: if_not_zero, &amp;#39;🏀&amp;#39;: jump_to, &amp;#39;🚛&amp;#39;: load, &amp;#39;📬&amp;#39;: modulo, &amp;#39;⭐&amp;#39;: multiply, &amp;#39;🍿&amp;#39;: pop, &amp;#39;📤&amp;#39;: pop_out, &amp;#39;🎤&amp;#39;: print_top, &amp;#39;📥&amp;#39;: push, &amp;#39;🔪&amp;#39;: sub, &amp;#39;🌓&amp;#39;: xor, &amp;#39;⛰&amp;#39;: jump_top, &amp;#39;⌛&amp;#39;: exit } To execute program with vm.</description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,108 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>hardware</h1>
</header>
</article>
<ul>
<li>
<a href="/posts/reverse-engineering-of-a-flash-programmer-ezp2010/">2019-11-28 | Reverse Engineering of a Flash Programmer :: EZP2010</a>
</li>
<li>
<a href="/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/">2019-09-25 | Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</a>
</li>
<li>
<a href="/posts/reverse-engineering-of-the-skyrc-mc3000-battery-charger-usb-protocol/">2019-03-18 | Reverse Engineering of the SkyRC MC3000 Battery Charger USB Protocol</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>hardware on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/tags/hardware/</link>
<description>Recent content in hardware on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Thu, 28 Nov 2019 12:01:53 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/tags/hardware/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Reverse Engineering of a Flash Programmer :: EZP2010</title>
<link>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/reverse-engineering-of-a-flash-programmer-ezp2010/</guid>
<description>Preface In today&amp;rsquo;s adventure I like to take you with me on my journey of reverse engineering another USB device. The EZP2010 is an USB programmer for flash memory as used by mainboard manufactures to store the BIOS, or embedded devices to store the firmware (or settings). When it comes to data recovery on hard drives, or similar storage devices, these flashers can also become handy.
EZP2010 USB-Highspeed programmer
This particular programmer can be bought on many Chinese store or Amazon.</description>
</item>
<item>
<title>Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</title>
<link>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</link>
<pubDate>Wed, 25 Sep 2019 15:22:58 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</guid>
<description>TL;DR; Short the ERASE pin with VDDCORE, if ERASE == PIN_55 &amp;amp;&amp;amp; VDDCORE == PIN_54
According to complains in the internet, users report bricking their Proxmark3 EASY, when they try to flash the latest firmware with the &amp;lsquo;flasher&amp;rsquo; software tool.
Sometimes flashing process of firmware can go wrong, but it can often be recovered with JTAG programmers, or similar programmers.
I will not about setting up the environment to build, and flash the firmware, but I will tell you what you might be missing out and why it might be not working.</description>
</item>
<item>
<title>Reverse Engineering of the SkyRC MC3000 Battery Charger USB Protocol</title>
<link>https://goatpr0n.farm/posts/reverse-engineering-of-the-skyrc-mc3000-battery-charger-usb-protocol/</link>
<pubDate>Mon, 18 Mar 2019 16:49:39 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/reverse-engineering-of-the-skyrc-mc3000-battery-charger-usb-protocol/</guid>
<description>Software Requirements Decompiler for .NET programs
dotPeek The implementation of the protocol is then written in Python. Let&amp;rsquo;s hear what the curator has to say:
Tell me about Python.
&amp;gt; Wow. Much Snake. Easy programming! &amp;gt; &amp;gt; \- Doge Tell me about dotPeek.
&amp;gt; Easy decompilation. Readable syntax. Very easy. &amp;gt; &amp;gt; \- Doge Analyzing MC3000_Monitor Decompiling Start dotPeek and use Drag&amp;rsquo;n&amp;rsquo;Drop to load the Application. Or uSe CtRL+O anD LoCATe tHe fILe uSiNg ThE bOrwsEr.</description>
</item>
</channel>
</rss>

140
public/tags/index.html Normal file
View File

@ -0,0 +1,140 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>Tags</h1>
</header>
</article>
<ul>
<li>
<a href="https://goatpr0n.farm/tags/flasher/">2019-11-28 | flasher</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/ghidra/">2019-11-28 | ghidra</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/hacking/">2019-11-28 | hacking</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/hardware/">2019-11-28 | hardware</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/programmer/">2019-11-28 | programmer</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/reverse-engineering/">2019-11-28 | reverse engineering</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/rom/">2019-11-28 | rom</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/jtag/">2019-09-25 | jtag</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/ctf/">2019-07-24 | CTF</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/python/">2019-07-24 | python</a>
</li>
<li>
<a href="https://goatpr0n.farm/tags/index/">0001-01-01 | index</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

114
public/tags/index.xml Normal file
View File

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Tags on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/tags/</link>
<description>Recent content in Tags on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Thu, 28 Nov 2019 12:01:53 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/tags/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>flasher</title>
<link>https://goatpr0n.farm/tags/flasher/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/tags/flasher/</guid>
<description></description>
</item>
<item>
<title>ghidra</title>
<link>https://goatpr0n.farm/tags/ghidra/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/tags/ghidra/</guid>
<description></description>
</item>
<item>
<title>hacking</title>
<link>https://goatpr0n.farm/tags/hacking/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/tags/hacking/</guid>
<description></description>
</item>
<item>
<title>hardware</title>
<link>https://goatpr0n.farm/tags/hardware/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/tags/hardware/</guid>
<description></description>
</item>
<item>
<title>programmer</title>
<link>https://goatpr0n.farm/tags/programmer/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/tags/programmer/</guid>
<description></description>
</item>
<item>
<title>reverse engineering</title>
<link>https://goatpr0n.farm/tags/reverse-engineering/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/tags/reverse-engineering/</guid>
<description></description>
</item>
<item>
<title>rom</title>
<link>https://goatpr0n.farm/tags/rom/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/tags/rom/</guid>
<description></description>
</item>
<item>
<title>jtag</title>
<link>https://goatpr0n.farm/tags/jtag/</link>
<pubDate>Wed, 25 Sep 2019 15:22:58 +0000</pubDate>
<guid>https://goatpr0n.farm/tags/jtag/</guid>
<description></description>
</item>
<item>
<title>CTF</title>
<link>https://goatpr0n.farm/tags/ctf/</link>
<pubDate>Wed, 24 Jul 2019 12:19:47 +0000</pubDate>
<guid>https://goatpr0n.farm/tags/ctf/</guid>
<description></description>
</item>
<item>
<title>python</title>
<link>https://goatpr0n.farm/tags/python/</link>
<pubDate>Wed, 24 Jul 2019 12:19:47 +0000</pubDate>
<guid>https://goatpr0n.farm/tags/python/</guid>
<description></description>
</item>
<item>
<title>index</title>
<link>https://goatpr0n.farm/tags/index/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://goatpr0n.farm/tags/index/</guid>
<description></description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,100 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>index</h1>
</header>
</article>
<ul>
<li>
<a href="/posts/">2019-11-28 | Blog</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>index on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/tags/index/</link>
<description>Recent content in index on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<atom:link href="https://goatpr0n.farm/tags/index/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Blog</title>
<link>https://goatpr0n.farm/posts/</link>
<pubDate>Thu, 28 Nov 2019 12:01:53 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/</guid>
<description>All posts </description>
</item>
</channel>
</rss>

100
public/tags/jtag/index.html Normal file
View File

@ -0,0 +1,100 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>jtag</h1>
</header>
</article>
<ul>
<li>
<a href="/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/">2019-09-25 | Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>jtag on GoatPr0n.farm</title>
<link>https://goatpr0n.farm/tags/jtag/</link>
<description>Recent content in jtag on GoatPr0n.farm</description>
<generator>Hugo -- gohugo.io</generator>
<language>en</language>
<lastBuildDate>Wed, 25 Sep 2019 15:22:58 +0000</lastBuildDate>
<atom:link href="https://goatpr0n.farm/tags/jtag/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Initial flashing/debricking the Proxmark V3 EASY (w/ Bus Pirate)</title>
<link>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</link>
<pubDate>Wed, 25 Sep 2019 15:22:58 +0000</pubDate>
<guid>https://goatpr0n.farm/posts/initial-flashing-debricking-the-proxmark-v3-easy-w-bus-pirate/</guid>
<description>TL;DR; Short the ERASE pin with VDDCORE, if ERASE == PIN_55 &amp;amp;&amp;amp; VDDCORE == PIN_54
According to complains in the internet, users report bricking their Proxmark3 EASY, when they try to flash the latest firmware with the &amp;lsquo;flasher&amp;rsquo; software tool.
Sometimes flashing process of firmware can go wrong, but it can often be recovered with JTAG programmers, or similar programmers.
I will not about setting up the environment to build, and flash the firmware, but I will tell you what you might be missing out and why it might be not working.</description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,100 @@
<!DOCTYPE html>
<html lang="en"><head>
<title>GoatPr0n.farm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="format-detection" content="telephone=no" />
<meta name="theme-color" content="#000084" />
<link rel="icon" href="https://goatpr0n.farm//favicon.ico">
<link rel="canonical" href="https://goatpr0n.farm/">
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/css/style.css">
</head><body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
<a class="brand" href="https://goatpr0n.farm/">GoatPr0n.farm</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li>
<a href="/posts/">
<span>All posts</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav><div id="content" class="container">
<article class="row-fluid navmargin">
<header class="page-header">
<h1>programmer</h1>
</header>
</article>
<ul>
<li>
<a href="/posts/reverse-engineering-of-a-flash-programmer-ezp2010/">2019-11-28 | Reverse Engineering of a Flash Programmer :: EZP2010</a>
</li>
</ul>
</div><footer class="container">
<hr class="soften">
<p>
&copy;
Julian Knauer
<span id="thisyear">2020</span>
</p>
<p class="text-center">
</p>
</footer>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap-386.js"></script>
<script src="/js/bootstrap-transition.js"></script>
<script src="/js/bootstrap-alert.js"></script>
<script src="/js/bootstrap-modal.js"></script>
<script src="/js/bootstrap-dropdown.js"></script>
<script src="/js/bootstrap-scrollspy.js"></script>
<script src="/js/bootstrap-tab.js"></script>
<script src="/js/bootstrap-tooltip.js"></script>
<script src="/js/bootstrap-popover.js"></script>
<script src="/js/bootstrap-button.js"></script>
<script src="/js/bootstrap-collapse.js"></script>
<script src="/js/bootstrap-carousel.js"></script>
<script src="/js/bootstrap-typeahead.js"></script>
<script src="/js/bootstrap-affix.js"></script>
<script>
_386 = {
fastLoad: false ,
onePass: false ,
speedFactor: 1
};
function ThisYear() {
document.getElementById('thisyear').innerHTML = new Date().getFullYear();
};
</script></body>
</html>

Some files were not shown because too many files have changed in this diff Show More