Task 5 - Core Dumped - (Reverse Engineering, Cryptography) Points: 500

Description:

The FBI knew who that was, and got a warrant to seize their laptop. It looks like they had an encrypted file, which may be of use to your investigation.

We believe that the attacker may have been clever and used the same RSA key that they use for SSH to encrypt the file. We asked the FBI to take a core dump of ssh-agent that was running on the attacker’s computer.

Extract the attacker’s private key from the core dump, and use it to decrypt the file.

Hint: if you have the private key in PEM format, you should be able to decrypt the file with the command openssl pkeyutl -decrypt -inkey privatekey.pem -in data.enc

Downloads:

  • Core dump of ssh-agent from the attacker’s computer (core)
  • ssh-agent binary from the attacker’s computer. The computer was running Ubuntu 20.04. (ssh-agent)
  • Encrypted data file from the attacker’s computer (data.enc)

Prompt:

Enter the token value extracted from the decrypted file.

Solution

This might be the hardest challenge in the whole competition because of how deep it takes you into reverse engineering the binary. The only other that might be a contender is Task 8.

There are 8 phases to solving this: <!– 1. Understanding theory of ssh-agent

  1. Reverse engineering
  2. Looking for functions
  3. Finding idtab
  4. Finding where key is stored
  5. Parsing sshkey elements: shielded_private, etc
  6. Decrypting shielded private key
  7. Understanding blob structure and formatting private key
  8. Solved! –>

  9. ssh-agent theory
  10. Reverse engineering
    1. Initial inspections
    2. Looking in source code
  11. Looking for functions
  12. Looking for idtab and shielded private key
  13. Decrypting the shielded private key
  14. Parsing the decrypted private key blob
  15. RSA key as .pem
  16. Decrypt data.enc

ssh-agent theory

The first thing to do is understand what role ssh-agent plays and how it stores and uses private keys.

When I was researching, I found this resource: http://www.unixwiz.net/techtips/ssh-agent-forwarding.html. It has a very good explanation of what exactly the purpose and role of ssh-agent is in ssh (Go read, if you haven’t). The way that ssh-agent supports ssh is that it keeps loads the private keys into memory once when the user starts it. Then, whenever the user needs to make a connection to a remote host, the authentication is forwarded to the ssh-agent which then uses the private key to produce a response for the authentication challenge. It also helps with forwarding where if a user connects to a host and then further connects from there to another host using ssh, the authentication challenge is forwarded all the way back to the original user’s host where the agent produces a response and then gets forwarded back to the end host which sent the challenge.

I highly recommend reading the article.

So, the way that the ssh-agent stores the private keys is only in memory and after the user has unlocked it once at the beginning using a passphrase. Fortunately, this means that getting a coredump of a running ssh-agent binary with the private key loaded in memory would allow us to extract it from the coredump. Later we’ll see that the binary keeps these keys in memory in encrypted form, but it’s possible to get around that.

Other resources:

  • https://stackoverflow.com/questions/2976496/how-to-extract-private-keys-from-an-ssh-agent
  • http://www.unixwiz.net/techtips/ssh-agent-forwarding.html
  • https://www.netspi.com/blog/technical/network-penetration-testing/stealing-unencrypted-ssh-agent-keys-from-memory/
  • https://github.com/NetSPI/sshkey-grab/blob/75f1028a762936d004ae9a9bcd9fb51d9b4e1d99/parse_mem.py#L37

Reverse Engineering

In order to reverse engineer the binary and see how it is working, we need to use pwndbg. I initially had problems getting it to work with the dump and binary provided, but after reinstalling pwndbg, it worked. This is far better than using stock gdb.

Keep in mind that pretty everything now onwards can fall under Reverse Engineering.

Initial inspections

Let’s load the binary in gdb with the core dump. To load the binary with the coredump:

$ sudo gdb ssh-agent --core=core

Observations from just loading in gdb:

  1. The rip is at an invalid address:
    ──────────────────────────[ DISASM / x86-64 / set emulate on ]───────────────────────────
    Invalid address 0x7f8c72ae3967
    
  2. Looking at vmmap to see how the memory is laid out:
    pwndbg> vmmap
    LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
     0x5585d287b000     0x5585d2881000 r--p     6000 0      /usr/bin/ssh-agent
     0x5585d28cf000     0x5585d28d1000 r--p     2000 53000  /usr/bin/ssh-agent
     0x5585d28d1000     0x5585d28d2000 ---p     1000 55000  /usr/bin/ssh-agent
     0x5585d28d2000     0x5585d28d4000 ---p     2000 0      load4
     0x5585d30b2000     0x5585d30f4000 ---p    42000 0      load5
     0x7f8c729a6000     0x7f8c729a8000 ---p     2000 0      load6
     0x7f8c729a8000     0x7f8c729ae000 r--p     6000 0      /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
     0x7f8c729c5000     0x7f8c729c6000 r--p     1000 1c000  /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
     0x7f8c729c6000     0x7f8c729c7000 ---p     1000 1d000  /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
     0x7f8c729c7000     0x7f8c729cb000 ---p     4000 0      load10
     0x7f8c729cb000     0x7f8c729cc000 r--p     1000 0      /usr/lib/x86_64-linux-gnu/libdl-2.31.so
     0x7f8c729cf000     0x7f8c729d0000 r--p     1000 3000   /usr/lib/x86_64-linux-gnu/libdl-2.31.so
     0x7f8c729d0000     0x7f8c729d1000 ---p     1000 4000   /usr/lib/x86_64-linux-gnu/libdl-2.31.so
     0x7f8c729d1000     0x7f8c729f3000 r--p    22000 0      /usr/lib/x86_64-linux-gnu/libc-2.31.so
     0x7f8c72bb9000     0x7f8c72bbd000 r--p     4000 1e7000 /usr/lib/x86_64-linux-gnu/libc-2.31.so
     0x7f8c72bbd000     0x7f8c72bbf000 ---p     2000 1eb000 /usr/lib/x86_64-linux-gnu/libc-2.31.so
     0x7f8c72bbf000     0x7f8c72bc3000 ---p     4000 0      load17
     0x7f8c72bc3000     0x7f8c72c3b000 r--p    78000 0      /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
     0x7f8c72e67000     0x7f8c72e93000 r--p    2c000 2a3000 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
     0x7f8c72e93000     0x7f8c72e95000 ---p     2000 2cf000 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
     0x7f8c72e95000     0x7f8c72e9b000 ---p     6000 0      load21
     0x7f8c72e9e000     0x7f8c72e9f000 r--p     1000 0      /usr/lib/x86_64-linux-gnu/ld-2.31.so
     0x7f8c72ecb000     0x7f8c72ecc000 r--p     1000 2c000  /usr/lib/x86_64-linux-gnu/ld-2.31.so
     0x7f8c72ecc000     0x7f8c72ecd000 ---p     1000 2d000  /usr/lib/x86_64-linux-gnu/ld-2.31.so
     0x7f8c72ecd000     0x7f8c72ece000 ---p     1000 0      load25
     0x7ffe2962f000     0x7ffe29650000 rw-p    21000 0      [stack]
     0x7ffe2975b000     0x7ffe2975d000 r-xp     2000 0      load27
    0xffffffffff600000 0xffffffffff601000 r-xp     1000 0      [vsyscall]
    

    This shows a few things

  3. There isn’ta segment marked as heap
  4. There is a stack though
  5. It has some segments marked as load4, load5, load25, etc. which have different sizes.

Telescoping the stack shows something interesting:

pwndbg> telescope rsp
00:0000│ rsp 0x7ffe2964df58 ◂— 0x5585d28838d1
01:0008│     0x7ffe2964df60 ◂— 0xffff6
02:0010│     0x7ffe2964df68 —▸ 0x7ffe2964dfa0 ◂— 0x1
03:0018│     0x7ffe2964df70 ◂— 0x5
04:0020│     0x7ffe2964df78 ◂— 0xffff6
...
...
1b:00d8│  0x7ffe2964e030 —▸ 0x7f8c72bc22e8 (X509_verify_cert+296) ◂— 0x0
1c:00e0│  0x7ffe2964e038 ◂— 0x5585d28a7550

At an offset of 0x00d8 from rsp, there is a pointer to X509_verify_cert+296 which sounds interesting from the name. It seems to be doing some x509 cert verification judging from the name, which might be useful because it’s at least something. It doesn’t really come in too handy later on but for now it gives us some hanlde on things.

pwndbg> p &X509_verify_cert
$2 = (<text variable, no debug info> *) 0x7f8c72bc21c0 <__pthread_keys+10016>

Looking in source code

The source code can be found at https://github.com/openssh/openssh-portable/blob/master/ssh-agent.c

One interesting thing I saw was on line 2229:

#ifdef HAVE_SETRLIMIT
	/* deny core dumps, since memory contains unencrypted private keys */

Interesting that it prevents coredump, but we already have it provided for us. But one thing it tells us is that we’re looking in the right place (source code) for private keys, it does store it in memory somewhere—we just need to find where.

Next, looking through the source, I found the reaper() function which “removes expired keys and returns number of seconds until the next expiry”. This seems interesting because in order to remove the expired keys, the program would have to access the location where the keys are stored. So, we can follow the logic to get to that location. I was able to also find it in Ghidra.

To find the function in gdb, I tried looking for the string and matching instructions, as well as tried other things. At this point, I was focusing on function in the source code finding them and in Ghidra and then locating them in gdb. I was using a gdb session of the ssh-agent binary without the coredump.

I spent some time looking for and analysing the reaper function, it ultimately wasn’t as useful as I had hoped but I did get a few important insights from it. In the source code for the reaper() function, there are interesting variables being used.

  1. The variables of type Identity:
     Identity *id, *nxt;
    
  2. There is pointer being used to get what seems to be a linked list of identities:
     for (id = TAILQ_FIRST(&idtab->idlist); id; id = nxt) {
         ...
         			TAILQ_REMOVE(&idtab->idlist, id, next);
                     ...
         ...
    

    The idtab variable looks very interesting beacuse it either is the place where the identities are stored or is a handle to where the identities are stored.

Looking for functions

I looked for the main() function by starting gdb and then stepping through the instructions in __libc_start_main until I came to this point:

► 0x7ffff7801e3b <__libc_start_main+123>    call   __libc_start_call_main                <__libc_start_call_main>
        rdi: 0x55555555c1d0 ◂— endbr64 
        rsi: 0x1
        rdx: 0x7fffffffda78 —▸ 0x7fffffffde3d ◂— '/home/zaid/CTFs/NSA22/task_5/downloads/ssh-agent'

The value in rdi is a pointer to a some instructions. I inspected the instructions at that location and compared with Ghidra and source code to see if this was main(). I looked for the Ghidra function by looking at the last bytes, because even with ASLR, the last bytes remain same. One indication is the use of getgid() and setegid(). The functions matched and so I was fairly sure that this was main().

As I was working on reverse engineering, I kept note and track of the locations of functions in a separate file and I also prefixed the Ghidra function names with the actual names (as I understood).

I also looked at the coredump and it didn’t seem to have any code sections, which made me drop looking for functions in it and decided to find the private key storage location in the gdb binary (without coredump) and then correspond it in the coredump later.

I also did a similar approach to find sanitise_stdfd(), platform_disable_tracing(), ssh_get_progname() and seed_rng() in gdb.

There was a problem executing platform_disable_tracing() but if I jumped over it, things worked fine.

While looking through the source code, I found that in line 2145, it calls the function getpid() and then stores the value in parent_pid.

	parent_pid = getpid();

In Ghidra, this looked like this:

DAT_00156014 = getpid();

This is interesting because the variable is a global variable—declared as a global variable in the source code, and assigned to a DAT_ variable in Ghidra which means that it is a global variable. And that is interesting because these are usually stored in the heap segment. So, if we can correspond the section in the coredump, then we can find the segment which is should have the private key, making the reasonable assumption that the private key is stored using malloc and in the heap. In gdb, the instruction looked like this:

► 0x55555555c55f    mov    dword ptr [rip + 0x4daaf], eax

So, the value gets stored at rip + 0x4daaf. Let’s see what it looks like around there:

pwndbg> telescope $rip+0x4daaf
00:0000│  0x5555555aa00e ◂— 0xffff000000020000
01:0008│  0x5555555aa016 ◂— 0x20ffffffffffff
02:0010│  0x5555555aa01e ◂— 0x1000000020000
03:0018│  0x5555555aa026 ◂— 0x30000
04:0020│  0x5555555aa02e ◂— 0xffffffffffff0000
05:0028│  0x5555555aa036 ◂— 0x10000003fffff
06:0030│  0x5555555aa03e ◂— 0x10000
07:0038│  0x5555555aa046 ◂— 0x555555582a880000

pwndbg> vmmap $rip+0x4daaf
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
    0x5555555aa000     0x5555555ab000 rw-p     1000 55000  /home/zaid/CTFs/NSA22/task_5/downloads/ssh-agent +0xe

The address is at an offset of +0xe in the vmmap segment. The vmmap segment is of size 1000 and matches with the coredump vmmap segment:

    0x5585d28d1000     0x5585d28d2000 ---p     1000 55000  /usr/bin/ssh-agent

Now, lets see what is at the same offset in the coredump segment:

pwndbg> telescope 0x5585d28d1000+0xe
00:0000│  0x5585d28d100e ◂— 0x12000000020000
01:0008│  0x5585d28d1016 ◂— 0x20ffffffff0000
02:0010│  0x5585d28d101e ◂— 0x20000
03:0018│  0x5585d28d1026 ◂— 0x30000
04:0020│  0x5585d28d102e ◂— 0xffffffffffff0000
05:0028│  0x5585d28d1036 ◂— 0x10000003fffff
06:0030│  0x5585d28d103e ◂— 0x10000
07:0038│  0x5585d28d1046 ◂— 0x5585d28a9a880000

If we look at the values stored here, they are exactly the same, except for the first one which I assume is going to be assigned after the instruction or later. This tells us that we are probably looking at the right location for where the parent_pid is stored. We can also assume that around this place is where the global variables are stored.

At this point, the program forks a child process at line 2190 in the source code. In Ghidra, at line 155:

pid_Var7 = fork();

We want to follow the child process because the parent executes some logic and then exits. In the source, lines 2195-2215:

	if (pid != 0) {		/* Parent - execute the given command. */
		close(sock);
		snprintf(pidstrbuf, sizeof pidstrbuf, "%ld", (long)pid);
		if (ac == 0) {
			format = c_flag ? "setenv %s %s;\n" : "%s=%s; export %s;\n";
			printf(format, SSH_AUTHSOCKET_ENV_NAME, socket_name,
			    SSH_AUTHSOCKET_ENV_NAME);
			printf(format, SSH_AGENTPID_ENV_NAME, pidstrbuf,
			    SSH_AGENTPID_ENV_NAME);
			printf("echo Agent pid %ld;\n", (long)pid);
			exit(0);
		}
		if (setenv(SSH_AUTHSOCKET_ENV_NAME, socket_name, 1) == -1 ||
		    setenv(SSH_AGENTPID_ENV_NAME, pidstrbuf, 1) == -1) {
			perror("setenv");
			exit(1);
		}
		execvp(av[0], av);
		perror(av[0]);
		exit(1);
	}

For that, we can set the option in gdb: set follow-fork-mode child. FOllowing the child is useful because it sets up some sockets and calls some ssh related functions: (lines 2241-2251)

#ifdef ENABLE_PKCS11
	pkcs11_init(0);
#endif
	new_socket(AUTH_SOCKET, sock);
	if (ac > 0)
		parent_alive_interval = 10;
	idtab_init();
	ssh_signal(SIGPIPE, SIG_IGN);
	ssh_signal(SIGINT, (d_flag | D_flag) ? cleanup_handler : SIG_IGN);
	ssh_signal(SIGHUP, cleanup_handler);
	ssh_signal(SIGTERM, cleanup_handler);

I then continued to look for interesting functions which references id related structs or arguments, etc. I saw the pkcs11_init() function which I looked into. It seemed to be initialising some stroage for pkcs providers. The source was at: https://github.com/openssh/openssh-portable/blob/97f9b6e61316c97a32dad94b7a37daa9b5f6b836/ssh-pkcs11.c. I didn’t find too much here.

I also found the idtab_init() function which I thought was potentially very important. The function is very short but it importantly assigns idtab (I thought it was potentially important but didn’t realise it’s full importance at the time). The function is at lines 210-216:

static void
idtab_init(void)
{
	idtab = xcalloc(1, sizeof(*idtab));
	TAILQ_INIT(&idtab->idlist);
	idtab->nentries = 0;
}

Looking at what exactly idtab is at lines 149-155:

struct idtable {
	int nentries;
	TAILQ_HEAD(idqueue, identity) idlist;
};

/* private key table */
struct idtable *idtab;

It looks like a linked list of identities.

The xcalloc uses sizeof(*idtab) which is 0x18 when I break at the function call and look at arguments and also according to Ghidra. The calloc return value was ` RAX 0x5555555c9140 ◂— 0x0 ` which then got stored into the idtab global variable as: ` 0x5555555aa7c0 —▸ 0x5555555c9140 ◂— 0x0` (in gdb). The instructions in Ghidra looked like this (I renamed the idtab_init function):

        puVar14 = (undefined4 *)idtab_init_FUN_0011baf0(1,0x18);
        DAT_001567c0 = puVar14;

Looking at the vmmap for this gdb address and telescoping:

pwndbg> vmmap 0x5555555aa7c0
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
    0x5555555aa000     0x5555555ab000 rw-p     1000 55000  /home/zaid/CTFs/NSA22/task_5/downloads/ssh-agent +0x7c0

pwndbg> telescope $rip+0x4d8dc
00:0000│  0x5555555aa7c0 —▸ 0x5555555c9140 ◂— 0x0
01:0008│  0x5555555aa7c8 ◂— 0x0
... ↓     2 skipped
04:0020│  0x5555555aa7e0 ◂— '/tmp/ssh-avGuDr88j45x/agent.54645'
05:0028│  0x5555555aa7e8 ◂— '-avGuDr88j45x/agent.54645'
06:0030│  0x5555555aa7f0 ◂— '8j45x/agent.54645'
07:0038│  0x5555555aa7f8 ◂— 'ent.54645'

The vmmap segment in the coredump which looks similar to this one is (see above for full coredump vmmap):

LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
...
    0x5585d28d1000     0x5585d28d2000 ---p     1000 55000  /usr/bin/ssh-agent
...

Looking at the same offset in this coredump segment:

pwndbg> telescope 0x5585d28d1000+0x7c0
00:0000│  0x5585d28d17c0 —▸ 0x5585d30ce3c0 ◂— 0x1
01:0008│  0x5585d28d17c8 ◂— 0x0
... ↓     2 skipped
04:0020│  0x5585d28d17e0 ◂— '/tmp/ssh-gH19cuv11Hop/agent.18'
05:0028│  0x5585d28d17e8 ◂— '-gH19cuv11Hop/agent.18'
06:0030│  0x5585d28d17f0 ◂— '11Hop/agent.18'
07:0038│  0x5585d28d17f8 ◂— 0x38312e746e65 /* 'ent.18' */

We can see that it looks similar, so we can make a reasonable conclusion that this is where the idtab global variable is stored in the coredump.

I did a bunch of stuff here at this point, before and during resolving the idtab location in gdb and the coredump, which was me tryng different things to see if something works. I was looking at things related to the address that calloc returns. I wasn’t seeing the address in the heap chunks and was trying to figure things out related to that. I also looked at some stuff related to the prepare_poll() and poll() functions. I also looked at the (returned) pkcs11_provider struct, the pkcs11_provider_lookup() function, the pkcs11_key struct, etc. I looked at these because I thought these would lead me some place where the identities are managed, because pkcs11 seemed related.

While I was doing these things, I also stumbled upon a region (when looking at the calloc pointers) which seemed to hold a lot of pointers to places and I was thinking this was useful and perhaps pointers to where the different identities are stored.

0x5585d30d2290: 0x00005585d30d22a0      0x0000000000000031
pwndbg> 
0x5585d30d22a0: 0x00005585d30d03f0      0x00005585d30d1410
0x5585d30d22b0: 0x0000000000000000      0x0000000000000000
0x5585d30d22c0: 0x0000000000000030      0x00000000000000a0
0x5585d30d22d0: 0x0000000000000000      0x00005585d30b2010
0x5585d30d22e0: 0x00005585d30d1a50      0x00005585d30d1ad0
0x5585d30d22f0: 0x00005585d30d1b50      0x00005585d30d1bf0
0x5585d30d2300: 0x00005585d30d1c50      0x00005585d30d1d30
0x5585d30d2310: 0x00005585d30d1d90      0x00005585d30d1e30
0x5585d30d2320: 0x00005585d30d1f00      0x00005585d30d1f60
0x5585d30d2330: 0x00005585d30d21f0      0x00005585d30d2270
0x5585d30d2340: 0x0000000000000000      0x0000000000000000

The pointers seemed to be in chunks, where there would be a bunch of null 64-bit values in between locations that have multiple 64-bit pointers.

Telescoping to see what these are:

pwndbg> telescope 0x5585d30d2290
00:0000│  0x5585d30d2290 —▸ 0x5585d30d22a0 —▸ 0x5585d30d03f0 —▸ 0x5585d30d0400 —▸ 0x7f8c72bbdc00 (X509_TRUST_get_by_id) ◂— ...
01:0008│  0x5585d30d2298 ◂— 0x31 /* '1' */
02:0010│  0x5585d30d22a0 —▸ 0x5585d30d03f0 —▸ 0x5585d30d0400 —▸ 0x7f8c72bbdc00 (X509_TRUST_get_by_id) —▸ 0x5585d30d3160 ◂— ...
03:0018│  0x5585d30d22a8 —▸ 0x5585d30d1410 —▸ 0x5585d30d1420 —▸ 0x5585d30d2290 —▸ 0x5585d30d22a0 ◂— ...
04:0020│  0x5585d30d22b0 ◂— 0x0
05:0028│  0x5585d30d22b8 ◂— 0x0
06:0030│  0x5585d30d22c0 ◂— 0x30 /* '0' */
07:0038│  0x5585d30d22c8 ◂— 0xa0
08:0040│  0x5585d30d22d0 ◂— 0x0
09:0048│  0x5585d30d22d8 —▸ 0x5585d30b2010 ◂— 0x7000400070007
0a:0050│  0x5585d30d22e0 —▸ 0x5585d30d1a50 ◂— 0x0
0b:0058│  0x5585d30d22e8 —▸ 0x5585d30d1ad0 ◂— 0x0
0c:0060│  0x5585d30d22f0 —▸ 0x5585d30d1b50 —▸ 0x5585d30d1a40 ◂— 0x0
0d:0068│  0x5585d30d22f8 —▸ 0x5585d30d1bf0 ◂— 0x0
0e:0070│  0x5585d30d2300 —▸ 0x5585d30d1c50 ◂— 0x0
0f:0078│  0x5585d30d2308 —▸ 0x5585d30d1d30 ◂— 0x0
10:0080│  0x5585d30d2310 —▸ 0x5585d30d1d90 ◂— 0x0
11:0088│  0x5585d30d2318 —▸ 0x5585d30d1e30 —▸ 0x5585d30d1c40 ◂— 0x0
12:0090│  0x5585d30d2320 —▸ 0x5585d30d1f00 ◂— 0x0
13:0098│  0x5585d30d2328 —▸ 0x5585d30d1f60 ◂— 0x0
14:00a0│  0x5585d30d2330 —▸ 0x5585d30d21f0 ◂— 0x0
15:00a8│  0x5585d30d2338 —▸ 0x5585d30d2270 ◂— 0x0
16:00b0│  0x5585d30d2340 ◂— 0x0
17:00b8│  0x5585d30d2348 ◂— 0x0

I did some stuff with this and tried to format it as a key and use it decrypt the data.enc file, decode with asn1, etc. but those things didn’t work because it was wrong and this is not the key or the identities.

I spent a lot of time on these tangents. But realising that I could and should follow the idtab variable because it is a global variable was a clicking point for me.

Looking for idtab and shielded private key

Going back to following idtab, the following structs and definitions are useful:

struct idtable {
	int nentries;
	TAILQ_HEAD(idqueue, identity) idlist;
};
#define TAILQ_HEAD(name, type)						\
struct name {								\
	struct type *tqh_first;	/* first element */			\
	struct type **tqh_last;	/* addr of last next element */		\
}
typedef struct identity {
	TAILQ_ENTRY(identity) next;
	struct sshkey *key;
	char *comment;
	char *provider;
	time_t death;
	u_int confirm;
	char *sk_provider;
	struct dest_constraint *dest_constraints;
	size_t ndest_constraints;
} Identity;
#define TAILQ_ENTRY(type)						\
struct {								\
	struct type *tqe_next;	/* next element */			\
	struct type **tqe_prev;	/* address of previous next element */	\
}

In the coredump, the address where the idtab global variable is located is 0x5585d28d17c0 corresponding to the same offset in the vmmap region. It points to this location:

pwndbg> telescope 0x5585d28d1000+0x7c0
00:0000│  0x5585d28d17c0 —▸ 0x5585d30ce3c0 ◂— 0x1

Then, the idtab struct (not the pointer to it) looks like this:

pwndbg> telescope 0x5585d30ce3c0
00:0000│  0x5585d30ce3c0 ◂— 0x1
01:0008│  0x5585d30ce3c8 —▸ 0x5585d30d3b90 ◂— 0x0
02:0010│  0x5585d30ce3d0 —▸ 0x5585d30d3b90 ◂— 0x0
03:0018│  0x5585d30ce3d8 ◂— 0x1e1
04:0020│  0x5585d30ce3e0 ◂— 0x0
05:0028│  0x5585d30ce3e8 —▸ 0x5585d30b2010 ◂— 0x7000400070007
06:0030│  0x5585d30ce3f0 ◂— 0x0
07:0038│  0x5585d30ce3f8 ◂— 0x0

pwndbg> x/4gx 0x5585d30ce3c0
0x5585d30ce3c0: 0x0000000000000001      0x00005585d30d3b90
0x5585d30ce3d0: 0x00005585d30d3b90      0x00000000000001e1

Now what we are going to do is try and manually parse the structs that are present in memory by using the definitions in the source code. So,idtab is an idtable struct and after resolving the TAILQ_HEAD macro, it should look like below. I have also added the values that correspond to the struct elements by corresponding it with the x/4gx command above.

struct idtable {
	int nentries; = 0x1
  struct idqueue idlist {								
    struct identity *tqh_first;	= 0x5585d30d3b90 ◂— 0x0  (only 1 elem so both first and last are same)
    struct identity **tqh_last;	= 0x5585d30d3b90 ◂— 0x0
  }
};

This kind of manual parsing of the structs from the memory required a little guessing as well about the size of each data type and which value corresponds to which struct element, etc. For people following along, this wasn’t something I did perfectly by just looking at it at first glance.

This shows us that there is only 0x1 entry in the idtable and the tqh_first and tqh_last both point to the same address. This is because there is only one entry in the idtable which is a double-ended linked list. This single entry is located at 0x5585d30d3b90 and is of an identity struct. The struct definition for an identity (with the macros resolved) along with the values for each element are below:

typedef struct identity {			
  struct {								
    struct identity *tqe_next;  = 0x0
    struct identity **tqe_prev;	= 0x5585d30ce3c8 —▸ 0x5585d30d3b90 ◂— 0x0 (prev -> idtab.idlist.tqhfirst -> this)
  } next;

	struct sshkey *key; = 0x5585d30d1ee0 ◂— 0x0
	char *comment;      = 0x5585d30cfc00 ◂— 'T5upqypQDpDE9kBYlQsOAw'
	char *provider;     = 0x0000000000000000
	time_t death;       = 0x0000000000000000
	u_int confirm;
	char *sk_provider;
	struct dest_constraint *dest_constraints;
	size_t ndest_constraints;
} Identity;

The TAILQ_ENTRY looks like this, defined in this file:

#define TAILQ_ENTRY(type)						\
struct {								\
	struct type *tqe_next;	/* next element */			\
	struct type **tqe_prev;	/* address of previous next element */	\
}

From this, we can see that the identity holds a pointer to an sshkey struct and the value for this pointer is 0x5585d30d1ee0. Telescoping and examining this address:

pwndbg> telescope 0x5585d30d1ee0
00:0000│  0x5585d30d1ee0 ◂— 0x0
01:0008│  0x5585d30d1ee8 —▸ 0x5585d30d50e0 ◂— 0x0
02:0010│  0x5585d30d1ef0 ◂— 0x0
03:0018│  0x5585d30d1ef8 ◂— 0xffffffff
04:0020│  0x5585d30d1f00 ◂— 0x0
... ↓     3 skipped

pwndbg> x/24gx 0x5585d30d1ee0
0x5585d30d1ee0: 0x0000000000000000      0x00005585d30d50e0
0x5585d30d1ef0: 0x0000000000000000      0x00000000ffffffff
0x5585d30d1f00: 0x0000000000000000      0x0000000000000000
0x5585d30d1f10: 0x0000000000000000      0x0000000000000000
0x5585d30d1f20: 0x0000000000000000      0x0000000000000000
0x5585d30d1f30: 0x0000000000000000      0x0000000000000000
0x5585d30d1f40: 0x0000000000000000      0x0000000000000000
0x5585d30d1f50: 0x0000000000000000      0x0000000000000000
0x5585d30d1f60: 0x0000000000000000      0x00005585d30d4ab0
0x5585d30d1f70: 0x0000000000000570      0x00005585d30d5c00
0x5585d30d1f80: 0x0000000000004000      0x0000000000000031
0x5585d30d1f90: 0x00005585d30d1650      0x00007f8c72bbdc00

Parsing the sshkey struct:

struct sshkey *key; = 0x5585d30d1ee0 ◂— 0x0
key @ `0x5585d30d1ee0`

struct sshkey {
	int	 type;        = 0x00000000
	int	 flags;       = 0x00000000
	/* KEY_RSA */
	RSA	*rsa;         = 0x00005585d30d50e0
	/* KEY_DSA */
	DSA	*dsa;         = 0x0000000000000000
	/* KEY_ECDSA and KEY_ECDSA_SK */
	int	 ecdsa_nid;	/* NID of curve */    = 0x00000000ffffffff
	EC_KEY	*ecdsa;                       = 0x0000000000000000
	/* KEY_ED25519 and KEY_ED25519_SK */
	u_char	*ed25519_sk;                  = 0x0000000000000000
	u_char	*ed25519_pk;                  = 0x0000000000000000
	/* KEY_XMSS */
	char	*xmss_name;                     = 0x0000000000000000
	char	*xmss_filename;	/* for state file updates */  = 0x0000000000000000
	void	*xmss_state;	/* depends on xmss_name, opaque */  = 0x0000000000000000
	u_char	*xmss_sk;                     = 0x0000000000000000
	u_char	*xmss_pk;                     = 0x0000000000000000
	/* KEY_ECDSA_SK and KEY_ED25519_SK */
	char	*sk_application;                = 0x0000000000000000
	uint8_t	sk_flags;                     = 0x0000000000000000
	struct sshbuf *sk_key_handle;         = 0x0000000000000000
	struct sshbuf *sk_reserved;           = 0x0000000000000000
	/* Certificates */
	struct sshkey_cert *cert;             = 0x0000000000000000
	/* Private key shielding */
	u_char	*shielded_private;            = 0x00005585d30d4ab0
	size_t	shielded_len;                 = 0x0000000000000570
	u_char	*shield_prekey;               = 0x00005585d30d5c00
	size_t	shield_prekey_len;            = 0x0000000000004000
};

This struct has something described as private key shielding. It also has an RSA *rsa value but that wasn’t very helpful. Let’s try and see what is stored at the addresses for shielded_private and shield_prekey; they also have the corresponding lengths which is useful.

The shielded_private length is 0x570 and in 64-bit addressing, we want to examine:

pwndbg> x/174gx 0x00005585d30d4ab0
0x5585d30d4ab0: 0x8b44180d6f8017fe      0x4f490242e641b746
0x5585d30d4ac0: 0x2d6a123566a36b9e      0xf9155b0655a2a9f1
0x5585d30d4ad0: 0x06b8470b89678f8e      0x4780366363538f44
0x5585d30d4ae0: 0x9c598b53900e5684      0x2653bc4f9351f923
0x5585d30d4af0: 0x87d93aa6a98fa707      0x5978a0df28a94128
0x5585d30d4b00: 0x0122c3dc8f0d3226      0x29eb41959cf1de1d
0x5585d30d4b10: 0xe01d1cfa645e12ff      0x45fde0c6302cbc0e
0x5585d30d4b20: 0x63d277a1dc7ed391      0x83da0930efa33199
0x5585d30d4b30: 0x4a37ed9ca8237d18      0x1560015ec4008999
0x5585d30d4b40: 0x8a6039f46f0e7ed7      0x11fb7a0cee4bc8c8
0x5585d30d4b50: 0x75aae05c832d86c2      0x07facd4decae460a
0x5585d30d4b60: 0xf99371f381b4833f      0x729523aeb85c3438
0x5585d30d4b70: 0x38b8e7d796d226f8      0xeb2aa45089ea9fab
0x5585d30d4b80: 0x9894df0067ba512b      0x5e7e1af3ced556ca
0x5585d30d4b90: 0x9ae29912ffa9da18      0x9149fdb99bf23678
0x5585d30d4ba0: 0x6ee0146d8f0d6d30      0x4adb2dab7d7ae42a
0x5585d30d4bb0: 0xb8b6e296d207e3f1      0x966479f50abc5d83
0x5585d30d4bc0: 0xba6a25745a57a898      0x64cf2cc3ff6d41e0
0x5585d30d4bd0: 0x81c6530bf542ed80      0x5bf9723a8b015595
0x5585d30d4be0: 0xb73f30921ea8fc3c      0xe7fcd4b552cd04f0
0x5585d30d4bf0: 0x792f5955b54aebdf      0xc6a9accc707ae9c0
0x5585d30d4c00: 0x7afb3e8bc3c3661e      0xcd3a5fc01a3f3458
0x5585d30d4c10: 0xf37ef1383a011956      0x4e3407943a808e3c
0x5585d30d4c20: 0x65eccfd8eadd621b      0x5cbc3a756c354373
0x5585d30d4c30: 0x84c4382dc570623b      0x966356cf6bbb90f5
0x5585d30d4c40: 0x2f80f8518e5538b3      0xf1717e1b05eb6372
0x5585d30d4c50: 0x861faba9634a81a8      0x46ab0e7e30af6705
0x5585d30d4c60: 0xd0c6539bec378f21      0xa39f55a6494b70bf
0x5585d30d4c70: 0x1ae2c4a824e7a816      0x8754253e3d5522dd
0x5585d30d4c80: 0xc8411667525729cc      0xf79c32e4eb0a6784
0x5585d30d4c90: 0x9a8a4af8a230b7c0      0x46c0f590342dd31a
0x5585d30d4ca0: 0x138698c7e8392929      0xfe7670e7d898900b
0x5585d30d4cb0: 0x9d7765e6ad3b4e6e      0xb74018118ccbc2bf
0x5585d30d4cc0: 0x1a604146086d1612      0xac346914d5195df3
0x5585d30d4cd0: 0x2618bcc03024a5c8      0x63fa829d8bac6355
0x5585d30d4ce0: 0x2cf1d51b23285031      0xbff3eea4452d6367
0x5585d30d4cf0: 0xf95925c927b6dbca      0xfd89ebde751e2c2b
0x5585d30d4d00: 0xa219aaa2a90d69bb      0x93f6f2d6cd04ec25
0x5585d30d4d10: 0x0ae136b1417499a8      0xfe34fc180d902bd3
0x5585d30d4d20: 0x8bba0999c3c06b4d      0x78303a39113b89c7
0x5585d30d4d30: 0x2f211b23d1978177      0x8f67e7105541c431
0x5585d30d4d40: 0xa03af6f29ba057ca      0x51fc114d1b1a84cb
0x5585d30d4d50: 0x0998e01cb16d811f      0x35f1756f74eafa7d
0x5585d30d4d60: 0x2defc08610dfe473      0xb7cefa5f2b062500
0x5585d30d4d70: 0xea03a20f8a2cc70d      0xdedc984992102403
0x5585d30d4d80: 0x5f004ee2a4e85b89      0xcb9a72682d6627a5
0x5585d30d4d90: 0xd62061e1d92c9cd0      0x71b81f98b9b459f3
0x5585d30d4da0: 0x1c4ce9432219910d      0xba09f8f23423b121
0x5585d30d4db0: 0x92d5597fe5e75495      0x81e6e75f0e501745
0x5585d30d4dc0: 0x7bf7f9714056caf5      0xc9107bf6e78dbf35
0x5585d30d4dd0: 0x3e86276578ff5396      0x21d2641a7cc3bea7
0x5585d30d4de0: 0xf17da7b0e34cb922      0x1e44632314f327f6
0x5585d30d4df0: 0xcbedb904ab420e1d      0x471838e210aac786
0x5585d30d4e00: 0x7fc3d1e0ee415a34      0xae68f1f3a25f9668
0x5585d30d4e10: 0x4828448e395b5a9b      0x97f4b23c58a4669d
0x5585d30d4e20: 0x35cc0b8ef6ef2b87      0x7e59b4cc3ba220de
0x5585d30d4e30: 0xaea98f373f3e2bae      0x244691453f4b1650
0x5585d30d4e40: 0xf2a27ccfcc595d5f      0x693d62b236ee5035
0x5585d30d4e50: 0xae0bde7f5d68013c      0x3260a0315468e461
0x5585d30d4e60: 0x4506b83655a44a25      0x08e410f5a671565c
0x5585d30d4e70: 0x6f67f3e4e2f1f74a      0xf0c5155ff0cdcb68
0x5585d30d4e80: 0xa27754778a47f308      0xb9f82dfe6eca112b
0x5585d30d4e90: 0x37a4ec35a5712598      0xaa22f5c90f85fbec
0x5585d30d4ea0: 0xb35e5e8cdca0feb0      0x4593a24d3b80c27a
0x5585d30d4eb0: 0x36dfc72a9aba103b      0xd0d5ba575dc34b0b
0x5585d30d4ec0: 0xbb1d75c6d371f6e2      0x26b0b4e1eec5e6a7
0x5585d30d4ed0: 0x2c85b8301e5fe775      0xf2af7460c2ab330c
0x5585d30d4ee0: 0x3c7349b249c9991c      0xd72026bc16091035
0x5585d30d4ef0: 0x262c97d357b3cfec      0xad3fbf26362b6ca5
0x5585d30d4f00: 0x8d8434d6ab078de4      0x9045662915f8e76a
0x5585d30d4f10: 0x3a0f4129deadff4e      0xc9107e8a0585d236
0x5585d30d4f20: 0xd339f4dd78c834df      0x88a4665bf8c815a2
0x5585d30d4f30: 0x43c4ee6d04013ccd      0x8d278b602155e1f5
0x5585d30d4f40: 0xde4341f9ff7b16ce      0x0edec09f888d1012
0x5585d30d4f50: 0x522dd8bb38ccdbc0      0x8fa1aff7e5e8a805
0x5585d30d4f60: 0x2481a1fdf7826ad4      0x631c1b2bf3760efc
0x5585d30d4f70: 0xa43fac76377028da      0x122e30266c63ba56
0x5585d30d4f80: 0x2addb59eb8d46fa5      0x740eec5e1dccbc2b
0x5585d30d4f90: 0x66d49758d8b887ff      0x6b700919c690268f
0x5585d30d4fa0: 0xaa61cdd31f6f2155      0x6c02d92ace680283
0x5585d30d4fb0: 0x562fc6d6cd63988f      0x9f80c02d4ad366ef
0x5585d30d4fc0: 0x8a38d6c29e5d5465      0x109a60e97da95130
0x5585d30d4fd0: 0x8d44eeba3c8e1865      0xbe72ddea5198b862
0x5585d30d4fe0: 0x63b59ee0b90f531d      0xdd409c7cc2bb2eb1
0x5585d30d4ff0: 0xe0f959f330287a26      0x8df66e630942ca12
0x5585d30d5000: 0xbded2c64436b3949      0x27532c5c43105121
0x5585d30d5010: 0x120b3307f2f07f79      0xdcd3ac65d37329b0
pwndbg> 
0x5585d30d5020: 0x0000000000000000      0x00000000000000b1

We can see that it ends with null bytes.

Similarly, the shield_prekey is of length 0x4000 at address 0x00005585d30d5c00

pwndbg> x/2048gx 0x00005585d30d5c00
0x5585d30d5c00: 0x5b6f73e215957b73      0x9b35dd973f5b7838
0x5585d30d5c10: 0xbfbeb5fb6ff66b32      0x3036ef3496a56943
0x5585d30d5c20: 0xb7b78b39289d6c7d      0x3b98c2907b014c75
0x5585d30d5c30: 0x6afbeec92f58f1ea      0x316d3f352bbd1fdf
0x5585d30d5c40: 0xccf93bbef8ea7607      0x21c76ca7abf91071
0x5585d30d5c50: 0xcc2bbe1b9d1cbd4e      0x692c2a93214d4158
0x5585d30d5c60: 0xf7cf561ef348f49f      0xb509c18ebeeec19c
0x5585d30d5c70: 0x66dbbda9f2f7b1b8      0x5577a6e429b51b65
0x5585d30d5c80: 0xd8550219023336b5      0x451662a255da825c
0x5585d30d5c90: 0x3e21080f7da61c38      0x2f8db3c56e3be2c6
0x5585d30d5ca0: 0x1dcff36d7b60fc82      0x2fb55976f181d26b
0x5585d30d5cb0: 0x9c025d2c2a215a84      0xa2cc93e14717ee50
0x5585d30d5cc0: 0x2b0388c24bc29ffe      0x3f249ec7c1efdaef
0x5585d30d5cd0: 0x68287d82d020b3fb      0x673cc78365ac13b6
0x5585d30d5ce0: 0xb2995e0bbe48a8c6      0xb9e812885d534ea6
0x5585d30d5cf0: 0x28b1501be05876f3      0xfc36cd7f7ed387ba
0x5585d30d5d00: 0x201956496f36974b      0xc677e223a3d33787
0x5585d30d5d10: 0xa995cbcb51855c38      0xd0e9748be564f667
0x5585d30d5d20: 0x53e5b3436c8be869      0xfe76e2a3ce65851d
0x5585d30d5d30: 0x3b1efc6f41db6f59      0x40dc2954c8aa8fa3
0x5585d30d5d40: 0x31f09c55e6dc9296      0xcbd189e5b511d23e
0x5585d30d5d50: 0x8b3bea32e6d5bf49      0xf6b4386942dabf16
0x5585d30d5d60: 0x03500129d442c2a7      0x7d6a91241f2fa32d
0x5585d30d5d70: 0x4d6b3085935cb034      0xb87e4230988b623c
0x5585d30d5d80: 0xfcb8b99a0b3a9903      0xcfe39ad622dd7cdf
0x5585d30d5d90: 0xb2d4c96ea7ca1b61      0xa9563b1f0bca23e0
0x5585d30d5da0: 0xa896eb9d8b90d8da      0xbcc1dfba9afa83b3
0x5585d30d5db0: 0x4639187818969e44      0xed870c0a0fe7711c
0x5585d30d5dc0: 0xfb6a9fd6cf12408f      0xed784ed86c500105
0x5585d30d5dd0: 0xc0ea4e47f3e65665      0x09ca6ac32e10ba8c
0x5585d30d5de0: 0xf15f2e4089f42949      0x818182f55136d8e3
0x5585d30d5df0: 0x9e45b8c335dc1823      0x3645fe02773b2da9
0x5585d30d5e00: 0xd4db5b9e98821d21      0x90f8578aa1d3d400
0x5585d30d5e10: 0x06fa0d63efb69fcb      0x1d55c8b18555e9aa
0x5585d30d5e20: 0xefde4d8256721f1f      0xc2b68325b8370528
0x5585d30d5e30: 0x8914ac4f51f2c9dc      0x94affd663b97f889
0x5585d30d5e40: 0x302e67e4280881c4      0x26053cbc09e1828c
0x5585d30d5e50: 0x66e2fac05245697e      0x8c1495cc9db951d2
0x5585d30d5e60: 0x2426ff5b7fe8adbf      0xe774d98d5b3fede1
0x5585d30d5e70: 0xe3b9bf7e90e702f2      0x08b5053d750aeb72
0x5585d30d5e80: 0x00d988762cf0aae0      0xbdb4a77342ccc4c3
0x5585d30d5e90: 0xda3a1b5d3e140522      0xbf689c4e032d1d5a
0x5585d30d5ea0: 0x8dfbe320df4bf2ba      0xb986c59f00274807
0x5585d30d5eb0: 0x6be324bc0f62f7ba      0x2f4c6340fea1116f
0x5585d30d5ec0: 0x891142aa6409d4ac      0x2fa18eef779f69a6
0x5585d30d5ed0: 0xe6333d95f9fd7af6      0x37a01e33d5ed83d2
0x5585d30d5ee0: 0x58be091ef7bb93ac      0x1214e011c2ed2195
0x5585d30d5ef0: 0x1d06fa08d8c34b4f      0x23648b918db31943
0x5585d30d5f00: 0xc8f80e949a407818      0x0e6e4c8b5a59372d
0x5585d30d5f10: 0x71720d9c3a3fbe69      0x854029db5b8f123a
0x5585d30d5f20: 0x2b335f16b1888498      0x4dfecc658c3324b9
0x5585d30d5f30: 0x01b42f985e5c59cf      0xf5ded970454a3ca0
0x5585d30d5f40: 0x36a6ef5ff27220ed      0x6b919542dc25a09a
0x5585d30d5f50: 0xb3c65d7880ba63d9      0x9cc7aa23207eb77a
0x5585d30d5f60: 0xae2b2e932006bc10      0x100c822244688716
0x5585d30d5f70: 0x835eac78b1c441a5      0xef5c55546debb0f9
0x5585d30d5f80: 0x61e1058fa6fe8088      0x56904da6a272c4a8
0x5585d30d5f90: 0xa5255c9a62109766      0x64c98ded8670ecec
0x5585d30d5fa0: 0xaa4fb92a33045b1f      0xcb318e9020336794
0x5585d30d5fb0: 0x9f72209d564392af      0x44f1754de04e19b8
0x5585d30d5fc0: 0xfcea3dc3b3139045      0x9d9db96723c636fe
0x5585d30d5fd0: 0x95f2ffbbe8e8efd8      0x5ef58c8a10741bc0
0x5585d30d5fe0: 0x47b8dd00e11326d3      0x86342180a36299bb
0x5585d30d5ff0: 0xd887634dfb079060      0xb07bc3c88bd343ca
0x5585d30d6000: 0x8c80c518fd879254      0xcbcf1f1cfadcf4bf
0x5585d30d6010: 0xd89fd814f3c6eae1      0x03fb4f960f2501c9
0x5585d30d6020: 0xa303332ace47a63a      0xde130c534397599f
0x5585d30d6030: 0x9b01e64ba35aab51      0x73d4758b701e789f
0x5585d30d6040: 0xa77a4311d6bd6713      0x541e2f6219070d45
0x5585d30d6050: 0xbf4f6698069ecd3d      0x36d3857c488ee115
0x5585d30d6060: 0x72c5dd5ac52194c7      0xc50113419967964b
0x5585d30d6070: 0x612f0e4161e3e031      0x8cf99d85bc576414
0x5585d30d6080: 0x5e3086d2d354f8a4      0x43271a9b7f17000e
0x5585d30d6090: 0xbc5dec54e2102ab4      0xe4f7b39b76e3a700
0x5585d30d60a0: 0x2105bb911340cb36      0x5a63a30630e5a106
0x5585d30d60b0: 0x78596149ba43bd52      0xada609248515beaa
0x5585d30d60c0: 0x3924bc8838c82403      0xf4136edbaf9d4fc6
0x5585d30d60d0: 0x0d201f4caf3656c4      0xd9a1e4e5eb567d29
0x5585d30d60e0: 0x79b42c2207097699      0x3ecb5544eb674850
0x5585d30d60f0: 0xce91c3076fd69683      0x6c92d7551e9f5082
0x5585d30d6100: 0x8dfd3f43c0b7a547      0x4a355b181b445b75
0x5585d30d6110: 0xbdbb81563aba5383      0x5bd3069f3cce20e2
0x5585d30d6120: 0xdea0e7565fceb485      0x36b6dfd5ef17dcf4
0x5585d30d6130: 0x8fc01380ec246e79      0xb0fc9f9b4577f188
0x5585d30d6140: 0x4bce6c79df9f03f3      0x134cefab4eb84bd2
0x5585d30d6150: 0xccea66cc4c6484fb      0x16d9b7f302acf69f
0x5585d30d6160: 0x6908990d01681d46      0x22a48980dfa94149
0x5585d30d6170: 0x90b08b30037849dd      0x9d2bc41bb17501db
0x5585d30d6180: 0x7afbe6f72a04e959      0x00710caaf114f42d
0x5585d30d6190: 0xe500577ded8efb37      0xfe15592d9dd328e5
0x5585d30d61a0: 0xc8e5b8c069f520fb      0xe51a72dca2e888a3
0x5585d30d61b0: 0x46eb775ee271f6c3      0x34f4d7b10a70d1f3
0x5585d30d61c0: 0x1e51af1817d09cc1      0x1e321cbde2f4eef7
0x5585d30d61d0: 0x75fd5b9d5a59b668      0xcd7ba69227e1fb9f
0x5585d30d61e0: 0x6608bbbbfe693d53      0x8137bce12b8ab8be
0x5585d30d61f0: 0x94c11fea369c8880      0xc5a5726f74499aeb
0x5585d30d6200: 0x2046a3a6925c4147      0x755ca75de5f1a914
0x5585d30d6210: 0x47aad77f2028a48e      0xb1d8aaab673c12ff
0x5585d30d6220: 0x9350a859b5fe4939      0x8473711e0e157ea5
0x5585d30d6230: 0x92762d49ac5f96df      0x5de9ebaff8f0b04f
0x5585d30d6240: 0xa7b50e918254d59c      0xac92df540e7bf5bd
0x5585d30d6250: 0x489c8e52d2300179      0xd45f951aa212564f
0x5585d30d6260: 0x8f6ba3a56c5d96b6      0x91e6cc067f02bec1
0x5585d30d6270: 0x2bf06f06d2db4da7      0x60556b4f3abb7b34
0x5585d30d6280: 0xf4e9d237ab045d5a      0x370b8af16b15f60c
0x5585d30d6290: 0xe53fb3d7103fc031      0x1fe5090435928c7e
0x5585d30d62a0: 0x7b64278ab502b385      0xe84e3e591789cf12
0x5585d30d62b0: 0xb5af5ea72772775e      0x689e78186cf87edd
0x5585d30d62c0: 0x67604f31ee3d9c78      0x73847b6eeaad1567
0x5585d30d62d0: 0x9d3d75282792a921      0x7035c9e58da888e9
0x5585d30d62e0: 0x7ac4caf764929729      0x66506ca46504b94c
0x5585d30d62f0: 0x2a6268576fb27739      0x85f3bdc59db34d0c
0x5585d30d6300: 0x431ca8e8600fdcaf      0xb28c666e4745c2d5
0x5585d30d6310: 0xee514ca617dea3f7      0xdb7026ba4958f316
0x5585d30d6320: 0x6e371c1a54a2c062      0x3be345a47aff7811
0x5585d30d6330: 0xcbf2fa67937b75e2      0xe73e9133967ae570
0x5585d30d6340: 0x9a63e8e58bf05453      0xd9bb80b8da13b1d8
0x5585d30d6350: 0xe5e361f74a3a3871      0x3df83ffac8b4dda9
0x5585d30d6360: 0x565acc1dcc1d2073      0x63b254f55125cbec
0x5585d30d6370: 0x1cc024677bd97396      0x57e78a3540635008
0x5585d30d6380: 0xe3c5c024a8a4a428      0x8420da553815931e
0x5585d30d6390: 0x69ef9092f9262f13      0x01b870aa97bab44f
0x5585d30d63a0: 0x990e55f7335b6b76      0xe90b7b260e44da62
0x5585d30d63b0: 0xde4121b01b24b9be      0x1ad29e438a753cad
0x5585d30d63c0: 0x0097b91e574f796b      0x28f5b663b6101761
0x5585d30d63d0: 0x1e604939aecf52c7      0xf4e581cbc2bd496a
0x5585d30d63e0: 0x2ce6b83f65e21de1      0x668325c5f9dba172
0x5585d30d63f0: 0xcfda332b16002ef3      0x01998b69f09baea8
0x5585d30d6400: 0x60a37a98eae649cc      0x6f3dc77e3faf652c
0x5585d30d6410: 0xae867322cd5e4831      0x5649d30fcc614b4c
0x5585d30d6420: 0xb02e60eaa1398a34      0x169fea708897e2fd
0x5585d30d6430: 0x5c7446e15ae68966      0x180a1ecda570a338
0x5585d30d6440: 0x999c3ddadf950e09      0x258915f060ac15a8
0x5585d30d6450: 0x07211901e4b32569      0x139ec171fe17d6d8
0x5585d30d6460: 0x3155d10f27edd91c      0x1b05cf4bc5392b7e
0x5585d30d6470: 0xcb5dbe08b16bea67      0xe32a84ceba6e2a31
0x5585d30d6480: 0x22fa404a29f47bf2      0xe90ae9b789caa8f8
0x5585d30d6490: 0xc9b66f4556966d99      0xe8f98b03c7b9e573
0x5585d30d64a0: 0xc07c9709e9bc227b      0x12be01d239ce7a02
0x5585d30d64b0: 0x81fdedd229bfec68      0xc8ffb8125066bad2
0x5585d30d64c0: 0x337c2611ccb5b641      0xbba2a9e783a4aaba
0x5585d30d64d0: 0xc00452c1dac130f0      0xca8aa90a399f228a
0x5585d30d64e0: 0xe8718b7f31aa5d4c      0x342f559fcff42d28
0x5585d30d64f0: 0x4d0c5f3b379a24ec      0x56e8e08451bc7069
0x5585d30d6500: 0xd3ffe9ca544c88a3      0x0daf4f619112a244
0x5585d30d6510: 0x70ed4f65d7222734      0x8a8f07d39eb8aa18
0x5585d30d6520: 0x0e1ef5f0279b19ca      0x6aa167f9a3117c26
0x5585d30d6530: 0xbf51bb6f4e8594c1      0x0f6b224de34a8332
0x5585d30d6540: 0x8beed61112d91105      0x71a21da706193553
0x5585d30d6550: 0xb5eb24eefcf1d190      0x8d4315997fa08dc8
0x5585d30d6560: 0x3f1806ebb37e25ff      0x34dffd723164ad57
0x5585d30d6570: 0x548aeba50634f252      0x2338c0e978cfa7cf
0x5585d30d6580: 0x546b2745008d532d      0xebca3aca34f8a85e
0x5585d30d6590: 0xa4af151b5d46f225      0x5bda6eeeed86d613
0x5585d30d65a0: 0xdb7eb02d8e92a954      0x103e707ae88d38ad
0x5585d30d65b0: 0xb82b38db73e4835f      0x80556bcd20749661
0x5585d30d65c0: 0x0ac56777e334530b      0x3ac8c818bbb8be15
0x5585d30d65d0: 0x313d5613ddf94a65      0x694f0af235e2a2ec
0x5585d30d65e0: 0x810ebbf9eec7dcae      0x58b6dbe3dfa99a1e
0x5585d30d65f0: 0x26558565f0d30d23      0x366d3156ce0a01b5
0x5585d30d6600: 0x582c3b0acdc470f6      0x53ee580bde9a2607
0x5585d30d6610: 0xc3d09b19d94d877f      0x40d025bee3c3bad9
0x5585d30d6620: 0x09d095fca5bfae5b      0x948e4a4f086e49fd
0x5585d30d6630: 0x01b54f411e41f112      0x84ce1005955d7657
0x5585d30d6640: 0xda3f95d7b0eca93b      0x83a8e15ae310f340
0x5585d30d6650: 0x3fffb48aa7b08792      0x6ff99366fa78c7b8
0x5585d30d6660: 0x011b771aa24d544a      0x39b915172dc1c68d
0x5585d30d6670: 0xae82098130729108      0x20bc721a55889a86
0x5585d30d6680: 0xda4b93c26bdbde1d      0x8a09d9fb1fb6027b
0x5585d30d6690: 0x896233cd7386c542      0xa605f33e2ae3f856
0x5585d30d66a0: 0x43483c64cd4f2195      0xfa0e4f2165d2bb77
0x5585d30d66b0: 0xdab11bdd4f265626      0x73ba759b9858b1ff
0x5585d30d66c0: 0x42cb51c0cc5f05d0      0x985d5d2514142205
0x5585d30d66d0: 0x523048da8db64c7c      0x034fe620073f1cbe
0x5585d30d66e0: 0xffdc0b054f1dbf2e      0x44a012cb034b9686
0x5585d30d66f0: 0xf980a6212ba06430      0xe27e6e7bcd7ce844
0x5585d30d6700: 0x27efc23da5361a5f      0xd3a02ac2dfe6bafd
0x5585d30d6710: 0x17fc8cd0c6623ac5      0xc65391df9227956d
0x5585d30d6720: 0x3a48049e3cc3fc5e      0x086f78794571e09f
0x5585d30d6730: 0x8c1855bee7fa0d8a      0xe525ddd842caaf35
0x5585d30d6740: 0x50ca79dcf37cb167      0xd1b69efcf14f531f
0x5585d30d6750: 0x43c0b37e86865bf2      0x9ab6347d72322798
0x5585d30d6760: 0x4b2b39fdcc62250e      0x802f0a585592a99d
0x5585d30d6770: 0x29a51e533fa546f5      0xabf7546122c32173
0x5585d30d6780: 0x144cdc338d1601d1      0xf53e7ec85168d827
0x5585d30d6790: 0x57c4a4569cd97aa5      0xacb39b82fdce1545
0x5585d30d67a0: 0x4c509f579316a495      0x634b9efb6897b35b
0x5585d30d67b0: 0xf4ec8be9becbde88      0x90f650fe937e3e4c
0x5585d30d67c0: 0xda9edfdd321c1c87      0xcabfc325b932606a
0x5585d30d67d0: 0x0ff3563836b75bc3      0xb0fce57b9d2546df
0x5585d30d67e0: 0x9870644542d96e01      0x5077927259ad75ea
0x5585d30d67f0: 0xd54e2f8966d5c010      0x3c3555d3e37cea4e
0x5585d30d6800: 0x7a5fcb378474a832      0xe1ffa42b03a0f71f
0x5585d30d6810: 0xe1298db6e9f44053      0x0d9e4a7bdebd69b3
0x5585d30d6820: 0x79dece2e60e3eb43      0xa4f16e671d4e175c
0x5585d30d6830: 0x63694c0f61060efa      0x83fe4a54eafe0b6b
0x5585d30d6840: 0x148da2b826a4f408      0xe5bf5927df4da484
0x5585d30d6850: 0x1981dda57ddad644      0xa34aab004b02a502
0x5585d30d6860: 0xc5a315fa02d24314      0x9b6a0a0a4054e560
0x5585d30d6870: 0x3c161893c515f622      0x596261205ca62b70
0x5585d30d6880: 0x4fbc82c62468f79d      0xf7defcd87f4e0e23
0x5585d30d6890: 0x75db9459707d1c45      0xf41fcc653841ce7a
0x5585d30d68a0: 0x947d687a1e4dc40c      0x8bc19079ed697316
0x5585d30d68b0: 0xbc536181830cca25      0xc9f075e0a2b969a7
0x5585d30d68c0: 0x07ff26ac99eec295      0xb89c6edad840bfbd
0x5585d30d68d0: 0x2301529eda76231b      0x9f2fda2ecba25d7a
0x5585d30d68e0: 0x0273b6f821c4fb15      0x3434d6808fc4305e
0x5585d30d68f0: 0x1beb15756c5dabe6      0x98773ae7cb71b7f3
0x5585d30d6900: 0xa1cf84b7690a1501      0x1656d52c35b94017
0x5585d30d6910: 0x9899aa4941830fd2      0x6483c0b35b605ea2
0x5585d30d6920: 0xb32f5ced44f05c8a      0x4293a60fcfa4fb8c
0x5585d30d6930: 0xc35988a18602165d      0xffa29a2675e86342
0x5585d30d6940: 0x8b4fb263fe931625      0xb5b19366aa1af1bd
0x5585d30d6950: 0x26b4a3409857d407      0xd8c4898568739bb2
0x5585d30d6960: 0x5b1f2aa8cdbbb4ba      0x5eb85a95139595ad
0x5585d30d6970: 0x87e97ca15344db9a      0xd9f6b82a5b455447
0x5585d30d6980: 0xae9c1c2d16640275      0x7674d98423c5537b
0x5585d30d6990: 0x52aed1b2d4defa45      0xfdaeca9c34ccae1e
0x5585d30d69a0: 0xfbe766e867c90b3d      0x9268e2b69bd1fa1d
0x5585d30d69b0: 0x6871dd568c9efb5c      0xa349568e4144b8ce
0x5585d30d69c0: 0x0342b4aea3f0c04e      0xbe4e7776e4d690c2
0x5585d30d69d0: 0x6d181814ba5ebde3      0xec675ed35983a236
0x5585d30d69e0: 0x2592774b525a09f3      0x73fd264954fd0d14
0x5585d30d69f0: 0xdd71090d50d81f2f      0xd3b44ae76c5d4b20
0x5585d30d6a00: 0xe1fa2e787feffc34      0x799a3be1f7f06fd0
0x5585d30d6a10: 0xb71b21165cd41d7a      0x7025e8f95a39ce98
0x5585d30d6a20: 0x18163349b329cd4f      0x556ccb952f90b73c
0x5585d30d6a30: 0xc4ad70881435014f      0x1e1589046eaecbd7
0x5585d30d6a40: 0x14e47fc9e0eb1c78      0x646a1c01aa03aee5
0x5585d30d6a50: 0xfe7c34f925bd7cc9      0x03cf2e864a7255b5
0x5585d30d6a60: 0x08dcd26854a1ff18      0x73d91730df58afd1
0x5585d30d6a70: 0x3e7bf01181dbface      0x4a6ff0a35500841b
0x5585d30d6a80: 0x2d268088d912c70f      0xfbf19b4c9a59aeb4
0x5585d30d6a90: 0xf83a029f6c67eadc      0x7bd059fb96dc3e70
0x5585d30d6aa0: 0x9f44f21d5e4fcd81      0x3262161e367abe9e
0x5585d30d6ab0: 0xdcaf4eebfdf991cd      0x60139350df17f71b
0x5585d30d6ac0: 0xeeaee2f646750ac7      0x7988f32cafd042a6
0x5585d30d6ad0: 0xdfdea25fe788f57a      0xe6311145a205adca
0x5585d30d6ae0: 0xf69585d4ff57d5eb      0x59b0d4bd37c714f3
0x5585d30d6af0: 0xd4fc243a12d7ed45      0xa9b0d6052ec832c7
0x5585d30d6b00: 0xee451714babc74a3      0x49a86dbe4fb8300a
0x5585d30d6b10: 0xfd8223d4aa3319df      0x3497a4da8efafb1e
0x5585d30d6b20: 0x89bbbac99d33cb12      0xde223ee900cf724e
0x5585d30d6b30: 0x4f3bfb6682ca2464      0x19ff46983fd4f473
0x5585d30d6b40: 0xff108f07eb035886      0x65941c3c3ba2b79f
0x5585d30d6b50: 0x7b9675a14b4299b3      0x3a9336666fc23424
0x5585d30d6b60: 0x69ac9c2e8ad88cbd      0x2f7b91719a5e6cb7
0x5585d30d6b70: 0x82f5d0749d1a7a25      0xab6c7ef6cb2006ae
0x5585d30d6b80: 0x685d832c6b0fae9f      0x51fc47996646bb9d
0x5585d30d6b90: 0xbcfbe85a1296b122      0x95e915456c8fcfd0
0x5585d30d6ba0: 0xb0678fc1e7c66e6a      0xe22aaef0a101c0a5
0x5585d30d6bb0: 0x4c696cad7775b912      0x95e1276f342322c6
0x5585d30d6bc0: 0xbb76b5a80cf4c24f      0x83610d7a1bb00bb1
0x5585d30d6bd0: 0x65fd131405d0bc0f      0xdb1ed2551e69db15
0x5585d30d6be0: 0x55b3296b93d6b60d      0xaaacd29ea9374b9b
0x5585d30d6bf0: 0xc64b6ca617dcabdf      0x8e6b521f068b5b4e
0x5585d30d6c00: 0xb2f1fa5056c07902      0x625f3c81c3116ba3
0x5585d30d6c10: 0x3fd7ae531efe6785      0xf0784ab158c1add4
0x5585d30d6c20: 0xfb43bf433c1b662f      0x2e8b994d599b09d6
0x5585d30d6c30: 0x3450bf04da1cf092      0x23636ec57aa38bae
0x5585d30d6c40: 0xe29e4be5547ab4f5      0x37a354f2a11e5b27
0x5585d30d6c50: 0xa70490f02e39d7e9      0x150df6f17015e335
0x5585d30d6c60: 0x70936096818cbc38      0xd8b6e54be7790c30
0x5585d30d6c70: 0xee7aebe9464065a0      0x40e18cd34d5d1b58
0x5585d30d6c80: 0xf712d6fb3175b79f      0x624b5ae01b9ce875
0x5585d30d6c90: 0x84da2036f4349213      0x96ebe0ad714064d0
0x5585d30d6ca0: 0x0d60b62f9e268774      0x4a8d3d297721fdad
0x5585d30d6cb0: 0xf27f16afc37347a7      0xff28addf6bd429f5
0x5585d30d6cc0: 0xba4707c7392748b8      0x4b3c8771d4bd8d41
0x5585d30d6cd0: 0x97a19aa230f2d41f      0x85d2a74e69e3ffe0
0x5585d30d6ce0: 0xa2e03f3fce50ff17      0x8f00c3a38565c267
0x5585d30d6cf0: 0xbdaf1c9565fa0b85      0xeb94a4ae776d5d14
0x5585d30d6d00: 0x01166b424549cce4      0x472b82207d42ae61
0x5585d30d6d10: 0x549df42e7d7a0c5c      0x53ac06aef3d1162c
0x5585d30d6d20: 0x84f975914dcf2486      0x3a8ac4ddbc47a6a7
0x5585d30d6d30: 0xdc8740b48faa1c0d      0xac1a9bf106fc8fec
0x5585d30d6d40: 0xbdddea4fe53f6d60      0x70bd044f5d87648a
0x5585d30d6d50: 0xaa7818b471367e2b      0x0d72ae1b907615ce
0x5585d30d6d60: 0x9a96e3662157be66      0xe4b91a1f32a4b5e9
0x5585d30d6d70: 0x611e5e5ce6098055      0xdb7c79fde092492a
0x5585d30d6d80: 0x1e67532785aa8d0b      0x9031643d97475f9c
0x5585d30d6d90: 0x15222cca50931446      0x969acef283f4f321
0x5585d30d6da0: 0xb1b1a3ecbfea2906      0x022b83e84b113768
0x5585d30d6db0: 0x123911a422222ceb      0x903ae29b4097f3bd
0x5585d30d6dc0: 0x6ff62d88101ffceb      0x77fccb572c9421c5
0x5585d30d6dd0: 0x035e2d3278208437      0x5f339e2561339ceb
0x5585d30d6de0: 0x829cf80b16e54dbd      0xa75e3647adbc59da
0x5585d30d6df0: 0xffebc39d8f24eb3b      0x9435b06f9f36fcfd
0x5585d30d6e00: 0xaafe060acb970990      0x853fbba7556c2079
0x5585d30d6e10: 0x716ea0f35c41d1aa      0x4a1e9e271739f714
0x5585d30d6e20: 0x68a5faece94b1edd      0xc7320720ef3d8ca2
0x5585d30d6e30: 0xb19162024814259f      0x32e65bf7183b99f3
0x5585d30d6e40: 0x038f2ad6dfafda1e      0x043f201ff0dcd4a4
0x5585d30d6e50: 0xc554c27c1716be67      0x58bb438bdb47e148
0x5585d30d6e60: 0x9b31f4fd652050c5      0x79305238e844535d
0x5585d30d6e70: 0x4ab6b5b5ec6f102f      0xca986805c8a8160c
0x5585d30d6e80: 0xc4591e8c3a3533c7      0x8641741ea93d0f1a
0x5585d30d6e90: 0x0212bd6b4395e74a      0x379c8cb6a19c72be
0x5585d30d6ea0: 0x360c022a3d2382a1      0x7d06a1b5e0dc0b0e
0x5585d30d6eb0: 0x94dcbaa15584760b      0x4111c3e2228d732e
0x5585d30d6ec0: 0xac0e830b449d05e1      0x18af46b96dfa3dfc
0x5585d30d6ed0: 0xefb22ab310534896      0x7a94671cd5f65d9c
0x5585d30d6ee0: 0xb3b883617ee39601      0x218738ef80571901
0x5585d30d6ef0: 0xc06c9cc52010b3bd      0x240ba7bb99a36aad
0x5585d30d6f00: 0xacd97aed9bcea7cd      0x9bfd0dbea11abd81
0x5585d30d6f10: 0xa73cfc3ee8a43d4e      0x81f6dbf4426c50d2
0x5585d30d6f20: 0x97e19efc58b52b4b      0x7203eef1a5d2767a
0x5585d30d6f30: 0xc6a0a0c536810c7e      0x10da6e18216e6137
0x5585d30d6f40: 0xd8657441c474b838      0xe6850cb7c5474ecb
0x5585d30d6f50: 0xe99e977077c8eb94      0xe56bad6e02ca81b2
0x5585d30d6f60: 0x78569b2e1532fac1      0x1e1793e1da6af3d6
0x5585d30d6f70: 0x7ca30656cb63b3b5      0xc1d2819ba299cc78
0x5585d30d6f80: 0x7a992e0a6f55d2d9      0xaad7fe64a09bddcc
0x5585d30d6f90: 0x31c58dd0dfbf232e      0xc48a86227314e9c9
0x5585d30d6fa0: 0xbb00353e4d64a607      0xf68c9f45f3128896
0x5585d30d6fb0: 0x95498a0db3057e39      0xa7dae550fdf9b762
0x5585d30d6fc0: 0xa719a6f703d1b5ea      0xf752075dad8114fc
0x5585d30d6fd0: 0x3eedc0ec4f154d28      0x6a57c2be55ea0be9
0x5585d30d6fe0: 0xa44d6091da52478d      0x3c128e42be244ef4
0x5585d30d6ff0: 0x037539baf37a4763      0x34cf58c49a19afe3
0x5585d30d7000: 0x1b77ee75922a5570      0xd431f58f91dfa44f
0x5585d30d7010: 0x20db26226e8a1b4d      0x61dda96978c77bc1
0x5585d30d7020: 0x3f724e049902f7e9      0xb224a2489f6030bc
0x5585d30d7030: 0xfca0937387840475      0x2ac9ae469395554e
0x5585d30d7040: 0x41ca993c20cafd30      0x2b166a3f52688929
0x5585d30d7050: 0x0b09258bfc9cb06f      0x12dcf454c2014189
0x5585d30d7060: 0xc295f0eea2e5f87c      0x8cbe4dc26be09bda
0x5585d30d7070: 0xa8bfc5e1f9f5f8c5      0x225f044dd4d0dab6
0x5585d30d7080: 0x2d091bea460a1f34      0xcd06a0e3a855c320
0x5585d30d7090: 0xec546e41464b6dc6      0xb9f70cecc139e210
0x5585d30d70a0: 0x4c51b89262485995      0xa7c0339c5ddeee4b
0x5585d30d70b0: 0x4e8181b065622a28      0x5950e9a9e0a24f9a
0x5585d30d70c0: 0xa804f8b03c887058      0xac9789745ea97706
0x5585d30d70d0: 0xaad8eefe251b08a9      0x66f41f31da5aa694
0x5585d30d70e0: 0x95a0741afb04b0bd      0x8aa6e89f08cff9f4
0x5585d30d70f0: 0xbd4da54756dc5ea8      0xaa2b2ff9fe85d731
0x5585d30d7100: 0xdc9bc362e3fffb40      0xea3026164ae755ee
0x5585d30d7110: 0x96deaef04db27e6e      0x1a98ae0d93e0fcfd
0x5585d30d7120: 0x0b39358a42022015      0x59e6dbe99401985d
0x5585d30d7130: 0x920b2e0c13f30e22      0x2f6081f496947ad1
0x5585d30d7140: 0x4b2094d60a808b59      0x182c1c0f0d50b2d3
0x5585d30d7150: 0x2cae8e3132ef9a1a      0x4f94e0ee77212fa0
0x5585d30d7160: 0x524a6b8728c7999a      0x0b52fd2fb06f20e4
0x5585d30d7170: 0xb7c3dd846a48ab92      0x118d87c1fd9a33b5
0x5585d30d7180: 0x7e045b362ce650a8      0x41c5ac15c7ec9d86
0x5585d30d7190: 0xddf5be09ca10a4ef      0xc95e9726cfffe84b
0x5585d30d71a0: 0xf19af70d3ce00e27      0x48e54304dbd1f521
0x5585d30d71b0: 0x362840c4ccbec293      0x0d9dc66246c4d0f1
0x5585d30d71c0: 0x53494d36e69da96d      0x8ca1b7d869096828
0x5585d30d71d0: 0x33a346e3dd616a50      0xb00ef385a0e61247
0x5585d30d71e0: 0xad953c39ac7eb39f      0x5f5e566bc8162270
0x5585d30d71f0: 0xc9d6d90e7d1b7c56      0xa624a27f1bfa0c92
0x5585d30d7200: 0x7abedec817bccf5f      0x6fe399d579716080
0x5585d30d7210: 0x0c5e6963163af550      0xdeab28eb7f6bd5a9
0x5585d30d7220: 0xa9b5fbb832822b00      0x3007f58987b53cc7
0x5585d30d7230: 0xb98f13940052fa01      0xdbe3acb3d04798fe
0x5585d30d7240: 0x220b1774c21f5e4d      0x7c67f4527ce519ed
0x5585d30d7250: 0x71a263d570ebb039      0xc7988decb34a5702
0x5585d30d7260: 0x215b4e13e7ffba18      0x89d58517f2bc09ad
0x5585d30d7270: 0x161cb555018f7d7a      0x6ed62d057b811661
0x5585d30d7280: 0xcded55f8740ee7f6      0xcca5fdb58be59e80
0x5585d30d7290: 0xab582e1d09547682      0x5d0781c6815670f7
0x5585d30d72a0: 0x2a0a2c9e88e70cdb      0x18fb16b67ae6ce2f
0x5585d30d72b0: 0xf1f8b63e207b0faf      0xcd3de921761bef6c
0x5585d30d72c0: 0x78b7198432f3b364      0x0673d10f155ae2a1
0x5585d30d72d0: 0x5d9bf36021c54e50      0x5df0a092a54606cf
0x5585d30d72e0: 0x7d59bd32cdc1186c      0x636324bcdacc5481
0x5585d30d72f0: 0xb43273b99ace42eb      0xa74d042925f1cf36
0x5585d30d7300: 0x6c887080634ea59d      0xa3d8050c04e216af
0x5585d30d7310: 0x95b59af872a9a619      0x8da0797623b211ce
0x5585d30d7320: 0x011b4aca49a67485      0xd9d0ca4aead11049
0x5585d30d7330: 0xc6b8e71adcdb78b3      0xee818eefd98e5c67
0x5585d30d7340: 0x7e0504db73ad4460      0x49c034be124282b9
0x5585d30d7350: 0x27b054994653e34f      0xe3be4ca8fef017a7
0x5585d30d7360: 0x7f39cfcca0d1d7b8      0xfcbf6d7655c3ab1a
0x5585d30d7370: 0x79c9fea2976a64e2      0x6fd9a5bd262dcefd
0x5585d30d7380: 0xf5a3e3277f88632b      0xd764de943667d08e
0x5585d30d7390: 0x50e980249d7d68b6      0x8b1d27e9b32096f0
0x5585d30d73a0: 0xddadda23dcd77241      0x05ea606d0d462b33
0x5585d30d73b0: 0xe8d7b1c1260f26ad      0xdca14ae7413232b3
0x5585d30d73c0: 0x6931f6e45a7a98da      0x7f1faf2e96c1eae7
0x5585d30d73d0: 0x1d9cf18e6b580bde      0x05e79a10416ee0aa
0x5585d30d73e0: 0x18d8730753860fbd      0x4e4a65696ab04b51
0x5585d30d73f0: 0xf039bd644861c585      0xd44a2c27bc30f2e6
0x5585d30d7400: 0x505a0f04c9f96deb      0xb3163513ff9574b5
0x5585d30d7410: 0x2bde1c5241cb223c      0x2f91659821b2890f
0x5585d30d7420: 0xd60a915fdfd9c2f4      0x022764c23377fbd6
0x5585d30d7430: 0xe4afc7cf57ce647f      0x691f93881adb0a1c
0x5585d30d7440: 0x924b8e16d3dc1647      0xca7c18e125215b4c
0x5585d30d7450: 0xcae08c91ce53f353      0xf41f65a9856e0b70
0x5585d30d7460: 0x4b66bf868f660d9b      0x49b4ce8320a82291
0x5585d30d7470: 0xdb51974b19783998      0x82d77feda292b6bf
0x5585d30d7480: 0x7abe5ad08aca63a6      0xa8b3f6c2ffb8833a
0x5585d30d7490: 0x83d2da78b064c2cc      0x365c9b251c105fbf
0x5585d30d74a0: 0x368ca8cc4e7cb8f5      0x42fb5ceb1f33407c
0x5585d30d74b0: 0xb12b7f14fb00358b      0xdaecd9a40a8323dd
0x5585d30d74c0: 0x21c7f5f6cfbdca29      0x5ec091b40be984d5
0x5585d30d74d0: 0x26c1e34b41bc924d      0xf95886fdd2769916
0x5585d30d74e0: 0xf1e938c4ffcf0609      0x089207ac0b3a36a1
0x5585d30d74f0: 0xa1c3ba157e022036      0x75a75c5a21714cc8
0x5585d30d7500: 0xb17821b9c73375e0      0xaeeee0b6b8cc14bc
0x5585d30d7510: 0x66d40abef9813489      0x37136654c827187e
0x5585d30d7520: 0x24f8f782bc6ae4db      0x860075d0df9f8620
0x5585d30d7530: 0x0bbe85f957f7d478      0x3fb2bf9abfee9a9a
0x5585d30d7540: 0xf48c11ebdcd6a91b      0x44e31abaace7d34a
0x5585d30d7550: 0x1f8ad3bcc0b6dc47      0x93fbf08abd615b30
0x5585d30d7560: 0x8cab64badd83f69f      0x2009dcd3ddad359f
0x5585d30d7570: 0xea3580f663725a5f      0x4a4b23bad9fa422b
0x5585d30d7580: 0x895ddd3cd0175cac      0x7b8c14ae33673c98
0x5585d30d7590: 0x78acd2cf6283d000      0x008df509173f694d
0x5585d30d75a0: 0x927948387d659591      0x12b2e62dbfb2bad9
0x5585d30d75b0: 0x60c89c5e6d2ddcbf      0xc5296eb4a49bd1f8
0x5585d30d75c0: 0x91b6c17522d52de0      0xd51e82482102b1d3
0x5585d30d75d0: 0xb24ba41c3482d409      0xe6285df3b1dc5158
0x5585d30d75e0: 0xd1b3d1bee74654e2      0x8ac9b529d54b159c
0x5585d30d75f0: 0x7937288b753896ab      0x5b81ddfc4d1a3306
0x5585d30d7600: 0xbfe57b1fb75d37d8      0x10616e9f00c757b1
0x5585d30d7610: 0x38fc869a03c5f073      0x3a94f7572c4c2d77
0x5585d30d7620: 0x55727a9a6f5bbd7f      0xc70655f0d2594534
0x5585d30d7630: 0x4ffc959a3d6b8284      0x6a4f4b7f250ad539
0x5585d30d7640: 0x23bbc1e525ec7b1f      0x034d7adeeacde7b7
0x5585d30d7650: 0x353ccee63716919c      0x472464fcba1f220b
0x5585d30d7660: 0xb92867d1e027dd0d      0xaf8a5947793624db
0x5585d30d7670: 0x45ced7db7c24772a      0x553547aeb6c2cc56
0x5585d30d7680: 0x753206c456cd9273      0xba102fd5363e0465
0x5585d30d7690: 0x2cc84f6c1ac24d2c      0x682a7258cc96501a
0x5585d30d76a0: 0xdd75540176cefb11      0x4147eb586d1df25b
0x5585d30d76b0: 0x389b53b29922b430      0x3e8e76d2b63042c7
0x5585d30d76c0: 0xd4976f86f7a74763      0x6280c1727232aa9c
0x5585d30d76d0: 0x2be4a16f170a4012      0x0a45ed3ac758f7bf
0x5585d30d76e0: 0x1788aaee50e8816a      0x6e20523a249d9935
0x5585d30d76f0: 0x1b7fa739ef59bc95      0xb5949eaaa5338bd7
0x5585d30d7700: 0x8a7db30b3baa6579      0xa48fe4b760670709
0x5585d30d7710: 0x5c6a9104bc0914e0      0xd5369ca4c1daf066
0x5585d30d7720: 0x7a610e38a5b606ad      0xb2a6756ea0bc9ff2
0x5585d30d7730: 0x939d349554bb9492      0xe25c182658f66bb8
0x5585d30d7740: 0xc3aeb5c189127449      0xabc58fa8af0ce53a
0x5585d30d7750: 0x631d4b0c56c98010      0x1442facbf787686a
0x5585d30d7760: 0xb96c19686cc46fe0      0xe595cd143c8b8ada
0x5585d30d7770: 0xc629441af4bed0f8      0xeaa18394bcf73363
0x5585d30d7780: 0x6c9e9eb68b487d4c      0xf19b8f081be82e74
0x5585d30d7790: 0x4cbb1483a1454f45      0xd95e6e0c5e4c5bb8
0x5585d30d77a0: 0x2718c0bcd34b702b      0x2418f234e9067028
0x5585d30d77b0: 0x8c239984720a94b9      0x865a2ad0f89df66e
0x5585d30d77c0: 0x94e5909d8ea06077      0x44c625873123fb3a
0x5585d30d77d0: 0x917284136e913e0c      0x66bd1e0ab7eb3212
0x5585d30d77e0: 0x58f8697e92e0b3dd      0x50468b9e8c700eb2
0x5585d30d77f0: 0x58bd4ef7dda0322b      0xf3d18e6cc71c58cd
0x5585d30d7800: 0x33486d50dfcdd9b2      0x6b7afe545e83bfb1
0x5585d30d7810: 0x7858fe38b120528c      0x2d6db470eabcda20
0x5585d30d7820: 0x07136ca43f941053      0x30c16d784f47bdd8
0x5585d30d7830: 0x3edcf45d9fcd61b1      0xd3781aac20484c57
0x5585d30d7840: 0x896fa92e3e3629fe      0x48ee1b267cea8f15
0x5585d30d7850: 0xd2a268959cd21bd0      0x293f513317861a8e
0x5585d30d7860: 0xe7c132d4bb4ba850      0xbff4fc8dff41fba0
0x5585d30d7870: 0xcffad190ab7bae7e      0x92e544408994642a
0x5585d30d7880: 0xe31e2d3f842d6354      0xa49d8ac472c56034
0x5585d30d7890: 0xff091d0921ba75b1      0x7e4d97b39c0c597f
0x5585d30d78a0: 0x7a3b06ea1ff19ba6      0xed33edb7a3e2c5b6
0x5585d30d78b0: 0xcb62112af529069a      0xbde78b73ce57062d
0x5585d30d78c0: 0x519b3eae42c9009d      0xd1dfd647c10b194e
0x5585d30d78d0: 0xfc9215693fb496ef      0xf1176179a4e6494c
0x5585d30d78e0: 0x1653a66fe8f31c37      0x27a960b9657dfab0
0x5585d30d78f0: 0x5ddbecead3bd7232      0xb227353627ea0aa1
0x5585d30d7900: 0x95604e5ba0009dd7      0x02fe5d676b405ed0
0x5585d30d7910: 0xff046bb625c88e07      0xb69e9bda1f9d9ab5
0x5585d30d7920: 0x75c4b80a8dcde62f      0xa4625b22fa4761b4
0x5585d30d7930: 0xaa8aced6c840073d      0x3325599d96a09b1a
0x5585d30d7940: 0x49c48d0e485bc2ff      0xca474c926986e951
0x5585d30d7950: 0x458c0bf4f7c0a90b      0x8916794a066d643a
0x5585d30d7960: 0x62666a8d82ae75ae      0x7242b9edd38dec75
0x5585d30d7970: 0xd609b3cba39f222e      0xe0c02b600411c082
0x5585d30d7980: 0x585f158e59cdd841      0xac2fe3bec00c306b
0x5585d30d7990: 0x15e85242fe679a16      0xe370ce4123bbc592
0x5585d30d79a0: 0xac300e56467598a7      0x040460b5debaa963
0x5585d30d79b0: 0x32053236da1e20d1      0x626ab524291cdb43
0x5585d30d79c0: 0x2da3fd5ffa6e2b32      0x34bc80682695f5e5
0x5585d30d79d0: 0xd1ebc38bbe3c0b84      0x5a4a7225c139d2de
0x5585d30d79e0: 0x3ad93e2143da64d4      0x671a4f5eac099ad7
0x5585d30d79f0: 0xdcb3212691a2c579      0x1461cc3908c05d24
0x5585d30d7a00: 0x5043be5d4cda0b93      0xf2628823db455f4c
0x5585d30d7a10: 0x6c015c8c705f1f24      0x1da5e910ce778db6
0x5585d30d7a20: 0xcf9f4a0bf80629b7      0xc075304498e135a9
0x5585d30d7a30: 0xb0f80e00ac8b49b8      0xef056ef618f9f4e0
0x5585d30d7a40: 0x3d1df47feda9b972      0x4b9d4c88341076b8
0x5585d30d7a50: 0x94c72d703bcfb4de      0x4df697053249d127
0x5585d30d7a60: 0x2ac2d524f3bf266e      0x9ff286ecf2949355
0x5585d30d7a70: 0xee197c15f5afb698      0x4ee20a22f43cb932
0x5585d30d7a80: 0xe8a2db73200dcec7      0x8260d7ad8d7f1626
0x5585d30d7a90: 0x8f17ca5f24a37ad0      0x0e2ee3e1bf0587df
0x5585d30d7aa0: 0x2fcb4f93737b8d1f      0x7190225953c1eaa3
0x5585d30d7ab0: 0x32e0bba24b3715e3      0x7ec745425cd50654
0x5585d30d7ac0: 0xe1fc47ccadda4222      0x3aa1ba23f29b7d8e
0x5585d30d7ad0: 0x1a0ea6d1708c9eb5      0x0a4c446b7f706cc2
0x5585d30d7ae0: 0x071bb89e51131356      0xe91b628228e4288e
0x5585d30d7af0: 0x9f277f8d519727d8      0xe409276f9aa348ea
0x5585d30d7b00: 0x4ce2722d221ad3fe      0xf95b778e5c5c23ca
0x5585d30d7b10: 0x4931250905742e10      0x27a49d811f1b899a
0x5585d30d7b20: 0xe6afae519ccb5a64      0xa2e0ab1050444216
0x5585d30d7b30: 0x6863a1b78fc01599      0xad3dffd793d54c15
0x5585d30d7b40: 0x5db121066682e18a      0x1069181b91abf3b9
0x5585d30d7b50: 0x61a3dcc22e4d2a37      0xfcb81b41b5f2efcf
0x5585d30d7b60: 0x80302f273be67f81      0x55c5381c19aeba58
0x5585d30d7b70: 0xb88cb7caea75a1fe      0x1cadee6e9c7897b7
0x5585d30d7b80: 0xf2dc4ca879f81c59      0x487c35f7150ac23f
0x5585d30d7b90: 0xa6ad1a5d48e156ec      0x46a48c0550503946
0x5585d30d7ba0: 0xed966707f3d7efc2      0x53d821d94c1bad42
0x5585d30d7bb0: 0x9ba74855b1bec10c      0x164decf29bec101c
0x5585d30d7bc0: 0xe2010d16481e4f00      0x33c912050e5d0c5c
0x5585d30d7bd0: 0x44aaca88c429ac01      0x8071e1b326da63bc
0x5585d30d7be0: 0x39ce52e7e992fa9f      0x45083f606ecd7725
0x5585d30d7bf0: 0xee53c69427e79209      0x08dd7f65c40c8097
0x5585d30d7c00: 0x4d056fdcfeecec9a      0xd9f130ce3ab2b1d7
0x5585d30d7c10: 0x02dbc8a178fac257      0x898daa77ef1ad70f
0x5585d30d7c20: 0x8b829443e9facd99      0x01bff0aae8e6af1f
0x5585d30d7c30: 0x0863d6579ec11dec      0xfc7382fb4ef4d8c1
0x5585d30d7c40: 0x416f321ee9325ea7      0x1107e8de08394968
0x5585d30d7c50: 0xd08acf204fcf44b1      0xfd6d1ea0ef7b0c67
0x5585d30d7c60: 0x2ff6da8dbeca739e      0xd7ce10e5af500a1e
0x5585d30d7c70: 0x9e37ba3e32ea2bae      0x8ae414023570486e
0x5585d30d7c80: 0x5c5e21d3edcc21c8      0xc6f2f558f4a7a113
0x5585d30d7c90: 0xe562ca0e2468436a      0xcd8880ce78fdbc71
0x5585d30d7ca0: 0x64a9e97c79038eaf      0x8fa11acf790898b6
0x5585d30d7cb0: 0xfa9712822e1f92f5      0x0be0a47e7c33794a
0x5585d30d7cc0: 0x0f513f6dfa219683      0x7882a2fd7ad96f95
0x5585d30d7cd0: 0x724103437a884352      0x38856f600ee9c153
0x5585d30d7ce0: 0x34844c1c042e4031      0xa25072078f86d4b0
0x5585d30d7cf0: 0x198ebf757f3ce869      0xc19a41f94296d3f4
0x5585d30d7d00: 0x15253a9cd3916853      0x4e63ded01c521c71
0x5585d30d7d10: 0xdd7320b7e2575f4c      0x27a5680626ba3a3b
0x5585d30d7d20: 0x22126f89ee83b6aa      0x93ba54007bb31b86
0x5585d30d7d30: 0x9223523b754a6398      0x41e09449d7b89bf9
0x5585d30d7d40: 0xc88439c35bf3c9c0      0x3f2c59b8c9819aa8
0x5585d30d7d50: 0x131cbfa7b1a189cd      0xb65edcd66c1bc99f
0x5585d30d7d60: 0xf47c981edad2f0cb      0xdf8d4d2c96ddbeaa
0x5585d30d7d70: 0x18574111ff0734ba      0xd0e93b5438cd4afc
0x5585d30d7d80: 0x10d43fd61bdb8f22      0x738cf2854d70f45d
0x5585d30d7d90: 0x0c674b0d4e824ddf      0x7038a38b2d798915
0x5585d30d7da0: 0x32b6526eccbfdc96      0x180c079be4ac34e5
0x5585d30d7db0: 0xc176bb77b22141d0      0xff21c2ae147d4f6a
0x5585d30d7dc0: 0x8b40d6bdc6539848      0x697c85f228d8efe8
0x5585d30d7dd0: 0x33b66e95c3ed31cf      0x1efd0b3d9134086b
0x5585d30d7de0: 0x57f12eab85d92859      0xd3245da1f30da714
0x5585d30d7df0: 0x9240e371486eba6a      0x01f700f3d54de9ef
0x5585d30d7e00: 0x8a808614211c71a2      0x58c4d221bea647f7
0x5585d30d7e10: 0xe3fa18751da412b9      0xd2c8a94ac4fbf865
0x5585d30d7e20: 0x5391d799d97952c7      0x99401c7c531de610
0x5585d30d7e30: 0xe21205f95344dc74      0x9f5cd417a6c932d5
0x5585d30d7e40: 0x454af2c839aba3ec      0xdb874569a41f63c8
0x5585d30d7e50: 0xb132e85219026d4c      0x914987fd87bfa10f
0x5585d30d7e60: 0xd85443ea0d384fd5      0xaee9f5bc343a2cb0
0x5585d30d7e70: 0xdfdcafdfb073856d      0x87a720c53d6cb449
0x5585d30d7e80: 0xf1fcbb192e47a7e9      0x6acc3444a6899a26
0x5585d30d7e90: 0xe5422a71e506487f      0x12f67f68a9287f7c
0x5585d30d7ea0: 0x69591c316466a675      0xb3dda204b95e95c5
0x5585d30d7eb0: 0xe0ea8a3644e502dc      0xb45fc87d020ca2df
0x5585d30d7ec0: 0x68d94bfb134e512f      0xef0ceeded204d647
0x5585d30d7ed0: 0x255880926e620233      0x81150acc3645cbbb
0x5585d30d7ee0: 0x1420578d995054c2      0x8d5c569f6912a050
0x5585d30d7ef0: 0x2aa8099da719ab76      0x187ee6a936e5b8a1
0x5585d30d7f00: 0xfef5bd49ff67bbe5      0x35be16580484e123
0x5585d30d7f10: 0x88e167bf8d8954e1      0x1f281cf3bb1b8f94
0x5585d30d7f20: 0x9cfeadc52bf7683d      0xe697c68b320b00f3
0x5585d30d7f30: 0xb49a9ee1014c880a      0x1d27e9b9e0cb95e0
0x5585d30d7f40: 0xb0c0ebe0643d666c      0xd043ab92caec666f
0x5585d30d7f50: 0xe78d9bb3e21509e2      0xaef674dab867dc5c
0x5585d30d7f60: 0x717239a68a8d6eca      0x84963a2cb56fb0b5
0x5585d30d7f70: 0xfec088b27b2983b4      0x66a1bc84321cf390
0x5585d30d7f80: 0x190e3d7ae3b183c9      0xcfba36ba02d139ae
0x5585d30d7f90: 0x21febf6acd388fb0      0x1050297a4c25e62f
0x5585d30d7fa0: 0xd87277a697909755      0x7dd5d0f353aaa9cd
0x5585d30d7fb0: 0x9f065a210b6dabb4      0x254519dc30782065
0x5585d30d7fc0: 0x5839d3e7fa3a5fa8      0xd0e5d4c427a5eb85
0x5585d30d7fd0: 0x7fc41886d9d97cd1      0x15abc186126a4dd8
0x5585d30d7fe0: 0xafe07fee732e1e78      0x11c1dcea5dd1ee48
0x5585d30d7ff0: 0xe6355800792cb2f7      0xd03e3f0c768b8981
0x5585d30d8000: 0x3dd3c7fafef577b0      0x8c6947a4f38ae315
0x5585d30d8010: 0xcda3d603ea9a2c55      0x9687e306e7c6f9cc
0x5585d30d8020: 0x311553926e580edf      0x7dadc6d4824b4109
0x5585d30d8030: 0xdf054e8c36ae5b4b      0xb59b19c580aed11d
0x5585d30d8040: 0x56176eb9b970b869      0x5b1187e521eb2e25
0x5585d30d8050: 0xfda241c8854f6e20      0xfa066cbc10e11b7d
0x5585d30d8060: 0x012eb95dfd73bcc7      0xb947a7b386ca41c2
0x5585d30d8070: 0x5edb248fae9f2949      0xf8aa78edba78ff77
0x5585d30d8080: 0xe0518c83acfe6856      0x4bb4514b0fae6b15
0x5585d30d8090: 0x200b16afeb6d1f5c      0xce46b789def043fe
0x5585d30d80a0: 0x3d86fc1622c79511      0x181777325cbbb0ae
0x5585d30d80b0: 0xc9e356b2c2a11f0c      0xba2bee9c1730fa35
0x5585d30d80c0: 0x597f198044a6b75e      0x9eef2f0b6f6d3515
0x5585d30d80d0: 0x464d678f4d750d27      0x5e19e83554f64bc1
0x5585d30d80e0: 0xf6556f3383b9d0e1      0x51ee49d6fcd057ae
0x5585d30d80f0: 0x2ac4b1dd650c2f11      0xa8eb62193e42bac8
0x5585d30d8100: 0x53d1927e12bd857a      0xa1ac241ba241a4a4
0x5585d30d8110: 0xa84c4379bf4fffbb      0x1696b001698c6568
0x5585d30d8120: 0xe16f273ef8303293      0xc32c77a05b0a24a8
0x5585d30d8130: 0x1365051799df7795      0xfb7f1ed32c9be6de
0x5585d30d8140: 0x6d6bc8a0ac72376c      0x66df7e581ae69a4c
0x5585d30d8150: 0x6e54926f40ed6141      0x592fc8c6a79cc1f7
0x5585d30d8160: 0x2ee42a4c99bfd51f      0x0fc54c034d871b0f
0x5585d30d8170: 0x3eb44e7f0d2b5202      0x155271d89fd82d79
0x5585d30d8180: 0x0038a271af152d68      0xfcfa563735ef5607
0x5585d30d8190: 0xf2ec405ba8f83da5      0x2b97e1aa248dbe21
0x5585d30d81a0: 0x9485147aeafdf41b      0x60d91e17572e4295
0x5585d30d81b0: 0x2794b129fc8db57b      0x3764b5790f142ad1
0x5585d30d81c0: 0x306b2a1fea7e7b57      0xa987405704922e71
0x5585d30d81d0: 0x49ce446b421999ea      0x5d70d72a98643390
0x5585d30d81e0: 0x3bd019d7537d91f5      0x1367f5c0e6dc9d4a
0x5585d30d81f0: 0x2e28dfd4585c4902      0x0fa74e98e4206a21
0x5585d30d8200: 0x3272fed7bd9b7bd3      0xebaef603231f0392
0x5585d30d8210: 0x1a425fb26e756a46      0x9d4b9acc47583e06
0x5585d30d8220: 0x56a184287df2578e      0x3e1c84f1d56dbabe
0x5585d30d8230: 0xce2649927140b807      0xaf34cad084d30660
0x5585d30d8240: 0x628e6d1091740ffa      0x6dd1891275b8633d
0x5585d30d8250: 0x517aef2ed6660c69      0x9239b567b502176e
0x5585d30d8260: 0xf9e4d8caa6da304c      0xc6122f1d0d4b73d6
0x5585d30d8270: 0x135ef7c95d073e48      0xfd86d03390d04393
0x5585d30d8280: 0xc7d14a80390bbf90      0x37046a41a3ccf236
0x5585d30d8290: 0xea1acc1444d3ab20      0x09eabdd48cc560f7
0x5585d30d82a0: 0x31c339584dd552d0      0x26a448852aa27422
0x5585d30d82b0: 0x3921e06f4bbbdfff      0x87269050ba0bf318
0x5585d30d82c0: 0x5d883bcfb5609be6      0x89fa7a715b125a2f
0x5585d30d82d0: 0x6c9339f1f11f200a      0x8ff853a27b30dd6c
0x5585d30d82e0: 0x1f10f3941de9048c      0xb3b207cffb85cf11
0x5585d30d82f0: 0x355cc1bd7a1cbeae      0xa902d8f833e553eb
0x5585d30d8300: 0xf5a6f1efbb64fdc3      0x26224710101a4703
0x5585d30d8310: 0x4d75cef87f1e1eac      0xa28160c4573a70a8
0x5585d30d8320: 0x31f8d1dbeffb2a5d      0xba0948dd5fe23ed9
0x5585d30d8330: 0x01ba314a41456a17      0x360445e880ef4205
0x5585d30d8340: 0x71e9a9e3b56a6cae      0xd8c2818296196aa9
0x5585d30d8350: 0x887ddff3ef02a94e      0xaa8749852295054f
0x5585d30d8360: 0x0236defbca0d6894      0x3c4a3bed9f8d1103
0x5585d30d8370: 0x86674921a8790830      0x618f0bdd70cc03a3
0x5585d30d8380: 0x612f034c4c31138a      0x9282af9638e202f9
0x5585d30d8390: 0xa20d0c4da7d79415      0x1cfc9752e3c5e7f8
0x5585d30d83a0: 0xe85b9d0ee80a4e05      0x0321a818a55e2719
0x5585d30d83b0: 0x4e36100c3ea67267      0xdc446344a8cf90b9
0x5585d30d83c0: 0x356f35fb8bdb32f9      0x8be8467b2e86d3de
0x5585d30d83d0: 0xa44f7cf911c6d230      0x736b56ef1733c293
0x5585d30d83e0: 0x2ab7f483cdedfedc      0x9264e6b7ed8719c4
0x5585d30d83f0: 0x21957be6d8f57213      0x1ae91942ba5f0a71
0x5585d30d8400: 0x8f77187b468576aa      0x285b3e32e4adea36
0x5585d30d8410: 0x827b1545621d7f6a      0x415d4b5fee62d41d
0x5585d30d8420: 0xacd3244ad5548419      0x4027d8018998d9b5
0x5585d30d8430: 0xa5240eef0c0758d3      0x7c859c7fb28168f8
0x5585d30d8440: 0x175bc6c6bdb4224f      0x84f55e9dd553f892
0x5585d30d8450: 0x451fa4bf96a7b757      0x25743d9a01ff6c94
0x5585d30d8460: 0xcfec25711ee5c2af      0x2fefc4f15aeeca8f
0x5585d30d8470: 0x7ac3070f984df4d6      0xffc7290b4ef16d3f
0x5585d30d8480: 0x0d14705fc53e92fa      0x262fc09d207032be
0x5585d30d8490: 0x838b24fa43eb0a8a      0x8fb858a57b845dff
0x5585d30d84a0: 0x720e94db4606e361      0x7d0dbe1fa3aad87c
0x5585d30d84b0: 0x35bcddd042f345d7      0x38b00e3bc6d16838
0x5585d30d84c0: 0xb9ce8d61b0f09e95      0x92a0192ecbdba086
0x5585d30d84d0: 0x6dcaa93d8e96ef74      0xe1fc008afd4e05e0
0x5585d30d84e0: 0xe74558490754adf5      0xf7461d0cc8e6cb23
0x5585d30d84f0: 0xa6260216daa5e197      0x50a27c1bb2010ae9
0x5585d30d8500: 0x1995aa01dea967b5      0xea253e8a58ac4ae9
0x5585d30d8510: 0xd9d806a7ac991b41      0x8307080c77c58b90
0x5585d30d8520: 0x3f35d35bbd04e201      0x7a20d044c68fc60a
0x5585d30d8530: 0x387734835ab5bca5      0xca97d5e7076f48a1
0x5585d30d8540: 0xe6cd1027d15c75ea      0x829c05f2b83b84cc
0x5585d30d8550: 0x0820b26e4710612c      0x5455efd93a8fd26d
0x5585d30d8560: 0x260768402bf5bc90      0x60ca21b1aa01558a
0x5585d30d8570: 0xdfe623f2c3ecf467      0xc8d4bc80e216d1d2
0x5585d30d8580: 0x78120d4b7205561d      0x192e1d1b61b16c9e
0x5585d30d8590: 0x240cec29cf6ac7a2      0x1428a1d98964d270
0x5585d30d85a0: 0x00e6e895421897a1      0xa75435ba290cbfbd
0x5585d30d85b0: 0x02c531951c8f37bb      0x9d6c00d4bbfb84a2
0x5585d30d85c0: 0x80b642d63c38fd17      0x5427b91833be6985
0x5585d30d85d0: 0x2b3a8066a2de199a      0x648d453ba639a1a0
0x5585d30d85e0: 0x162799261f96c3f7      0x756dbf4356298d94
0x5585d30d85f0: 0x5e97f32b9c18711a      0x841d59c60ff1d1e7
0x5585d30d8600: 0x0501fba5ea8e50c1      0x519977055381fe8c
0x5585d30d8610: 0xe7897beb52234c68      0x330fc14f7fc48244
0x5585d30d8620: 0xc99a2cccc7609160      0x77e60130457c8c4f
0x5585d30d8630: 0x448493d9e1b83cbd      0x9fb1100e6669b180
0x5585d30d8640: 0xe85667edb3b951e0      0xc777ece82e2f4072
0x5585d30d8650: 0xc20244c3a3d20564      0x34c91ff6363bb221
0x5585d30d8660: 0x6cf63e81d3dfe080      0x73573d5d2e364d29
0x5585d30d8670: 0xd8d24bb95ae8e88e      0xb34eb0338bc768da
0x5585d30d8680: 0xd5b4d62afe3710e6      0x51de453413b6d7de
0x5585d30d8690: 0xa3c2750d12cf831f      0x0b0e73325678840e
0x5585d30d86a0: 0x5f8273cad367fd99      0x701f937a45f1ada7
0x5585d30d86b0: 0x1a91b2f8f81f6763      0xfc9c15e2c53215f5
0x5585d30d86c0: 0x787981b1d3719ead      0x7f43d514f69cfbbe
0x5585d30d86d0: 0x09667a731d0b4bbe      0x8c1de1ed9b1652ee
0x5585d30d86e0: 0x7284a7dac2a1f4cc      0x8d478255340ac16e
0x5585d30d86f0: 0x76975f954613d750      0x2b4bcfcddde7a057
0x5585d30d8700: 0x77d78d02ce684b13      0xea84baac43f68f8e
0x5585d30d8710: 0x55ff53454bde05f2      0x63505ca5d77d3381
0x5585d30d8720: 0xbac62381abde1180      0xd6f63eb1c6dc174b
0x5585d30d8730: 0x573756dd4a632ff3      0xe2d5949ee4d54fc5
0x5585d30d8740: 0x13e7097135e67f62      0x0c08fb459b93ca7b
0x5585d30d8750: 0x7fd2f47f9e7f65b1      0xa6df78c66e062926
0x5585d30d8760: 0x29cd97d668e438fd      0xfe5321daf7bd40ab
0x5585d30d8770: 0x96fad01bb60e8276      0x6a6811db19500f36
0x5585d30d8780: 0xc1f257fd73ed5a85      0x907ee524e8ac0316
0x5585d30d8790: 0x4eece4f5d0c72a0e      0x58cb3ee3c63e3871
0x5585d30d87a0: 0xf21552bfd854cc3f      0xdbf29ed73810187c
0x5585d30d87b0: 0xbcc2efc1a6ab09a2      0xb17b1e8466c80aa0
0x5585d30d87c0: 0xd389ae6ddd0478f8      0xb632d3de5b688b66
0x5585d30d87d0: 0x050d8333fd338914      0xf6efa5fcdfc5712f
0x5585d30d87e0: 0x7b3fab6793953809      0xdc9800da56566dcc
0x5585d30d87f0: 0x084cd939aa3ba2bc      0xfba0b9f2ce19c7b5
0x5585d30d8800: 0x17ba99c1365956bf      0xfd07dea8d814aa59
0x5585d30d8810: 0x23430f8843d071ee      0x1aa318e61cbb5c1b
0x5585d30d8820: 0x658e6efe969c4ea2      0x2ec719fae66abc61
0x5585d30d8830: 0x7760f8f57212cb2d      0x1dc5620b761feffc
0x5585d30d8840: 0xe8c5edc5b96f2372      0x1347e8204cad079d
0x5585d30d8850: 0x05934e0212402596      0x46d8c153ba7c8929
0x5585d30d8860: 0xe876d14e3a3d1c45      0x23204ec134817d85
0x5585d30d8870: 0x9b5cd4ed8cbce369      0x46d37d6d16e5b47a
0x5585d30d8880: 0x2df6db5d02826d54      0xa5e89b3899dd6079
0x5585d30d8890: 0x5d066a574cd5dfa3      0xc303e664810e6741
0x5585d30d88a0: 0xd3bd309be31050e1      0xb31eb4063f9506f8
0x5585d30d88b0: 0xb2b10af4d2d51b94      0xf1c0914a473e6651
0x5585d30d88c0: 0x98a1639d184ae68f      0xda3b2fde51b7efae
0x5585d30d88d0: 0x6659ac01c03b28a9      0xa0b1c7c6aa3ca86e
0x5585d30d88e0: 0xce8956bc7c1afd80      0xe8c3f3d46ce85bc1
0x5585d30d88f0: 0xe414c51fa25a0500      0xd814ef489c746141
0x5585d30d8900: 0xea1bc065db48f012      0x565e493f7cfb0cd0
0x5585d30d8910: 0x2b500677ff40f1e3      0x1f5a8b59993bffa0
0x5585d30d8920: 0x1414c95000ab5165      0x21cafcd68910f494
0x5585d30d8930: 0x7dbef994994ec65e      0xa74533c21f26dfad
0x5585d30d8940: 0xd725bd8f285ee40d      0xfb2de0c3459dc685
0x5585d30d8950: 0xc065709d7945e182      0xfc6df3c79eeda7fc
0x5585d30d8960: 0x65c49c3f76d192a1      0xde0082a4cf4d469a
0x5585d30d8970: 0xd1b095052891b014      0xcd56a6ea336a09df
0x5585d30d8980: 0x86d15839f1986686      0x3883a724e2bf5d0f
0x5585d30d8990: 0xbd3c1afd1c90dedd      0xa215e9de5aaeac8b
0x5585d30d89a0: 0xcbcf20d234544383      0xe8cb016907e5d6a7
0x5585d30d89b0: 0x3315b1ff92edb550      0x713c677493c78b5c
0x5585d30d89c0: 0xe5e934c03056f20c      0x3172afd585d11e34
0x5585d30d89d0: 0xcbd0bb03c20dc14e      0x45afc95bb08c71b7
0x5585d30d89e0: 0xf34bb47a7199d5d5      0xa293916ec49700a4
0x5585d30d89f0: 0x9429fb4e99bd13a7      0xb76f3aa00bf6e4b4
0x5585d30d8a00: 0x23396525e3b082d7      0x67edbbb1a40db447
0x5585d30d8a10: 0xaccd9242e976d8e3      0x3cdf0c04bed51a39
0x5585d30d8a20: 0x1d2610c0a6a0a2d4      0x9fda31758c9dc9b4
0x5585d30d8a30: 0xea340e37a7655d31      0x656a7c83c7ebd649
0x5585d30d8a40: 0x82b3b7dacddde2d0      0x96a1b4f8442ce3c4
0x5585d30d8a50: 0x1f906a20843829a5      0x67578cfd69585621
0x5585d30d8a60: 0x891c3b75273c4a98      0xa9323db697c23ad7
0x5585d30d8a70: 0x9fd9ec2ce6c6bfc6      0x52a9c479ca7a854b
0x5585d30d8a80: 0xc16eb39bf2989c48      0x25cd77824cae73dd
0x5585d30d8a90: 0x1a6bb0fec31549e4      0xca447bf1cd510b5a
0x5585d30d8aa0: 0xd8b1d0f94b96ab2c      0xfb314ab16660e57b
0x5585d30d8ab0: 0xbe85d66e3888ebda      0xcaf013ebc83a48b8
0x5585d30d8ac0: 0x0abb853d85895ceb      0xa1f15001c23bc975
0x5585d30d8ad0: 0xdfcaae7ae74bc3d6      0x7636fef5b286dc6d
0x5585d30d8ae0: 0x4eaa11d6f4d6139a      0x046a0fd8783f2af7
0x5585d30d8af0: 0x958754d321e886f4      0x6d1f6e40c2010f61
0x5585d30d8b00: 0xbce6b065e2c91fce      0x636f61a4a9351c70
0x5585d30d8b10: 0x6a579100b6ad30a1      0xd583314625d5da8c
0x5585d30d8b20: 0x70b6c85a6163bb15      0x95e60536c329ffb3
0x5585d30d8b30: 0x78e2bdcbe9de0726      0x6ad25a530f30bac7
0x5585d30d8b40: 0x476049e69bf0bc14      0x94fda9c755397058
0x5585d30d8b50: 0x9301bd67069ed57f      0x7d8793e5e673773e
0x5585d30d8b60: 0xc46b3c86ed447ea0      0x83124df36a9270e5
0x5585d30d8b70: 0x9c19ccda91191f55      0x851518b047e9416b
0x5585d30d8b80: 0x7a1f605e073c8393      0x370174f1787e37d5
0x5585d30d8b90: 0xc865254de84dece6      0x5bf068ac892b8e32
0x5585d30d8ba0: 0x21e17fca52d75f6d      0xd17c71e5186e8adb
0x5585d30d8bb0: 0x12cd7af1f5040d4f      0xc6be91eaa7f5632b
0x5585d30d8bc0: 0x9998e769d33dfe78      0xf0ae1b2a3acc914f
0x5585d30d8bd0: 0x1601232ff70adf46      0x86fb6a19e0e15dbc
0x5585d30d8be0: 0x32762e046dc2a310      0x331ae745a0fd007b
0x5585d30d8bf0: 0x6526a6dc7dec8195      0x1e78083eca0ae63a
0x5585d30d8c00: 0x4ccc98ed9a510709      0x98b558a5312a3c58
0x5585d30d8c10: 0x088daf7ae604dbcc      0xefaa6c07af12bded
0x5585d30d8c20: 0xfe252fa8bc9ecb1f      0x0186315562aa2e19
0x5585d30d8c30: 0x19c8e07a2884364d      0x62453c8c42c4d52d
0x5585d30d8c40: 0xe2fb955daa9a221a      0x73f2a737da8d6a99
0x5585d30d8c50: 0xeac2a6d804bff4e2      0x1c18c28de7222896
0x5585d30d8c60: 0x6630c592a86603fe      0xba3d1d8af0ece587
0x5585d30d8c70: 0x6bd17fbc0ae1f824      0xdc2fbde40a624b83
0x5585d30d8c80: 0xfd5f4695593414e5      0x606b64a765f85a22
0x5585d30d8c90: 0x2690ad2eca0b2624      0xce192a0bea9339ee
0x5585d30d8ca0: 0x0c23bf21024355e7      0x52ba43948a2a372f
0x5585d30d8cb0: 0xa7bedbe3aaaad653      0xdab21826fb7432e9
0x5585d30d8cc0: 0x2cc4668ba1925430      0x48cf4ab4e5fee99f
0x5585d30d8cd0: 0x2f08362a5c773f55      0x78d90c90747efc7c
0x5585d30d8ce0: 0x459b923b3280717d      0x01c2314e8f0d40dd
0x5585d30d8cf0: 0x0e10410f21222594      0x02888f8ae68e00de
0x5585d30d8d00: 0x1ed516f6f5810de0      0x068f033f9525f965
0x5585d30d8d10: 0x5728de185cf1d04b      0xf804706fe3f4103b
0x5585d30d8d20: 0xd424ec6ed1a109f7      0x4aca0d1f7f512160
0x5585d30d8d30: 0x61d5ef5d6b1f64c4      0x0085a13ace1fc2bb
0x5585d30d8d40: 0xa3a87dafc5412928      0x017497fcdae824a5
0x5585d30d8d50: 0xc3b85c45790b9bc2      0x3c218734816bf661
0x5585d30d8d60: 0xd332dbf949e72a65      0x4a5795cf28980015
0x5585d30d8d70: 0x3785479ba74b9ac0      0xfa160e5b7c1a7522
0x5585d30d8d80: 0xa1410a5c15dbd36a      0x2d3c1bcc9188a015
0x5585d30d8d90: 0x6539211965ae05f0      0xe9f2720912eea23a
0x5585d30d8da0: 0x85496f4e32780a7f      0xbe12ac1c6a9a90e2
0x5585d30d8db0: 0x249234e908fa97e2      0x9496e9fe82489ff5
0x5585d30d8dc0: 0x4aee66a0c4043c5c      0x68c0db55f65ef5b1
0x5585d30d8dd0: 0xb0ff60a962f706d4      0xb13ac1fa0da58ad6
0x5585d30d8de0: 0xce8c2c9061e2aeea      0xe89abfc54381cc31
0x5585d30d8df0: 0x5ac38665a55e15b0      0xbf801efff6e091a4
0x5585d30d8e00: 0x0ffbd6b15bde8a86      0xbe480bf163d87779
0x5585d30d8e10: 0x14d6d245897537db      0x106369c30e7dccff
0x5585d30d8e20: 0x157dc88c257ecae7      0xe11689ebff3f88a9
0x5585d30d8e30: 0x78d014df443cff59      0x4091601c53eac36e
0x5585d30d8e40: 0x3f6ee00e7405947f      0xd7ef30231bafcc80
0x5585d30d8e50: 0xbd4ea5e15f37fd81      0x79bfa02822b91ff0
0x5585d30d8e60: 0x1038c6c6a4e433a9      0x5e03d436e7abc903
0x5585d30d8e70: 0x0d1dcb2d5cd376f9      0x9734267c39ceea2e
0x5585d30d8e80: 0x37e4b575f8974a53      0x4c9b3a9ac674200a
0x5585d30d8e90: 0x163ab7df86e089f1      0x9c77e398342fefb4
0x5585d30d8ea0: 0x9b5b9307188859b3      0x33a65b67c94a2dc1
0x5585d30d8eb0: 0x931360fa7372c3ab      0xcc70e758fb3f7b87
0x5585d30d8ec0: 0x6772dca7aeac125f      0x11e5541a79d8b0bb
0x5585d30d8ed0: 0x77d8afea0c7e8458      0x84fd69af4811ed5c
0x5585d30d8ee0: 0x2a2fe8f82b5f6bd5      0x9454e8de85cbd71a
0x5585d30d8ef0: 0xa875a7b3da6b53dc      0xc41ca6504687cfcd
0x5585d30d8f00: 0x8e82d547e2b9eb65      0xa1f99fb86efcac85
0x5585d30d8f10: 0x2bae8499713ffe3e      0xa2a9585400415c22
0x5585d30d8f20: 0xbc81af7b4839603a      0x17967a52a06090a6
0x5585d30d8f30: 0xa45d88357a861436      0x8cb0c6ffa1fbf2a1
0x5585d30d8f40: 0x7ecbbe6037cc4b3b      0x9b98e636a1fdaa2a
0x5585d30d8f50: 0x99ca3c8d5797aae7      0xecbd639a10dce6ca
0x5585d30d8f60: 0x968d030dfa270799      0xc3e724e6ebbb3cb9
0x5585d30d8f70: 0x6ab5493cfefe375b      0xfa1812ef98f6ae90
0x5585d30d8f80: 0xfe81bca8c084bed7      0xeb4b2b75a6e55158
0x5585d30d8f90: 0xaff3e5970b50c61d      0x191e19cf92f317f3
0x5585d30d8fa0: 0xa60fc6b790031f15      0x79b2cabd7e0b5368
0x5585d30d8fb0: 0xf275888308077fa7      0x4e1a6ec5a21a3382
0x5585d30d8fc0: 0x6b679329c4e0a432      0x5a0385f0c58b18f2
0x5585d30d8fd0: 0xdd2ac1d04d58f9ce      0x526a4f358cb37d6d
0x5585d30d8fe0: 0xd479f69eb203a1ad      0xe574b3fa7a2e5d74
0x5585d30d8ff0: 0x6302c9c4400bd48d      0xa21cf1eca6409555
0x5585d30d9000: 0xbe5cb728457de30b      0x542f580ed3e4a3a4
0x5585d30d9010: 0x3d83d33378682271      0x974aa558e908908c
0x5585d30d9020: 0x0b632b86b51c1329      0x5cf9bd0d75557d1f
0x5585d30d9030: 0xff648287173081e1      0xb9365c72592d75be
0x5585d30d9040: 0x2b46f73e172cd007      0x5c8bd41a90a2fbb9
0x5585d30d9050: 0xb5790bd98c2e7026      0xd5b58f167de66b25
0x5585d30d9060: 0x42b1de885002dc6b      0x7d72b4bab4486ccc
0x5585d30d9070: 0x282b14501d09e721      0xff1361e3c5647a34
0x5585d30d9080: 0xf0d92710e1d52d28      0x9060efd32f6bdb29
0x5585d30d9090: 0x4c8f14d49af55ffb      0x0f57e6a07a2f334f
0x5585d30d90a0: 0xe1cab2db2be04035      0x56421b23f8031e28
0x5585d30d90b0: 0xac3933c6944d191c      0xea649fdd852964dd
0x5585d30d90c0: 0xbc93cd2cf702fc94      0x2902b8783d3fbe41
0x5585d30d90d0: 0x4dae72f6545ccdcb      0xd06b4c1940e59ff5
0x5585d30d90e0: 0x96192430efedddd8      0x5575b0c238a79e65
0x5585d30d90f0: 0x17caf4dc47d6871d      0x0d03ead96b948ea1
0x5585d30d9100: 0xca9e1c7e3d4cfcc6      0x995d471ee9707a5b
0x5585d30d9110: 0x348c71ad4e02a517      0x056174da5169804e
0x5585d30d9120: 0x4e80701a90ae7aed      0x7bde1518876c30b3
0x5585d30d9130: 0xcf0d2278d83a131b      0x0e8223e45fa2457c
0x5585d30d9140: 0x301bbe36f17cdffd      0xb0f6639efc606105
0x5585d30d9150: 0xcec022193e2f05d2      0x40d2f6d8cc4f17d3
0x5585d30d9160: 0x7beb17a944bde322      0xb317ab69a5f32d5d
0x5585d30d9170: 0xe098f80e478fb90d      0x8eb70b51c8ad8055
0x5585d30d9180: 0x1935bdefed4b8113      0x11ab349afb6af145
0x5585d30d9190: 0xb5ddfc6c5a9a40e2      0x095beba5318eb729
0x5585d30d91a0: 0xfbae7bfe53fdcaf7      0x12184e78c7fdf86d
0x5585d30d91b0: 0xf302f4c14434c50b      0x216068872abe4e2a
0x5585d30d91c0: 0x25052e42b77684ad      0x0f78ece68d71ed92
0x5585d30d91d0: 0xa35a56e4478b4562      0x88ae6ea73170916e
0x5585d30d91e0: 0xcc7fc6d171a3925e      0x1a10a5f76aee7330
0x5585d30d91f0: 0x63d52a619dc93661      0x616536cdda3e70a8
0x5585d30d9200: 0xc666ea73569a9296      0x4b3d585ae32f3bb2
0x5585d30d9210: 0x43c7a26a8b4d0ba4      0x772329115ecd7090
0x5585d30d9220: 0x72ef01f28e2baa51      0xe5153a778f4d2684
0x5585d30d9230: 0x7126d9a8f149a50c      0x68b5c3bbdcb93fb9
0x5585d30d9240: 0x18dec6641b91cca0      0x2e26777e5e7237c3
0x5585d30d9250: 0xf7d00e12d889d05a      0x1d89805feaeaf19a
0x5585d30d9260: 0x4576c2de4d759c8d      0x9c9967491ea3e927
0x5585d30d9270: 0x4cae8f2ed3544bb9      0x7e38f64b1dcb4f52
0x5585d30d9280: 0xfa113c8fa54b3bab      0x37f580fec20cf383
0x5585d30d9290: 0x828303a1f95c7081      0x1899e45ea93c2454
0x5585d30d92a0: 0xc59a64f49ec63e4d      0xc42c518eb96a6e27
0x5585d30d92b0: 0xcfe38aabeb1fa56f      0x6864c751b2cbeb8d
0x5585d30d92c0: 0xd30bf1361eeeb768      0x466453237f9c283e
0x5585d30d92d0: 0x6947bed1d35d350a      0x3adaff35e16be41d
0x5585d30d92e0: 0xa053c7ea7735e465      0x0104a9431eb3cacb
0x5585d30d92f0: 0x5044d0e1c9751007      0x250c0e33bbec15b5
0x5585d30d9300: 0x8dbcb982dd3e8581      0xd07a939232799b4b
0x5585d30d9310: 0x956a81786300a2b0      0xed5590ad6d70b3bc
0x5585d30d9320: 0x56574f23d65678b9      0x213fc816aa0f4098
0x5585d30d9330: 0xc892995120565f3b      0x2846350fd4c9dd6c
0x5585d30d9340: 0xff46de2d4a1d72c9      0xbb497e980130076b
0x5585d30d9350: 0xeea73c00f7ff4f8d      0x31f52c385af42310
0x5585d30d9360: 0x5e8afedf173c6cec      0xec15e7e8af5707f3
0x5585d30d9370: 0x309002f99b0e7bc5      0x0e56371c6192793f
0x5585d30d9380: 0x1825c53ffd732acb      0x5d1aa603a9cbbcd2
0x5585d30d9390: 0xa38c1d387d933031      0x407d8996eb8cc735
0x5585d30d93a0: 0x58281e16e897555b      0xf89bfdc846aa225d
0x5585d30d93b0: 0x8e13d1c0d130fd15      0x853e4267e657440a
0x5585d30d93c0: 0x13a913a3d696b763      0xe4e596833a9a8c3f
0x5585d30d93d0: 0x2f819310b06b3662      0xcda6ac6dfd3f26ac
0x5585d30d93e0: 0x38e546349c502402      0xf520fdc427a5e11e
0x5585d30d93f0: 0x9ba19c329fe912bc      0x87754974d0a0a524
0x5585d30d9400: 0xa365980392ebe482      0xf990f22d8b4edfdf
0x5585d30d9410: 0x18b179df1f3eb211      0x1e30771a69dd3426
0x5585d30d9420: 0x7d0eb362de20fc84      0x891e4637d20d5ac0
0x5585d30d9430: 0xab169a29fcea0d6e      0x493804379f92084c
0x5585d30d9440: 0x5411c28357a7e2f4      0x5c191d9986b06934
0x5585d30d9450: 0xc9bc7f53f249dff1      0xd11969dab029b42e
0x5585d30d9460: 0x5e56eaf2b2da3bb7      0x845b5aec55d1b76a
0x5585d30d9470: 0x4e5553db73f1afb5      0x2637ef02abc5c003
0x5585d30d9480: 0xe5174960cb7db311      0x9bb3ce2a421811e6
0x5585d30d9490: 0x697e44f7aa7ffb11      0xe61d8aef69186067
0x5585d30d94a0: 0x1890cca92c7c3ce9      0xee2ca1fe56cdc045
0x5585d30d94b0: 0xe6a9496ac8c11303      0x615c53055310b0cd
0x5585d30d94c0: 0xe2f3f77088f247bc      0x3d26b046463bb55c
0x5585d30d94d0: 0x45716c8097a33329      0x062f14235b6bb199
0x5585d30d94e0: 0x363befdfcc83af10      0x03806feff4dc240a
0x5585d30d94f0: 0x9504003e218a690f      0x4dcd483a5b2acee2
0x5585d30d9500: 0xed7cba4018418c9e      0x03b47e871aa6c7ae
0x5585d30d9510: 0x49b5f6023bcdb0f4      0x781adcf8de6cd76a
0x5585d30d9520: 0x92f6fc5fd91be3d3      0x731af624d02bcaf8
0x5585d30d9530: 0x734496129e9ecb87      0x5f47d10c70199b39
0x5585d30d9540: 0xf5dfc3d009ded4dd      0xb481e2b329135fe3
0x5585d30d9550: 0x3d3bc3cb27f7cbfd      0x26a003600526b632
0x5585d30d9560: 0xd200917a6f4315d4      0x3ca82f93e9947d61
0x5585d30d9570: 0xba46c0f5d4d8c368      0x2c2f8ef7d82c1e50
0x5585d30d9580: 0x197220aa1c8df910      0x776bf511cd38bbe8
0x5585d30d9590: 0x9b76a8e8c5b2b984      0xf01fc03ab848669d
0x5585d30d95a0: 0x5496fe005fa84cd6      0x70e235a8eec66a11
0x5585d30d95b0: 0xfc472238ead88695      0x4219101665ce9218
0x5585d30d95c0: 0xc3fcbdb996e373f1      0xcee102595cd0d66f
0x5585d30d95d0: 0x745acf4efbb42c10      0x389f3cd2bf4e24dc
0x5585d30d95e0: 0x315d3dcbc65f5d78      0xa98cb50185094ef3
0x5585d30d95f0: 0x6c9f012c7722bf23      0x3aa77888d30efac4
0x5585d30d9600: 0x0a2d04ef8f87fe6d      0xb2ea2d4953b01f77
0x5585d30d9610: 0xadd1d4cc6bb6de73      0xe71f59ce82751f6a
0x5585d30d9620: 0xf4bb1c4ba8c8a142      0xb3ece1e4c7147438
0x5585d30d9630: 0x9851e6dbb34b98bc      0xe319e361526ed218
0x5585d30d9640: 0x047ff1bf270e5286      0x3a8d2da4d813ff76
0x5585d30d9650: 0x55cce854cdcc13c1      0x70a0649830c4a287
0x5585d30d9660: 0x3f4d9195dec0dcfa      0x9a3ab00a80be8f2a
0x5585d30d9670: 0xfb94e629b7de5ec6      0x287c22d5e1c92530
0x5585d30d9680: 0x62206f7b536f50d7      0x7ef9f3f1ce717552
0x5585d30d9690: 0xebc3c953dc061d75      0x03852969adf5ba64
0x5585d30d96a0: 0xe7045f07144481b9      0x92168f186f6e65e2
0x5585d30d96b0: 0x3553a2c6f22ca596      0x76a839fc5b220686
0x5585d30d96c0: 0xd651f9e1dd1e5ac4      0x1ebfedfea30afa52
0x5585d30d96d0: 0xabea6c1b0ffa5719      0xb9358b58402932af
0x5585d30d96e0: 0x2dda014c97b0677f      0x6c04c8b28c0d839a
0x5585d30d96f0: 0xd81580a4dc09fb8c      0x6923035e9f7d61d2
0x5585d30d9700: 0xd7473f7e62112e84      0xd3fa38316a094d1a
0x5585d30d9710: 0x0c2bf97aec2ab89b      0x8a768a57e95d4fc1
0x5585d30d9720: 0x42d30ca8d2dec164      0xe8f5d46b9c95b726
0x5585d30d9730: 0xddecaa3a43e26a17      0x0e70b33e84913854
0x5585d30d9740: 0x1e465495044f1a45      0x2746d8b83282b89b
0x5585d30d9750: 0xe0ae24877470e0fd      0x153dfb54d0e755d4
0x5585d30d9760: 0x9da317b0c7452871      0x4a4bdef07dcd8c3c
0x5585d30d9770: 0x852375df5072c7f7      0x2119d27a4fb4c53f
0x5585d30d9780: 0x4486a2d62c146f50      0x82f7f796f555607b
0x5585d30d9790: 0x20b0db2616bc1990      0x48ee005b08d24914
0x5585d30d97a0: 0x44e3a16c3f3d8bef      0x86323dc6abe9ceb5
0x5585d30d97b0: 0xcbaaaf19f7f69fe0      0xd3aaae1a63d7b57f
0x5585d30d97c0: 0x125b6f5433a94d22      0x7a0e2bda5ce938bf
0x5585d30d97d0: 0xeb1a15755e8c748a      0x764faef64e329462
0x5585d30d97e0: 0xa020759141b87564      0x82278eb2f6cf62ad
0x5585d30d97f0: 0xa7b5b7f01c94488c      0x4249c309a5fef727
0x5585d30d9800: 0x2a35db349688b2d1      0x250f1c0a81ad47f4
0x5585d30d9810: 0xbc040fcf95372d8b      0x611e611f04b4fe78
0x5585d30d9820: 0xb810e819517bbcbb      0x742470d22c7d9bce
0x5585d30d9830: 0x8ba9a2660f080967      0x9299710bc2182764
0x5585d30d9840: 0xa55f19dff748b2d9      0xa7d0269cf131b5b0
0x5585d30d9850: 0xe16bce5c9b7f646f      0xe1eb349baea50843
0x5585d30d9860: 0x6d3b676f30c8071c      0x7673320ec6d4b0a0
0x5585d30d9870: 0x1b6efe2455bc28e0      0xedf8e2033be09ee9
0x5585d30d9880: 0x9266fb917b668e36      0xf6c244f9cc752ab8
0x5585d30d9890: 0x4579d8546bbb93e7      0xcc253e5e19c05b8a
0x5585d30d98a0: 0xcb6158471867109d      0xf07b4a56089d4b01
0x5585d30d98b0: 0x4d623c2ad0d7facf      0xc4795ea2ecf3a669
0x5585d30d98c0: 0xf3626d6f10ca8520      0x85bf809d8f730fa4
0x5585d30d98d0: 0xb231b711d2a19f40      0x4403e1d78a78cee8
0x5585d30d98e0: 0x73bfab424225c8e1      0xb96afc987ecf815e
0x5585d30d98f0: 0xf764b2debeee33b3      0x43f225c4e75e0412
0x5585d30d9900: 0x95a638a8e8fbedbb      0xdb59745003b819a6
0x5585d30d9910: 0xbf8497d2f888f9e8      0xe70069a64e559fe6
0x5585d30d9920: 0x3221166c14c21a22      0x2782d8c284a29d67
0x5585d30d9930: 0xfe7b7c6661b6a31a      0xd1097828de61ac75
0x5585d30d9940: 0x763df727ce75b8cb      0xca2188e9d4ab4354
0x5585d30d9950: 0x12e063a58fb61d38      0x1a91ba728ca04b1e
0x5585d30d9960: 0x968e47063f310228      0xe575a6de79434f48
0x5585d30d9970: 0x115563c832185d3b      0x46066f9b155108cd
0x5585d30d9980: 0x235f5e853d570e03      0x5c41169a7cd0925c
0x5585d30d9990: 0x1cd8f1bbe70e074d      0x9c3a801500441cfb
0x5585d30d99a0: 0x0fa84fb0bf3afd1f      0x232869fc8d3984e3
0x5585d30d99b0: 0xbb314d84718ec6b4      0x4b637693c53b6f31
0x5585d30d99c0: 0xae4a4d59b0fc2ac9      0xb2d7ac332678b999
0x5585d30d99d0: 0x5f8fbd3c906894f2      0x3ab59fa7406192ec
0x5585d30d99e0: 0x4e5c363c6ecf3795      0x053655678acc3e6c
0x5585d30d99f0: 0xc6efcd657c5cf837      0x1e57b67f4040ad80
0x5585d30d9a00: 0x8d979d46c857f5ca      0x59ec3f7cdda84281
0x5585d30d9a10: 0x828c668d5a75daf6      0x4d6fe93e36d70ada
0x5585d30d9a20: 0x08ed879bffe6c195      0x8d85ca87be939c04
0x5585d30d9a30: 0x1ed483471b093d23      0x6e3a8ea99421a82e
0x5585d30d9a40: 0x7a55a74700ffcb9c      0x4969441a0a054bc4
0x5585d30d9a50: 0xf3b8cd452d4993b3      0x39e63588bb7030d6
0x5585d30d9a60: 0x8a40b7608004485f      0xc690500fd88227d2
0x5585d30d9a70: 0x213d4ee26bacaef6      0x6ceb15a58e8199ca
0x5585d30d9a80: 0xc2d731c1545617ff      0x9c36d248dbcf7413
0x5585d30d9a90: 0x0a3922fc8b1f19aa      0x049b3bdb840c13e3
0x5585d30d9aa0: 0xc1c77f326c95ad4c      0xef0df4de1a3334cc
0x5585d30d9ab0: 0xf01f1fcab2aef3ee      0xa3b8bfc2d2323b10
0x5585d30d9ac0: 0x2ba2b8e57a157339      0x0db8d4e3b53f547e
0x5585d30d9ad0: 0xe180c10eb0d5707a      0xb7a939e060f9233d
0x5585d30d9ae0: 0x8595f3bdcaf65da4      0x562bf4f2f28665c4
0x5585d30d9af0: 0x1723b29955104835      0xbbc6248afad14f41
0x5585d30d9b00: 0x58f43d98be1477ab      0x28e051c8b6c8c15f
0x5585d30d9b10: 0x01c7af69a5e8fd49      0xc3dff1152ea3155e
0x5585d30d9b20: 0xc628bc72a298c34b      0x030442fa026ad428
0x5585d30d9b30: 0x50299486ce1b24b0      0x42ae6bbb708efc7a
0x5585d30d9b40: 0x8efb0b5635cfd9e4      0xf07d506dc9cb085f
0x5585d30d9b50: 0x858939f3fab9635e      0x52d4152a6fead8ed
0x5585d30d9b60: 0xd6dda4727cc18dd5      0xd703b90205aad540
0x5585d30d9b70: 0xa8f531f4beeaacd5      0x52b6a9ea3ba96399
0x5585d30d9b80: 0x522695143740b9c3      0x81487f8518c39f82
0x5585d30d9b90: 0xa7f1bebbd11d2990      0xd6d8070b95b1a491
0x5585d30d9ba0: 0x30aaf5021d9da3c6      0xc2bd6123ce80568b
0x5585d30d9bb0: 0xd686d08de685b551      0xcb5568746c1bdd17
0x5585d30d9bc0: 0xf2493c7bfe359420      0xde466714e9af387e
0x5585d30d9bd0: 0xe189940b202a21d9      0x3db53d91141902b0
0x5585d30d9be0: 0xaa91809521b7d87c      0xca1a1d09dbc5260d
0x5585d30d9bf0: 0x3323faab8a69a422      0xb44641b410e19c6e

I tried using both the keys as-is in order to decrypt data.enc file by formatting the hex into base64 and then adding the appropriate header and trailer in a .pem file but it didn’t work. So, we need to understand what the ‘shielding’ means. For this, I found these resources:

  • https://security.humanativaspa.it/openssh-ssh-agent-shielded-private-key-extraction-x86_64-linux/

So, shielding means that the private key is stored encrypted even in memory. However, the key used to encrypt it is also stored in memory so that we can get the key and decrypt it ourselves. This key is the ‘prekey’.

I tried using the sshkey_unshield_private() function and the sshkey_save_private() in my own way to try and decrypt it; I also tried using the script and some other stuff but none of that worked. I tried placing the blobs into the memory of a debug session of ssh-agent (script is in python file) and then calling the functions sshkey_unshield_private and sshkey_save_private_blob. Some resources about using python scripts for gdb:

  • https://stackoverflow.com/questions/4060565/how-to-script-gdb-with-python-example-add-breakpoints-run-what-breakpoint-d
  • https://sourceware.org/gdb/current/onlinedocs/gdb/Basic-Python.html#Basic-Python

Decrypting the shielded private key

I have to then understand how the prekey is used, which encryption was used, and how the shielded private key is decrypted in the source code.

I also asked in ‘Get Help’ and got the advice that I should try reimplementing the algo myself and that it should be simple.

In order to understand how the shielded private key is decrypted using the prekey, let’s look at the source code for the sshkey_unshield_private(struct sshkey *k) function in sshkey.c.

Some important variables/definitions:

  • u_char *cp, keyiv[SSH_DIGEST_MAX_LENGTH];
  • #define SSH_DIGEST_SHA512 4
  • #define SSHKEY_SHIELD_PREKEY_HASH SSH_DIGEST_SHA512
  • ssh_digest_bytes(SSHKEY_SHIELD_PREKEY_HASH) == 64 bytes
  • #define SSH_DIGEST_MAX_LENGTH 64
  • #define SSHKEY_SHIELD_CIPHER "aes256-ctr" /* XXX want AES-EME* */

Inside the sshkey_unshield_private(struct sshkey *k) function, it does some sanity checks and then it calculates the ephemeral key. As part of this, it first calls this function to get the digest:

	/* Calculate the ephemeral key from the prekey */
	if ((r = ssh_digest_memory(SSHKEY_SHIELD_PREKEY_HASH,
	    k->shield_prekey, k->shield_prekey_len,
	    keyiv, SSH_DIGEST_MAX_LENGTH)) != 0)

The result is stored into the keyiv variable. The function header with the parameters looks like this (defined in digest-openssl.c):

int 
ssh_digest_memory(int alg, const void *m, size_t mlen, u_char *d, size_t dlen)`

and within it, it initialises the digest:

const struct ssh_digest *digest = ssh_digest_by_alg(alg);

The argument that was given for the algorithm was SSHKEY_SHIELD_PREKEY_HASH which was defined as SSH_DIGEST_SHA512. In this same file, it also has a struct for the different algorithms:

/* NB. Indexed directly by algorithm number */
const struct ssh_digest digests[] = {
	{ SSH_DIGEST_MD5,	"MD5",		16,	EVP_md5 },
	{ SSH_DIGEST_SHA1,	"SHA1",		20,	EVP_sha1 },
	{ SSH_DIGEST_SHA256,	"SHA256",	32,	EVP_sha256 },
	{ SSH_DIGEST_SHA384,	"SHA384",	48,	EVP_sha384 },
	{ SSH_DIGEST_SHA512,	"SHA512",	64,	EVP_sha512 },
	{ -1,			NULL,		0,	NULL },
};

So, the algorithm which gets used is SHA-512.

Now, the function ssh_digest_memory stores the resulting digest into the d param, (the argument was keyiv). It calls EVP_Digest for it.

if (!EVP_Digest(m, mlen, d, &mdlen, digest->mdfunc(), NULL))
		return SSH_ERR_LIBCRYPTO_ERROR;

Back in the sshkey_unshield_private function, after calculating the digest, it initialises the cipher:

	if ((r = cipher_init(&cctx, cipher, keyiv, cipher_keylen(cipher),
	    keyiv + cipher_keylen(cipher), cipher_ivlen(cipher), 0)) != 0)

The function is declared like this in cipher.c:

int
cipher_init(struct sshcipher_ctx **ccp, const struct sshcipher *cipher,
    const u_char *key, u_int keylen, const u_char *iv, u_int ivlen,
    int do_encrypt)

So, here we see that the parameters are separate for the key and the iv. However, the arguments given are both using keyiv. The param and argument correspond like this:

  • param key: argument keyiv
  • param keylen: argument cipher_keylen(cipher)
  • param iv: argument keyiv + cipher_keylen(cipher)
  • param ivlen: argument cipher_ivlen(cipher)

The cipher_keylen(cipher) and cipher_ivlen(cipher) values I found by breaking at the function and then looking at the arguments. The keylen is 32 and the ivlen is 16. SHA-512 has a digest size of 64 bytes. So, the first 32 bytes of the SHA-512 digest of the prekey are the key and the next 16 bytes are the IV, the remaining 16 bytes are not used.

pwndbg> i args
	ccp = 0x7fffffffd120
	cipher = 0x5555555d5170 <ciphers+240>
	key = 0x7fffffffd1e0 "\326\"{BCs\357\n\211\332\002\257̽\266}\253\004\346\310\344\250\376\232\307\v9\314U\326\030`A}!\360j\266g\274\064\251\217/Ъ\243\353(f>\214m\037\364\307\003p\315}IƎ\233"
	keylen = 32
	iv = 0x7fffffffd200 "A}!\360j\266g\274\064\251\217/Ъ\243\353(f>\214m\037\364\307\003p\315}IƎ\233"
	ivlen = 16
	do_encrypt = 0

We now have the key and iv for the cipher, but we need the encryption scheme. Earlier in the sshkey_unshield_private function, around where it does the sanity checks, it also executes the segment below. The cipher_by_name function is defined in cipher.c and it returns the sshcipher * for the cipher specified as a string. Here, the argument given is SSHKEY_SHIELD_CIPHER which is a macro defined for aes256-ctr. So, the scheme is AES-256 using CTR mode.

	if ((cipher = cipher_by_name(SSHKEY_SHIELD_CIPHER)) == NULL) {
		r = SSH_ERR_INVALID_ARGUMENT;
		goto out;
	}
#define SSHKEY_SHIELD_CIPHER		"aes256-ctr" /* XXX want AES-EME* */

Now, we can have everything we need to try and decrypt the shielded private key. Let’s try to decrypt it using AES-256 in CTR mode with the key and IV derived from the first 32 and 16 bytes of the SHA-512 digest of the shield prekey.

I wrote a script for this which is in x.py. The snippet which does this is this:

ctr = Counter.new(ivlen *8, initial_value=int(iv.hex(),16))
cipher = AES.new(key=key, mode=AES.MODE_CTR, counter=ctr)

out_bytes = cipher.decrypt(shielded_private_bytes)

I outputted the decrypted private key as bytes, base64 and as a string.

I then tried to output this decrypted private key into base64 format and add the header and trailer to form a .pem file and then use it to decrypt the data.enc file but it didn’t work. There is still more to do…

When using this didn’t work, I was a bt confused about why.

Parsing the decrypted private key blob

After a while, I realised that the decrypted private key bytes had the characters 'ssh-rsa' near the beginning of it. That gave me an indication that these bytes are some kind of a struct which needs to be formatted properly. What we have is a decrypted blob of the private key, not the properly formatted private key. The bytes output looks like this:

>>> out_bytes
b'\x00\x00\x00\x07ssh-rsa\x00\x00\x01\x81\x00\xd4~\xff\x9aW\xecN\x00\xe8"~\xc3\x8d\x0b>N\x97\x8a\xb7\x82\xb1\x11z\xd3\xf4f\xc6\x82\x10\xc8\xd9hd\xe0]{\x805\xd2\xb7oj\xff\xba\x15T\x83\xd3\xf5\xfcm\xf7\xc5}\x16\xc5=>\xbf\xde(qD\xd7\x8a\x98=`y\n\xad\xe5\xa3\xa3?\xd8\xd6\xd1\xfc\x88j\xb9\xd9\xaa\xcf&\xa4\x93\xb6\x84\xd8\xf2\xa7\x9e\x9e\x04\x02\xea\x96\t~\x8ey\xde2?\xbb\x8d{4\xb4iF\xabJ\xe5!\x98\x94bP\xb4\xa0\x928\x8e\xa3@\xba-\x81$\xd0Q\x12\rW\xa8\r\xa1\x9a\x9d>S\xcd\xf1\x14\xd6\xc5\xb51\x1b\xdc\xab\xb0\xa7\xb6\x10\x84\x7f\xdb\xf6\xe9\xa7\xe1\xd8\xd2\xf9=`\xad$\xa3\xb3\xd2\x1b<\x05\xb5\xad\x8a\x8e\x96\xc7\xcf\xab\x97\xbdA\x8e\x89\x88\x00\x9cd\xf4\x18I\xd5\x18\xdbi\xa9\xac"\xfe\x96\xd9\xe5\xe8uI\xce\xbf}\x86\xf0F\xa5*\x87\x8d\x87\x91|\xc5\xbe.\x8e\xe3(\t?\x80\xeae\xf6eX\xa7[y\x1a\\\xd3\xcc\xb8\xf3\x94LM\xcb\xb9\xb8M\xd1\xe6\x9c\xe7\x0eYs\xc8\nK\xbeWYaR\xfcP\xc3\xe6L\xa0m\xd8/\xd1\xf0\xdd6!\x92\xf3\x8d\x0b\xc6c\xa8\xc952\x98,\xfc2\x8b2^\xb6\xd3\x07X\xb2\xf2\xde\xd9$n\xd9~\x82\x98\x14\x04\x86\xb5\xe3\x07\x8c\xdc\xc0\xd7\x97\xf6\xc7\x9a\x83WI\xef\xf7\xca\xc1\xff\xdb!u\xcc U\xe5\xe3\xa0\x9f\xdb\x1b\xc7\xcd6\xa5pk\x8e\x07^\x10 \xcb,\x03\xe5vt</\x1c\x0et\xa1\xd8\x9d!X<\xd3\xd3\xc3\xcb{\xf9\xe9\x00\x00\x00\x03\x01\x00\x01\x00\x00\x01\x81\x00\x81\xb2\xd6N\x1dv5\x12&\x9d\xcfc\x8a6\x1f\x9c\x96\xb0k[\xd0\xb9\xcb\x8f\x8d0!\xdf\x87a \x19\xb0\xe0\xa5\x0eYn\x00\xa4G\xd46,\x1d\x12\xcd\xb7\xd4\xffs\x1bu%\xe9}\x0f\xe9\xb9\xf0^\x1c\xec\x98\xe6\x96\x0fxO\xc8\xed\xe5) \xde:z\xbc\x06x94 \xa09\xf9\xeb\x1f\xe1\x9ajT\x89l\xae#\xe2\xa7\xceV\x131\xe1>v\xcb!\xad\xb4R\xb1\xffC\xcc\x0fU\x95P\xec\xd8\xa9K\xe6i\xf9-N\x85\x96]i\xe2\xcfg|.:\x9foZ\x80\xe5\x93\x02Q\xc3\xe1%I\xddS\x11\x1fz\x87\xc3\x85\xc3\xc5+\xc9U\x86\xbe\x1a\x82^\x1b\x14\x94jy\xdf\x95E\x1b\xacb\x0b\xc6\xd5\xb8<]\xce\xea|\x1e^\xe2"\x1c\x8c\x8b\xbc*:mM]\x15q\x91q|~\xf8\xfa\x9cpJ\xa0\xb5\xc9\x94m\x17V\x15c\xc0\x1d\xf0XS8\x12\xc1\xd5\xb738\xd9\xad\xc9\x92\xee\xe8\xc6}\x909(\xca\x88S\xbd"\xa4\x05\x95\xade\xed\xaf\xc5\xea\x83\x03v$\x19\xdd|\xf9;\xaa$\xc2\xe4\xf3C)\xf6\x18\xac3+\xe6\x07\x8e%T\x01 \xed\xce\xf7\xda\xab[#\xd1.\x01\xe1[tv\x92\xe5\x9c\xef\x80\t\x94\x85xp@F7\x1d\xf3\xad\x93\xb1\x94=\x89\xeb\xcavY\x12\x85\x1b\xb6\x89Q\xff.\xcf\xda\x8a*\x04b\xa1Y\x04\xfbM\xde\x99\xc22s\x9a\xc9\t\xb1\x02\x1a\xd1\x1d8F\xfdV\xee\xa1\x9a(\x90\xcb}\x175\xc0\x9b\xdei\xdd\x9a\'(\x8b\xba8\xed\xa9\x95\x81\x00\x00\x00\xc1\x00\x91\\\x91\x95`\x01{\xff\x85\x88\xfbz,eF\xe5\x15%$Jl\x18\xe0\x0e=2\xae\xd4\x15k\xc3Rsn\xbe\xf7\xc1k\x8b@}\xebM\x83\xee@\\\x05~\x87+\xddXx\xad\x14ae\x8d\xe3\x02\n\xd9\xaf)7\xd3\xcc\xa4\x148\xc5K\x10\xbf\\\xc0x\xdf\x8f\xdc\xf7\x9a\xb8\xe9\x10,M`k\xe7A\x1a\x8d\xae\xf0\x14\xaa=X\xe4\xa3{04\xbd\xa5W\\\x0b\xac\xca\xb2o\x19b\xb54\x90\'v5\xc2\xd9\xc6|\x89h\xad\x97A\xceoL\xed\x03c$\xf4Px\xbcA\xe8\x1e*[\xa2\'.W\xf7.\xf7,1>\xb2\x9c\x86\xe0\x0e\x98D\xc8\x1c\xd0\x0c\x0e]IRc\xfbT\x9d<\xcdVu\x81\xf5\xcf\x99\x0b\x81\xb5\x94st\x0e\x10\x00\x00\x00\xc1\x00\xf7\xe0z)}\x90-\xf2jbx\xf7\xb4\n\xec\x1e\xd0/\xc6\xe4\xb9\xd9\xa7\xfc"\x9e<\x87\xbf\xeeW\x1b\xcd\xc2N\xec\xcdrHbT\xb8z\xd2\xc2O=\xc5w\xf7\x17\xef\x1a\xaf\xb1\x14C\xe0\xf6\\\xc6\x13\x94:\x88\xebq\xdbW\x1fVJU\x82\x95cp\x86\xf0Ll\xd3\xf6\x855\tkG\xf3;\xe5\x96\x9fq\xd5*\xa5L4B\xaa\xb1->\x93\x11\xc3\xd1\xe0\xd0%\xbae\xfb\xa1f\xfe0\xf8Ke\xf7q\x02\x8dyI\x04kA`Z\xac\x90\'\x0c\xa1-@\xda\x12\x8d\x08\xd18\x11\x07ID\xae\x1a\xa9\xeaV\x18s\xbf\t<4\x9d\x94\xf9\n|9\xf8>C+]h"\xe3ir\x1e\x0fa9\x9b\xa1\xc8\xd8\x96\x02\x032\x93\x97\xd6Y\x00\x00\x00\xc1\x00\xdbu\xb30\x99\xeb\xfd/\xe8z\x17\xfd\x00g\x8a\x14\xdb\xf0\x18\xd6D<M\x0f\xb2\x92\x96G\xd4\x12N\x81X\xd1\\\xc6SF\x1a\x99\xc2z\xa4\xe8\x1bgn~~\x9f_2>\x02\xc0\x032p\xe6\x05\x9e\x89\xb0\x03d\xba!85d\xe6\xa4\xda\x99\xea\x85)\x92g\x0fr\xe5~\xb9f\xbe\xbfe\xa5\x1a\x15\xc5&\xda`<Z\xda\xf0\x83\xd3QP\xed)\x19Js""\x85i\x19\xb9\xd6\xe6\x11\x96\x9a\xd6\xf3YX}\xe7\'\x07\xc0E\xee\xd7IDj\xe2\xc8\xf3u3PtJ~\xf1\x86\x93\xcd"\x89m\x97\xaa\xf3\x0b\xd2j\xe4\xbb\x01L\x9aY\xc5\xb9m{\x98(J)\xf3*;09\x88\xcf\x12\xec\x94F\xf7(\xfb:cH\xd9\x1a \xee\x11\x01\x02\x03\x04\x05'

In order to see what its contents are, we need to understand how to parse it.

For this, we should look at the function ssh_rsa_deserialize_private defined in ssh-rsa.c. I found this by searching the repo for ‘deserialize` and looking at defined functions.

If we look at that function’s code, we can see that it repeatedly uses the function sshbuf_get_bignum2. It also uses the functions RSA_set0_key and RSA_set0_factors. So, let’s try to understand what they do. sshbuf_get_bignum2 is defined in sshbuf-getput-crypto.c. It then redirects by calling:

	if ((r = sshbuf_get_bignum2_bytes_direct(buf, &d, &len)) != 0)

That function is defined in sshbuf-getput-basic.c. It then calls sshbuf_peek_string_direct(buf, &d, &olen), which is defined in the same file.

int
sshbuf_peek_string_direct(const struct sshbuf *buf, const u_char **valp,
    size_t *lenp)
{

Inside this, it gets the length by doing this:

	len = PEEK_U32(p);

This is a macro in sshbuf.h:

#define PEEK_U32(p) \
	(((u_int32_t)(((const u_char *)(p))[0]) << 24) | \
	 ((u_int32_t)(((const u_char *)(p))[1]) << 16) | \
	 ((u_int32_t)(((const u_char *)(p))[2]) << 8) | \
	  (u_int32_t)(((const u_char *)(p))[3]))

What this does is it takes 32-bits (or 4 bytes) and interprets them as a little-endian integer. The first byte is shifted left by 24 bits, the next by 16 bits, the next by 8 bits and the last isn’t shifted. This is implemented in python in x.py in the function peek()

def peek(x):
    return x[0]<<24 | x[1]<<16 | x[2]<<8 | x[3]

The function sshbuf_peek_string_direct, after it reads the first 4 bytes as an integer and saves it as the length, moves the pointer valp forward by 4 bytes.

Back in sshbuf_get_bignum2, it does some stuff with bignums using the functions BN_new() and BN_bin2bn(d, len, v) (manpage). What this seems to be doing then, judging from how the length is taken using the first 4 bytes and the pointer is moved forward by 4 bytes, is that it is extracting the bignum from it of the length mentioned in the first 4 bytes.

The arguments given in the sshbuf_get_bignum2 callsrsa_n, also support this:

		if ((r = sshbuf_get_bignum2(b, &rsa_n)) != 0 ||
		    (r = sshbuf_get_bignum2(b, &rsa_e)) != 0)
	if ((r = sshbuf_get_bignum2(b, &rsa_d)) != 0 ||
	    (r = sshbuf_get_bignum2(b, &rsa_iqmp)) != 0 ||
	    (r = sshbuf_get_bignum2(b, &rsa_p)) != 0 ||
	    (r = sshbuf_get_bignum2(b, &rsa_q)) != 0)

It seems to be getting the bignums and then placing them into the rsa_n, rsa_e, rsa_d, rsa_iqmp, rsa_p andrsa_q variables. The order is important because it seems to move the data pointer after exracting each bigbum. After that, it calls the RSA_set0_key and RSA_set0_factors functions. I confirmed that it is extracting bignums (or at least something) of the length defined by the first 4 bytes by looking at the output bytes I had (out_bytes).

The first few bytes look like this:

>>> out_bytes
b'\x00\x00\x00\x07ssh-rsa\x00\x00\

The first 4 bytes are b'\x00\x00\x00\x07' and the following 7 bytes are: ssh-rsa. The following sequence of bytes follows the same pattern of 4 bytes for the length followed by the data of that length. Another confirmation is that at positions 400-407, we see this:

>>> out_bytes[400:400+4+3]
b'\x00\x00\x00\x03\x01\x00\x01'

The bignum here is of length 0x03 and the bigum is 0x010001meaning 65537 which is a common value for the exponent e in RSA.

So, we can extract the bignums after the ‘ssh-rsa’ in the following order: n, e, d, iqmp, p then q. The script x.py has the code for this.

RSA key as .pem

Now that we have the RSA parameters, we can initialise an RSA key object using PyCryptoDome in Python and make a .pem file using that. PyCryptoDome allows us to construct an RSA object using the exponents, factors, etc. See this: RSA.construct It needs the following values in this order: n, e, d, p then q. Once we have this object, we can use the method exportKey to get the .pem file contents as a string. We then just have to write this to a file.

pvtkey = RSA.construct((bignums[1], bignums[2], bignums[3], bignums[5], bignums[6]))

# Export string
pvtkey_pem = pvtkey.export_key()

with open('privatekeys/PRIVATE.pem', 'wb+') as f:
    f.write(pvtkey_pem)

!! We now have the .pem key file we need. !!

Decrypt data.enc

The challenge has given us the command to use for decrypting the data.enc file:

openssl pkeyutl -decrypt -inkey privatekey.pem -in data.enc

We just need to tweak the filepaths and filename in this.

Once we decrypt it, we get the following output:

# Netscape HTTP Cookie File
suvwwcedmdcyelgn.ransommethis.net	FALSE	/	TRUE	2145916800	tok	eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2NTM1Mzg3NTQsImV4cCI6MTY1NjEzMDc1NCwic2VjIjoiWFE4c255RXc4YXlpT1h0a0ZhcHNuQ2lrakR0bGw2MFYiLCJ1aWQiOjEwMjk0fQ.O-6pNVAqeQ7id-eZN6yH0dRay6_4QAFtMlZg2ms2-Bg 

Get the points

The token value here is eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2NTM1Mzg3NTQsImV4cCI6MTY1NjEzMDc1NCwic2VjIjoiWFE4c255RXc4YXlpT1h0a0ZhcHNuQ2lrakR0bGw2MFYiLCJ1aWQiOjEwMjk0fQ.O-6pNVAqeQ7id-eZN6yH0dRay6_4QAFtMlZg2ms2-Bg. We submit this and get the points.

Summary

On a high level (very high level), the steps to get to the solutions can be summarised like this:

  1. Find idtab
  2. Find the shielded private key and the shield prekey
  3. Decrypt the shielded private key
  4. Parse its structure to get the exponents and factors
  5. Make an RSA object in Python and export to .pem
  6. Decrypt data.enc

Answer

Great job!