通过修改GOT表,hook glibc函数

如果想修改POSIX API的行为,通常我们的第一想法是修改libc库函数,并维护一份自定义的libc。这样做的代价非常大,因为libc是基础库,接口非常多,涉及的面也很广。修改可能不难,但后期维护,merge主干的工作比较麻烦,也没有价值。修改libc函数实现,还有一个缺点是,编译时修改,而非运行时。这会给一些无法下线并重新打包的程序带来困扰,例如程序已经分发,重新打包再分发耗时耗力。如果能找到运行时修改的方法,例如,暂停服务,替换一个库文件就可以修改某些行为。如果能做到运行时修改,对于调试也是非常友好的。
幸运的是,在Linux上,修改libc的方法很多:

  1. 使用LD_PRELOAD,覆盖libc中的函数
  2. 使用alias替代weak_alias,编译替换libc函数
  3. 使用GOT表覆盖libc函数实现

1和3都是动态,运行时修改。3更棒的是,可以做运行时动态获得libc的原实现函数指针,并用自定义实例去覆写。这样在内部可以保存两份实例,而无需维护开源实例。
在整个的学习和实验中查阅了不少资料,回头看来,其中比较有价值的应当是文末的参考文献中列出的一些链接。

Android so注入(inject)和Hook技术学习(二)——Got表hook之导入表hook
我的实验代码基于这个网页中的方法二实例代码,通过解析.dynamic section来获取GOT地址,并覆盖对应表项

Executable and Linkable Format
这个帖子非常棒,详细阐述了动态链接的过程,包括link editor以及runtime dynamic link流程。只是可能时间比较久,其中的一些链接都失效了

Oracle Documentation

Executable and Linking Format Specification, Version 1.2
这两个链接都给出了一些较为官方的阐述,针对各个section,以及对应的取值等等,作为手册查询很好。

ELF概述

from Wiki
Executable and Linkable Format (ELF, formerly named Extensible Linking Format), is a common standard file format for executable files, object code, shared libraries, and core dumps.

              +-----------------+
         +----| ELF File Header |----+
         |    +-----------------+    |
         v                           v
 +-----------------+      +-----------------+
 | Program Headers |      | Section Headers |
 +-----------------+      +-----------------+
      ||                               ||
      ||                               ||
      ||                               ||
      ||   +------------------------+  ||
      +--> | Contents (Byte Stream) |<--+
           +------------------------+

ELF格式通常有linking view和execution view,即编译时,和运行时的不同。

我理解之所以要这么分成不同的view的原因是,运行时,内存比较宝贵,ELF文件被加载时,相关的节(section)被合并成segment。

segment列表[2]

section列表节选[2]

动态链接

我们知道当引用第三方库的时候,通常有两种链接方式,一种是动态链接,一种是静态链接。静态链接库在Windows上是.lib结尾的,在Linux平台上是.a结尾的。静态库不是一种可执行文件,而只是一些代码和数据打包(Archive)。当发生链接时,由链接器将其中的代码和数据分别放到最终的ELF文件的对应的节(section)。
而动态库是一种完全不一样的东西,动态库的行为更趋近于可执行文件。在Windows平台上,动态库文件以.dll结尾,在Linux平台上,动态库文件以.so结尾。
在Windows下,如果要进行动态链接,必须使用LoadLibrary函数打开一个.dll库文件,再用GetProcAddress获取具体函数的地址,进行调用。dll导出函数列表可以使用命令查看:dumpbin /exports <dll文件完整路径>
Linux下也有类似的方式,就是可以用dlopen打开一个.so文件,再用dlsym找到对应的函数。但是Linux通常使用动态链接库的方式,是直接链接。例如:
gcc -L/lib -ltest main.c -o test
这就是在lib搜索路径下,找到libtest.so,并链接。注意这里默认先尝试动态链接,如果没有.so文件,会再尝试静态链接.a文件。如果都没有,就会报错。这也就是说Linux平台上,通过-l参数指定的链接参数,是默认尝试动态链接,其次才是静态链接。
如果想指定使用静态链接,可以用下面的命令:
gcc -L/lib -static -ltest main.c -o test
或者
gcc -L/lib libtest.a main.c -o test

How is an executable binary in Linux being executed ?[2]

  1. sys_execve function (in arch/x86/kernel/process.c) handles the execvc system call from user space. It calls do_execve function.

  2. do_execve function (in fs/exec.c) opens the executable binary file and does some preparation. It calls search_binary_handler function.

  3. search_binary_handler function (in fs/exec.c) finds out the type of executable binary and calls the corresponding handler, which in our case, is load_elf_binary function.

  4. load_elf_binary (in fs/binfmt_elf.c) loads the user's executable binary file into memory. It allocates memory segments and zeros out the BSS section by calling the padzero function.
    load_elf_binary also examines whether the user's executable binary contains an INTERP segment or not.

  5. If the executable binary is dynamically linked, then the compiler will usually creates an INTERP segment (which is usually the same as .interp section in ELF's "linking view"), which contains the full pathname of an "interpreter", usually is the Glibc runtime linker ld.so.
    To see this, use command readelf -p .interp a.out

  6. Thus, if the ELF executable binary file contains an INTERP segment, load_elf_binary will call load_elf_interp function to load the image of this interpreter as well.

  7. Finally, load_elf_binary calls start_thread (in arch/x86/kernel/process_64.c) and passes control to either the interpreter or the user program.

这个1-7就是ELF文件被加载的过程,之后,再只要一个跳转语句,就可以真正的执行这个程序了。这里值得关注的就是第5步。如果被加载的二进制是动态链接生成的,即要么是动态链接库,要么是可执行文件,则加载时,内核会给ELF的内存镜像(即所谓的executing view)加一个INTERP段(segment)。而这个段就是所谓的runtime linker(compile时的linker,即ld,称为link editor),也就是ld.so。

ld.so

什么是ld.so? ld.so做了些啥?文献[2]都做了很好的说明。

ld.so is the runtime linker/loader (the compile-time linker ld is formally called "link editor") for dynamic executables. It provides the following services [2]:

  • Analyzes the user's executable binary's DYNAMIC segment and determines what dependencies are required.
  • Locates and loads these dependencies, analyzes their DYNAMIC segments to determine if more dependencies are required.
  • Performs any necessary relocations to bind these objects.
  • Calls any initialization functions (see below) provided by these dependencies.
  • Passes control to user's executable binary.

How does ld.so work ?[2]

ld.so是用来加载所有的动态库的,所以ld.so本身不是动态加载的。ld.so的入口在_dl_start。可以通过gdb停在这个函数上。

(gdb) break _dl_start
Function "_dl_start" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (_dl_start) pending.
(gdb) run
Starting program: a.out

Breakpoint 1, 0x0000003433e00fa0 in _dl_start () from /lib64/ld-linux-x86-64.so.2
(gdb) bt
#0  0x0000003433e00fa0 in _dl_start () from /lib64/ld-linux-x86-64.so.2
#1  0x0000003433e00a78 in _start () from /lib64/ld-linux-x86-64.so.2
#2  0x0000000000000001 in ?? ()
#3  0x00007fffffffe4f2 in ?? ()
#4  0x0000000000000000 in ?? ()
...
(gdb) x/10i $pc
   0x3433e00a70 <_start>:       mov    %rsp,%rdi
   0x3433e00a73 <_start+3>:     callq  0x3433e00fa0 <_dl_start>
   0x3433e00a78 <_dl_start_user>:       mov    %rax,%r12
   0x3433e00a7b <_dl_start_user+3>:     mov    0x21b30b(%rip),%eax        # 0x343401bd8c <_dl_skip_args>
...

当_dl_start执行完后,ld.so就会为我们分析依赖关系,并加载起所有必需的动态库文件。

0000003434551000      4K rw---  /lib64/libc-2.5.so     <-- .got.plt .data sections

PLT & GOT

PLT = Procedure Linkage Table
GOT = Global Offsets Table
PLT表搭配GOT表就可以完成动态库函数的重定向。
当编译时,在链接阶段,编译器会查找函数定义,如果在所有的可重定向代码中,即.o、.a文件,无法找到函数定义,则会去链接指定的动态库.so文件中找。这里有两层意思:

  1. 会优先查找有函数定义的,也就是说静态库或源文件中定义的函数是可以覆盖动态库中函数的
  2. 编译器会为动态库中函数生成跳转代码。而这个跳转代码就是PLT表

可以用objdump -M intel -dj .plt a.out命令查看PLT表具体反编译代码,例如:

  • 第一条汇编语句,就是跳转到GOT对应表项,当该表项尚未被填充时(函数第一次被调用),GOT表项会重新跳回到PLT表项的下一条汇编
  • 第二条汇编语句,将函数编号push到栈上,此时是准备一次函数调用
  • 第三条汇编语句,跳转到PLT表开始的地方。PLT第一个表项指向的是_dl_runtime_resolve函数,该函数会找到之前传入的函数编号对应的函数地址,并填充对应的GOT表项。

关于函数编号,举个例子,解释一下:

#include <stdio.h>
#include <fcntl.h>
int func(void)
{
    open("foo.txt", O_CREAT);
    fopen("foo.txt", "rw");
    printf("hello, in test.so\n");
    return 0;
}

这里引用了glibc里的3个函数,用readelf -r查看,则会得到下面的结果:

重定位节 '.rela.plt' at offset 0x508 contains 3 entries:
  偏移量          信息           类型           符号值        符号名称 + 加数
000000201018  000200000007 R_X86_64_JUMP_SLO 0000000000000000 puts@GLIBC_2.2.5 + 0
000000201020  000400000007 R_X86_64_JUMP_SLO 0000000000000000 open@GLIBC_2.2.5 + 0
000000201028  000500000007 R_X86_64_JUMP_SLO 0000000000000000 fopen@GLIBC_2.2.5 + 0

则puts对应的编号就是0,open是1,fopen是2。看看PLT表:

000000000000580 <puts@plt>:
 580:	ff 25 92 0a 20 00    	jmp    QWORD PTR [rip+0x200a92]        # 201018 <puts@GLIBC_2.2.5>
 586:	68 00 00 00 00       	push   0x0
 58b:	e9 e0 ff ff ff       	jmp    570 <.plt>

0000000000000590 <open@plt>:
 590:	ff 25 8a 0a 20 00    	jmp    QWORD PTR [rip+0x200a8a]        # 201020 <open@GLIBC_2.2.5>
 596:	68 01 00 00 00       	push   0x1
 59b:	e9 d0 ff ff ff       	jmp    570 <.plt>

00000000000005a0 <fopen@plt>:
 5a0:	ff 25 82 0a 20 00    	jmp    QWORD PTR [rip+0x200a82]        # 201028 <fopen@GLIBC_2.2.5>
 5a6:	68 02 00 00 00       	push   0x2
 5ab:	e9 c0 ff ff ff       	jmp    570 <.plt>

理解了PLT和GOT表在解析函数地址中的作用,就可以着手修改GOT表,让函数跳转到我们希望的函数执行。

替换GOT表项

正如前文所说,要做这个替换的操作,就是要找到GOT表对应的表项在哪里,然后修改对应的函数地址即可。这涉及到解析内存中的程序elf格式的镜像。

dynamic section

所有和重定向有关的信息都包含在dynamic section中,在elf的execution view中,也可以称作dynamic segment。实际上,这两者是同一个东西,只是存在的方式不同。当然,因为我们要做的是动态的GOT修改,所以我们要找到dynamic segment在内存中的位置。
由前文可知,要在execution view中查找段,应该要用到Programm Header Table(PHT)。通过objdump -x命令可以查看PHT表项。其中我们关心的就是DYNAMIC段。它包含了所有dynamic section的信息。代码里面,可以如下的获得dynamic。

// 1. 通过/proc/<pid>/maps得到elf加载的地址
    snprintf(filename, sizeof(filename), "/proc/%d/maps", pid);

    // 打开文件/proc/pid/maps,获取指定pid进程加载的内存模块信息
    fp = fopen(filename, "r");
    if(fp != NULL){
        // 每次一行,读取文件 /proc/pid/maps中内容
        while(fgets(line, sizeof(line), fp)){
            // 查找指定的so模块
            if(strstr(line, module_name)){
                // 分割字符串
                pch = strtok(line, "-");
                // 字符串转长整形
                addr = strtoul(pch, NULL, 16);
                break;
            }
        }
    }
    fclose(fp);
  
// 2. 通过遍历program header table,找到dynameic段
    unsigned long long dynamicAddr = 0;
    unsigned int dynamicSize = 0;
    int j = 0;
    for (j = 0; j < phdr_count; j++)
    {
        if (phdr_table[j].p_type == PT_DYNAMIC)
        {
            dynamicAddr = phdr_table[j].p_vaddr + (uint64_t)base_addr;
            dynamicSize = phdr_table[j].p_memsz;
            break;
        }
    }

relocation tables

通过objdump -h命令可以查看文件包含的section。和relocation相关的节有:

  • .got
  • .got.plt
  • .plt
  • rel(a).dyn
  • rel(a).plt
  • 其他rel(a).xxx节
    刚开始的时候,这些类似的节名很容易让人混淆。其实和我们目标真正相关的是rel(a).plt。其他的让我依次澄清一下。不过都是我个人的理解,可能有偏颇之处。
    先用readelf -S查看一下section header table。

PROGBITS is stored in the disk image, as opposed to allocated and initialized at load.
节区类型:PROGBITS-程序定义的信息,NOBITS-不占用文件空间(bss),REL-重定位表项

对于各节区,[2]中的解释为:

  • .plt: For dynamic binaries, this Procedure Linkage Table holds the trampoline/linkage code. See paragraphs below.
  • .got: For dynamic binaries, this Global Offset Table holds the addresses of variables which are relocated upon loading.
  • .got.plt: For dynamic binaries, this Global Offset Table holds the addresses of functions in dynamic libraries. They are used by trampoline code in .plt section.

对于.plt.got区网上搜到的解释是:

  • This just seems to contain code to jump to the first entry of the .got.

这里很容易让人有很混乱的感觉,又是.got.plt的, 又是.plt.got的。网络上也很难查到两者之间的联系和区别。根据我个人的实验经验,后文尝试解释一下。先对这几个节区做一个总结。

  • 这4个都是编译时决定的,节类型都是PROGBITS。信息都是存在可执行文件里,而runtime可用的信息都是通过重定向得到的,即通过rel(a).xxx节区获得的内存地址中存储的数据
  • 所有以.plt开头的节区,都是一些跳板代码。
  • 所有以.got开头的节区,都是一些数据,存储着这些函数被resolve后最终的地址。
  • .plt开头表项的跳板代码,就是跳转到对应的.got表项中决定最终的执行地址。
# table of a dynamic library (.so)
  [10] .plt              PROGBITS         0000000000000610  00000610
  [11] .plt.got          PROGBITS         0000000000000640  00000640
  [20] .got              PROGBITS         0000000000200fc0  00000fc0
  [21] .got.plt          PROGBITS         0000000000201000  00001000

.plt vs .plt.got

先上2个例子,分别是.plt和.plt.got节的。可以看出,这2个节都是一些跳转代码。按照前文的解释,.plt节表项就是需要动态链接的一些函数的跳板代码。跳转代码的目的地是GOT表项。然后通过runtime linker(ld.so)来完成函数地址的解析。
.plt.got的内容与.plt非常类似,也是一些跳板代码。而且jmpq指令后,没有push指令和另一条jmpq指令。这个节和.plt节到底有啥区别?啥时候会用到该节的跳转指令?

# .plt节举例
00000000000008c0 <fopen@plt>:
 8c0:	ff 25 ea 16 20 00    	jmpq   *0x2016ea(%rip)        # 201fb0 <fopen@GLIBC_2.2.5>
 8c6:	68 09 00 00 00       	pushq  $0x9
 8cb:	e9 50 ff ff ff       	jmpq   820 <.plt>


# .plt.got节举例
00000000000005d0 <fopen@plt>:
 5d0:	ff 25 12 0a 20 00    	jmpq   *0x200a12(%rip)        # 200fe8 <fopen@GLIBC_2.2.5>
 5d6:	66 90                	xchg   %ax,%ax

经过我的实验发现,当发生类似这种函数指针赋值时,动态链接函数就会出现在.plt.got节,同时.plt节中就不再包含这个函数。

FuncPuts old_puts = NULL;
old_puts = puts; // puts as a function pointer, assigned to a variable

当函数不在.plt节时,函数的跳转变成静态的了。用objdump -S对照汇编和源码,可以发现,对此类函数的调用就是跳转到对应的.plt.got表项。

puts("hello");
 751:   48 8d 3d 8c 00 00 00    lea    0x8c(%rip),%rdi        # 7e4 <_fini+0x14>
 758:   e8 e3 fe ff ff          callq  640 <puts@plt>
 
 # 对应的.plt.got表项
 0000000000000640 <puts@plt>:
 640:   ff 25 82 09 20 00       jmpq   *0x200982(%rip)        # 200fc8 <puts@GLIBC_2.2.5>
 646:   66 90                   xchg   %ax,%ax 

: xchg %ax, %ax是一条NOP指令,参看Why does Visual Studio use xchg ax,ax

当只有.plt.got包含该函数表项时,我们的GOT替换魔法就失效了。所以如果想保存原函数指针,正确的做法应当是:

// Don't do like this.
// It will kick puts from .plt and put it into .plt.got.
// We might not be able to substitute its address via rel tables.
// old_puts = puts; 

// Below is RECOMMENDED!!!
if (old_puts == NULL) { // save original libc function pointer
    old_puts = (FuncPuts)*(uint64_t *)(rel_table[i].r_offset + base_addr);
}
*(uint64_t *)(rel_table[i].r_offset + base_addr) = (uint64_t)my_puts;

.got vs .got.plt

按照前文的解释,.got节存储的是需要动态resolve的变量(应当是动态库中定义的全局变量)。而.got.plt是对应.plt节的函数地址表项。
实际的实验结果是:

  • 对于可执行文件,.got.plt不存在,而.plt表项直接跳转到.got表项执行。函数的GOT表位置(GLOBAL_OFFSET_TABLE)在0x201f50
> objdump -d --section=.plt mytest 

mytest:     文件格式 elf64-x86-64

Disassembly of section .plt:

0000000000000820 <.plt>:
 820:   ff 35 32 17 20 00       pushq  0x201732(%rip)        # 201f58 <_GLOBAL_OFFSET_TABLE_+0x8>
 826:   ff 25 34 17 20 00       jmpq   *0x201734(%rip)        # 201f60 <_GLOBAL_OFFSET_TABLE_+0x10>
 82c:   0f 1f 40 00             nopl   0x0(%rax)
 
 > objdump -d --section=.got mytest    

mytest:     文件格式 elf64-x86-64

Disassembly of section .got:

0000000000201f50 <_GLOBAL_OFFSET_TABLE_>:
  201f50:       50 1d 20 00 00 00 00 00 00 00 00 00 00 00 00 00
        ...
  • 对于一个动态链接库文件,则如前文所述一致,即.got负责跳转变量,而.got.plt负责跳转函数。函数的GOT表位置(GLOBAL_OFFSET_TABLE)在0x201000
> objdump -d --section=.plt libtest.so    

libtest.so:     文件格式 elf64-x86-64

Disassembly of section .plt:

0000000000000610 <.plt>:
 610:   ff 35 f2 09 20 00       pushq  0x2009f2(%rip)        # 201008 <_GLOBAL_OFFSET_TABLE_+0x8>
 616:   ff 25 f4 09 20 00       jmpq   *0x2009f4(%rip)        # 201010 <_GLOBAL_OFFSET_TABLE_+0x10>
 61c:   0f 1f 40 00             nopl   0x0(%rax)

> objdump -d --section=.got.plt libtest.so    

libtest.so:     文件格式 elf64-x86-64

Disassembly of section .got.plt:

0000000000201000 <_GLOBAL_OFFSET_TABLE_>:
  201000:       00 0e 20 00 00 00 00 00 00 00 00 00 00 00 00 00 
        ...

但其实,我们需要关注的是重定向的表格,而不是直接查看.got和.got.plt节区。后文会进一步解释。而在真正的GOT表项替换中,可执行文件和动态链接库并没有表现出什么不同。

Rerwrite GOT

重写GOT表项的思路就是前面讲述的PLT+GOT动态解析函数地址的方法。而覆写的方法是通过重定向表格找到GOT表,并找到对应的表项索引,修改该索引处的内存。流程大致如下:

PHN2ZyBpZD0iZGFmeGI5YWFyMGEiIHdpZHRoPSIxMDAlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXgtd2lkdGg6IDk1OS43MTg3NXB4OyIgdmlld0JveD0iMCAwIDk1OS43MTg3NSA5NTQuOTgxMjQ2OTQ4MjQyMiI+PHN0eWxlPgoKCiNkYWZ4YjlhYXIwYSAubGFiZWwgewogIGZvbnQtZmFtaWx5OiAndHJlYnVjaGV0IG1zJywgdmVyZGFuYSwgYXJpYWw7CiAgY29sb3I6ICMzMzM7IH0KCiNkYWZ4YjlhYXIwYSAubm9kZSByZWN0LAojZGFmeGI5YWFyMGEgLm5vZGUgY2lyY2xlLAojZGFmeGI5YWFyMGEgLm5vZGUgZWxsaXBzZSwKI2RhZnhiOWFhcjBhIC5ub2RlIHBvbHlnb24gewogIGZpbGw6ICNFQ0VDRkY7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMXB4OyB9CgojZGFmeGI5YWFyMGEgLm5vZGUuY2xpY2thYmxlIHsKICBjdXJzb3I6IHBvaW50ZXI7IH0KCiNkYWZ4YjlhYXIwYSAuYXJyb3doZWFkUGF0aCB7CiAgZmlsbDogIzMzMzMzMzsgfQoKI2RhZnhiOWFhcjBhIC5lZGdlUGF0aCAucGF0aCB7CiAgc3Ryb2tlOiAjMzMzMzMzOwogIHN0cm9rZS13aWR0aDogMS41cHg7IH0KCiNkYWZ4YjlhYXIwYSAuZWRnZUxhYmVsIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZThlOGU4OyB9CgojZGFmeGI5YWFyMGEgLmNsdXN0ZXIgcmVjdCB7CiAgZmlsbDogI2ZmZmZkZSAhaW1wb3J0YW50OwogIHN0cm9rZTogI2FhYWEzMyAhaW1wb3J0YW50OwogIHN0cm9rZS13aWR0aDogMXB4ICFpbXBvcnRhbnQ7IH0KCiNkYWZ4YjlhYXIwYSAuY2x1c3RlciB0ZXh0IHsKICBmaWxsOiAjMzMzOyB9CgojZGFmeGI5YWFyMGEgZGl2Lm1lcm1haWRUb29sdGlwIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1heC13aWR0aDogMjAwcHg7CiAgcGFkZGluZzogMnB4OwogIGZvbnQtZmFtaWx5OiAndHJlYnVjaGV0IG1zJywgdmVyZGFuYSwgYXJpYWw7CiAgZm9udC1zaXplOiAxMnB4OwogIGJhY2tncm91bmQ6ICNmZmZmZGU7CiAgYm9yZGVyOiAxcHggc29saWQgI2FhYWEzMzsKICBib3JkZXItcmFkaXVzOiAycHg7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgei1pbmRleDogMTAwOyB9CgojZGFmeGI5YWFyMGEgLmFjdG9yIHsKICBzdHJva2U6ICNDQ0NDRkY7CiAgZmlsbDogI0VDRUNGRjsgfQoKI2RhZnhiOWFhcjBhIHRleHQuYWN0b3IgewogIGZpbGw6IGJsYWNrOwogIHN0cm9rZTogbm9uZTsgfQoKI2RhZnhiOWFhcjBhIC5hY3Rvci1saW5lIHsKICBzdHJva2U6IGdyZXk7IH0KCiNkYWZ4YjlhYXIwYSAubWVzc2FnZUxpbmUwIHsKICBzdHJva2Utd2lkdGg6IDEuNTsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBzdHJva2U6ICMzMzM7IH0KCiNkYWZ4YjlhYXIwYSAubWVzc2FnZUxpbmUxIHsKICBzdHJva2Utd2lkdGg6IDEuNTsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBzdHJva2U6ICMzMzM7IH0KCiNkYWZ4YjlhYXIwYSAjYXJyb3doZWFkIHsKICBmaWxsOiAjMzMzOyB9CgojZGFmeGI5YWFyMGEgI2Nyb3NzaGVhZCBwYXRoIHsKICBmaWxsOiAjMzMzICFpbXBvcnRhbnQ7CiAgc3Ryb2tlOiAjMzMzICFpbXBvcnRhbnQ7IH0KCiNkYWZ4YjlhYXIwYSAubWVzc2FnZVRleHQgewogIGZpbGw6ICMzMzM7CiAgc3Ryb2tlOiBub25lOyB9CgojZGFmeGI5YWFyMGEgLmxhYmVsQm94IHsKICBzdHJva2U6ICNDQ0NDRkY7CiAgZmlsbDogI0VDRUNGRjsgfQoKI2RhZnhiOWFhcjBhIC5sYWJlbFRleHQgewogIGZpbGw6IGJsYWNrOwogIHN0cm9rZTogbm9uZTsgfQoKI2RhZnhiOWFhcjBhIC5sb29wVGV4dCB7CiAgZmlsbDogYmxhY2s7CiAgc3Ryb2tlOiBub25lOyB9CgojZGFmeGI5YWFyMGEgLmxvb3BMaW5lIHsKICBzdHJva2Utd2lkdGg6IDI7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgc3Ryb2tlOiAjQ0NDQ0ZGOyB9CgojZGFmeGI5YWFyMGEgLm5vdGUgewogIHN0cm9rZTogI2FhYWEzMzsKICBmaWxsOiAjZmZmNWFkOyB9CgojZGFmeGI5YWFyMGEgLm5vdGVUZXh0IHsKICBmaWxsOiBibGFjazsKICBzdHJva2U6IG5vbmU7CiAgZm9udC1mYW1pbHk6ICd0cmVidWNoZXQgbXMnLCB2ZXJkYW5hLCBhcmlhbDsKICBmb250LXNpemU6IDE0cHg7IH0KCiNkYWZ4YjlhYXIwYSAuYWN0aXZhdGlvbjAgewogIGZpbGw6ICNmNGY0ZjQ7CiAgc3Ryb2tlOiAjNjY2OyB9CgojZGFmeGI5YWFyMGEgLmFjdGl2YXRpb24xIHsKICBmaWxsOiAjZjRmNGY0OwogIHN0cm9rZTogIzY2NjsgfQoKI2RhZnhiOWFhcjBhIC5hY3RpdmF0aW9uMiB7CiAgZmlsbDogI2Y0ZjRmNDsKICBzdHJva2U6ICM2NjY7IH0KCgojZGFmeGI5YWFyMGEgLnNlY3Rpb24gewogIHN0cm9rZTogbm9uZTsKICBvcGFjaXR5OiAwLjI7IH0KCiNkYWZ4YjlhYXIwYSAuc2VjdGlvbjAgewogIGZpbGw6IHJnYmEoMTAyLCAxMDIsIDI1NSwgMC40OSk7IH0KCiNkYWZ4YjlhYXIwYSAuc2VjdGlvbjIgewogIGZpbGw6ICNmZmY0MDA7IH0KCiNkYWZ4YjlhYXIwYSAuc2VjdGlvbjEsCiNkYWZ4YjlhYXIwYSAuc2VjdGlvbjMgewogIGZpbGw6IHdoaXRlOwogIG9wYWNpdHk6IDAuMjsgfQoKI2RhZnhiOWFhcjBhIC5zZWN0aW9uVGl0bGUwIHsKICBmaWxsOiAjMzMzOyB9CgojZGFmeGI5YWFyMGEgLnNlY3Rpb25UaXRsZTEgewogIGZpbGw6ICMzMzM7IH0KCiNkYWZ4YjlhYXIwYSAuc2VjdGlvblRpdGxlMiB7CiAgZmlsbDogIzMzMzsgfQoKI2RhZnhiOWFhcjBhIC5zZWN0aW9uVGl0bGUzIHsKICBmaWxsOiAjMzMzOyB9CgojZGFmeGI5YWFyMGEgLnNlY3Rpb25UaXRsZSB7CiAgdGV4dC1hbmNob3I6IHN0YXJ0OwogIGZvbnQtc2l6ZTogMTFweDsKICB0ZXh0LWhlaWdodDogMTRweDsgfQoKCiNkYWZ4YjlhYXIwYSAuZ3JpZCAudGljayB7CiAgc3Ryb2tlOiBsaWdodGdyZXk7CiAgb3BhY2l0eTogMC4zOwogIHNoYXBlLXJlbmRlcmluZzogY3Jpc3BFZGdlczsgfQoKI2RhZnhiOWFhcjBhIC5ncmlkIHBhdGggewogIHN0cm9rZS13aWR0aDogMDsgfQoKCiNkYWZ4YjlhYXIwYSAudG9kYXkgewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiByZWQ7CiAgc3Ryb2tlLXdpZHRoOiAycHg7IH0KCgoKI2RhZnhiOWFhcjBhIC50YXNrIHsKICBzdHJva2Utd2lkdGg6IDI7IH0KCiNkYWZ4YjlhYXIwYSAudGFza1RleHQgewogIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgZm9udC1zaXplOiAxMXB4OyB9CgojZGFmeGI5YWFyMGEgLnRhc2tUZXh0T3V0c2lkZVJpZ2h0IHsKICBmaWxsOiBibGFjazsKICB0ZXh0LWFuY2hvcjogc3RhcnQ7CiAgZm9udC1zaXplOiAxMXB4OyB9CgojZGFmeGI5YWFyMGEgLnRhc2tUZXh0T3V0c2lkZUxlZnQgewogIGZpbGw6IGJsYWNrOwogIHRleHQtYW5jaG9yOiBlbmQ7CiAgZm9udC1zaXplOiAxMXB4OyB9CgoKI2RhZnhiOWFhcjBhIC50YXNrVGV4dDAsCiNkYWZ4YjlhYXIwYSAudGFza1RleHQxLAojZGFmeGI5YWFyMGEgLnRhc2tUZXh0MiwKI2RhZnhiOWFhcjBhIC50YXNrVGV4dDMgewogIGZpbGw6IHdoaXRlOyB9CgojZGFmeGI5YWFyMGEgLnRhc2swLAojZGFmeGI5YWFyMGEgLnRhc2sxLAojZGFmeGI5YWFyMGEgLnRhc2syLAojZGFmeGI5YWFyMGEgLnRhc2szIHsKICBmaWxsOiAjOGE5MGRkOwogIHN0cm9rZTogIzUzNGZiYzsgfQoKI2RhZnhiOWFhcjBhIC50YXNrVGV4dE91dHNpZGUwLAojZGFmeGI5YWFyMGEgLnRhc2tUZXh0T3V0c2lkZTIgewogIGZpbGw6IGJsYWNrOyB9CgojZGFmeGI5YWFyMGEgLnRhc2tUZXh0T3V0c2lkZTEsCiNkYWZ4YjlhYXIwYSAudGFza1RleHRPdXRzaWRlMyB7CiAgZmlsbDogYmxhY2s7IH0KCgojZGFmeGI5YWFyMGEgLmFjdGl2ZTAsCiNkYWZ4YjlhYXIwYSAuYWN0aXZlMSwKI2RhZnhiOWFhcjBhIC5hY3RpdmUyLAojZGFmeGI5YWFyMGEgLmFjdGl2ZTMgewogIGZpbGw6ICNiZmM3ZmY7CiAgc3Ryb2tlOiAjNTM0ZmJjOyB9CgojZGFmeGI5YWFyMGEgLmFjdGl2ZVRleHQwLAojZGFmeGI5YWFyMGEgLmFjdGl2ZVRleHQxLAojZGFmeGI5YWFyMGEgLmFjdGl2ZVRleHQyLAojZGFmeGI5YWFyMGEgLmFjdGl2ZVRleHQzIHsKICBmaWxsOiBibGFjayAhaW1wb3J0YW50OyB9CgoKI2RhZnhiOWFhcjBhIC5kb25lMCwKI2RhZnhiOWFhcjBhIC5kb25lMSwKI2RhZnhiOWFhcjBhIC5kb25lMiwKI2RhZnhiOWFhcjBhIC5kb25lMyB7CiAgc3Ryb2tlOiBncmV5OwogIGZpbGw6IGxpZ2h0Z3JleTsKICBzdHJva2Utd2lkdGg6IDI7IH0KCiNkYWZ4YjlhYXIwYSAuZG9uZVRleHQwLAojZGFmeGI5YWFyMGEgLmRvbmVUZXh0MSwKI2RhZnhiOWFhcjBhIC5kb25lVGV4dDIsCiNkYWZ4YjlhYXIwYSAuZG9uZVRleHQzIHsKICBmaWxsOiBibGFjayAhaW1wb3J0YW50OyB9CgoKI2RhZnhiOWFhcjBhIC5jcml0MCwKI2RhZnhiOWFhcjBhIC5jcml0MSwKI2RhZnhiOWFhcjBhIC5jcml0MiwKI2RhZnhiOWFhcjBhIC5jcml0MyB7CiAgc3Ryb2tlOiAjZmY4ODg4OwogIGZpbGw6IHJlZDsKICBzdHJva2Utd2lkdGg6IDI7IH0KCiNkYWZ4YjlhYXIwYSAuYWN0aXZlQ3JpdDAsCiNkYWZ4YjlhYXIwYSAuYWN0aXZlQ3JpdDEsCiNkYWZ4YjlhYXIwYSAuYWN0aXZlQ3JpdDIsCiNkYWZ4YjlhYXIwYSAuYWN0aXZlQ3JpdDMgewogIHN0cm9rZTogI2ZmODg4ODsKICBmaWxsOiAjYmZjN2ZmOwogIHN0cm9rZS13aWR0aDogMjsgfQoKI2RhZnhiOWFhcjBhIC5kb25lQ3JpdDAsCiNkYWZ4YjlhYXIwYSAuZG9uZUNyaXQxLAojZGFmeGI5YWFyMGEgLmRvbmVDcml0MiwKI2RhZnhiOWFhcjBhIC5kb25lQ3JpdDMgewogIHN0cm9rZTogI2ZmODg4ODsKICBmaWxsOiBsaWdodGdyZXk7CiAgc3Ryb2tlLXdpZHRoOiAyOwogIGN1cnNvcjogcG9pbnRlcjsKICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7IH0KCiNkYWZ4YjlhYXIwYSAuZG9uZUNyaXRUZXh0MCwKI2RhZnhiOWFhcjBhIC5kb25lQ3JpdFRleHQxLAojZGFmeGI5YWFyMGEgLmRvbmVDcml0VGV4dDIsCiNkYWZ4YjlhYXIwYSAuZG9uZUNyaXRUZXh0MyB7CiAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsgfQoKI2RhZnhiOWFhcjBhIC5hY3RpdmVDcml0VGV4dDAsCiNkYWZ4YjlhYXIwYSAuYWN0aXZlQ3JpdFRleHQxLAojZGFmeGI5YWFyMGEgLmFjdGl2ZUNyaXRUZXh0MiwKI2RhZnhiOWFhcjBhIC5hY3RpdmVDcml0VGV4dDMgewogIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7IH0KCiNkYWZ4YjlhYXIwYSAudGl0bGVUZXh0IHsKICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogIGZvbnQtc2l6ZTogMThweDsKICBmaWxsOiBibGFjazsgfQoKI2RhZnhiOWFhcjBhIGcuY2xhc3NHcm91cCB0ZXh0IHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogbm9uZTsKICBmb250LWZhbWlseTogJ3RyZWJ1Y2hldCBtcycsIHZlcmRhbmEsIGFyaWFsOwogIGZvbnQtc2l6ZTogMTBweDsgfQoKI2RhZnhiOWFhcjBhIGcuY2xhc3NHcm91cCByZWN0IHsKICBmaWxsOiAjRUNFQ0ZGOwogIHN0cm9rZTogIzkzNzBEQjsgfQoKI2RhZnhiOWFhcjBhIGcuY2xhc3NHcm91cCBsaW5lIHsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZGFmeGI5YWFyMGEgLmNsYXNzTGFiZWwgLmJveCB7CiAgc3Ryb2tlOiBub25lOwogIHN0cm9rZS13aWR0aDogMDsKICBmaWxsOiAjRUNFQ0ZGOwogIG9wYWNpdHk6IDAuNTsgfQoKI2RhZnhiOWFhcjBhIC5jbGFzc0xhYmVsIC5sYWJlbCB7CiAgZmlsbDogIzkzNzBEQjsKICBmb250LXNpemU6IDEwcHg7IH0KCiNkYWZ4YjlhYXIwYSAucmVsYXRpb24gewogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7CiAgZmlsbDogbm9uZTsgfQoKI2RhZnhiOWFhcjBhICNjb21wb3NpdGlvblN0YXJ0IHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkYWZ4YjlhYXIwYSAjY29tcG9zaXRpb25FbmQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RhZnhiOWFhcjBhICNhZ2dyZWdhdGlvblN0YXJ0IHsKICBmaWxsOiAjRUNFQ0ZGOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkYWZ4YjlhYXIwYSAjYWdncmVnYXRpb25FbmQgewogIGZpbGw6ICNFQ0VDRkY7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RhZnhiOWFhcjBhICNkZXBlbmRlbmN5U3RhcnQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RhZnhiOWFhcjBhICNkZXBlbmRlbmN5RW5kIHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkYWZ4YjlhYXIwYSAjZXh0ZW5zaW9uU3RhcnQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RhZnhiOWFhcjBhICNleHRlbnNpb25FbmQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RhZnhiOWFhcjBhIC5jb21taXQtaWQsCiNkYWZ4YjlhYXIwYSAuY29tbWl0LW1zZywKI2RhZnhiOWFhcjBhIC5icmFuY2gtbGFiZWwgewogIGZpbGw6IGxpZ2h0Z3JleTsKICBjb2xvcjogbGlnaHRncmV5OyB9CgoKCiNkYWZ4YjlhYXIwYSAubGFiZWx7CiAgY29sb3I6IzE4QjE0RTsKfQojZGFmeGI5YWFyMGEgLnRlLW1kLWNvbnRhaW5lci0tZGFyayAubm9kZSByZWN0IHsKICBmaWxsOiByZWQ7Cn0KCiNkYWZ4YjlhYXIwYSAubm9kZSByZWN0LAojZGFmeGI5YWFyMGEgLm5vZGUgY2lyY2xlLAojZGFmeGI5YWFyMGEgLm5vZGUgZWxsaXBzZSwKI2RhZnhiOWFhcjBhIC5ub2RlIHBvbHlnb24gewogIGZpbGw6ICNGOUZGRkI7OwogIHN0cm9rZTogIzJEQkQ2MDsKICBzdHJva2Utd2lkdGg6IDEuNXB4Owp9CiNkYWZ4YjlhYXIwYSAuYXJyb3doZWFkUGF0aHsKICBmaWxsOiAjMkRCRDYwOwp9CiNkYWZ4YjlhYXIwYSAuZWRnZVBhdGggLnBhdGggewogIHN0cm9rZTogIzJEQkQ2MDsKICBzdHJva2Utd2lkdGg6IDFweDsKfQojZGFmeGI5YWFyMGEgLmVkZ2VMYWJlbCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKfQojZGFmeGI5YWFyMGEgLmNsdXN0ZXIgcmVjdCB7CiAgZmlsbDogI0Y5RkZGQiAhaW1wb3J0YW50OwogIHN0cm9rZTogIzJEQkQ2MCAhaW1wb3J0YW50OwogIHN0cm9rZS13aWR0aDogMXB4ICFpbXBvcnRhbnQ7Cn0KCiNkYWZ4YjlhYXIwYSAuY2x1c3RlciB0ZXh0IHsKICBmaWxsOiAjRjlGRkZCOwp9CgojZGFmeGI5YWFyMGEgZGl2Lm1lcm1haWRUb29sdGlwIHsKICBiYWNrZ3JvdW5kOiAjRjlGRkZCOwogIGJvcmRlcjogMXB4IHNvbGlkICMyREJENjA7Cn0KCgojZGFmeGI5YWFyMGEgLmFjdG9yIHsKICBzdHJva2U6ICMyREJENjA7CiAgZmlsbDogI0Y5RkZGQjsKfQoKI2RhZnhiOWFhcjBhIHRleHQuYWN0b3IgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiBub25lOwp9CgojZGFmeGI5YWFyMGEgLmFjdG9yLWxpbmUgewogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2RhZnhiOWFhcjBhIC5tZXNzYWdlTGluZTAgewogIHN0cm9rZS13aWR0aDogMS41OwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIG1hcmtlci1lbmQ6ICd1cmwoI2Fycm93aGVhZCknOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2RhZnhiOWFhcjBhIC5tZXNzYWdlTGluZTEgewogIHN0cm9rZS13aWR0aDogMS41OwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2RhZnhiOWFhcjBhICNhcnJvd2hlYWQgewogIGZpbGw6ICMyREJENjA7Cn0KCiNkYWZ4YjlhYXIwYSAjY3Jvc3NoZWFkIHBhdGggewogIGZpbGw6ICMyREJENjAgIWltcG9ydGFudDsKICBzdHJva2U6ICMyREJENjAgIWltcG9ydGFudDsKfQoKI2RhZnhiOWFhcjBhIC5tZXNzYWdlVGV4dCB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6IG5vbmU7Cn0KCiNkYWZ4YjlhYXIwYSAubGFiZWxCb3ggewogIHN0cm9rZTogIzJEQkQ2MDsKICBmaWxsOiAjRjlGRkZCOwp9CgojZGFmeGI5YWFyMGEgLmxhYmVsVGV4dCB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkYWZ4YjlhYXIwYSAubG9vcFRleHQgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiAjMkRCRDYwOwp9CgojZGFmeGI5YWFyMGEgLmxvb3BMaW5lIHsKICBzdHJva2Utd2lkdGg6IDI7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgbWFya2VyLWVuZDogJ3VybCgjYXJyb3doZWFkKSc7CiAgc3Ryb2tlOiAjMkRCRDYwOwp9CgojZGFmeGI5YWFyMGEgLm5vdGUgewogIHN0cm9rZTogIzJEQkQ2MDsKICBmaWxsOiAjRjlGRkZCOwp9CgojZGFmeGI5YWFyMGEgLm5vdGVUZXh0IHsKICBmaWxsOiAjMkRCRDYwOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKCiNkYWZ4YjlhYXIwYSAuc2VjdGlvbnsKICBvcGFjaXR5OjE7Cn0KI2RhZnhiOWFhcjBhIC5zZWN0aW9uMCwjZGFmeGI5YWFyMGEgIC5zZWN0aW9uMiB7CiAgZmlsbDogI0VDRjdGMDsKfQoKI2RhZnhiOWFhcjBhIC5zZWN0aW9uMSwKI2RhZnhiOWFhcjBhIC5zZWN0aW9uMyB7CiAgZmlsbDogI0ZGRjsKfQojZGFmeGI5YWFyMGEgLnRhc2tUZXh0MCwKI2RhZnhiOWFhcjBhIC50YXNrVGV4dDEsCiNkYWZ4YjlhYXIwYSAudGFza1RleHQyLAojZGFmeGI5YWFyMGEgLnRhc2tUZXh0MyB7CiAgZmlsbDogI2ZmZjsKfQoKI2RhZnhiOWFhcjBhIC50YXNrMCwKI2RhZnhiOWFhcjBhIC50YXNrMSwKI2RhZnhiOWFhcjBhIC50YXNrMiwKI2RhZnhiOWFhcjBhIC50YXNrMyB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6ICMzNTlGNUE7Cn0KPC9zdHlsZT48c3R5bGU+I2RhZnhiOWFhcjBhIHsKICAgIGNvbG9yOiByZ2IoMjQ0LCAyNDQsIDI0NCk7CiAgICBmb250OiBub3JtYWwgbm9ybWFsIG5vcm1hbCBub3JtYWwgMTRweC8yMi4zOTk5OTk2MTg1MzAyNzNweCBtb25vc3BhY2U7CiAgfTwvc3R5bGU+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyLCAtMTIpIj48ZyBjbGFzcz0ib3V0cHV0Ij48ZyBjbGFzcz0iY2x1c3RlcnMiPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGhzIj48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik00NzAuMDExNzE4NzUsNTYuMjgxMjVMNDcwLjAxMTcxODc1LDgxLjI4MTI1TDQ3MC4wMTE3MTg3NSwxMDYuMjgxMjUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkNDMyNikiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkNDMyNiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTQ3MC4wMTE3MTg3NSwxNDIuNTYyNUw0NzAuMDExNzE4NzUsMTY3LjU2MjVMNDcwLjAxMTcxODc1LDE5Mi41NjI1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDQzMjcpIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDQzMjciIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik00MjEuMzIwNzk2MzYwMDE0NDcsMjI4Ljg0Mzc1TDM1NC4yMTg3NSwyNTMuODQzNzVMMzU0LjIxODc1LDI3OC44NDM3NSIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQ0MzI4KSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQ0MzI4IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNNTE4LjcwMjY0MTEzOTk4NTUsMjI4Ljg0Mzc1TDU4NS44MDQ2ODc1LDI1My44NDM3NUw1ODUuODA0Njg3NSwyNzguODQzNzUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkNDMyOSkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkNDMyOSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTMyMy41OTc2NTYyNSwyMjguNjM5NjYzNzY1NTE1NjVMMTE3Ljg1OTM3NSwyNTMuODQzNzVMMTE3Ljg1OTM3NSwyNzguODQzNzUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkNDMzMCkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkNDMzMCIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTYxNi40MjU3ODEyNSwyMjcuNDg4OTY2NTkwNDUzNzRMODQ2LjMwNDY4NzUsMjUzLjg0Mzc1TDg0Ni4zMDQ2ODc1LDI3OC44NDM3NSIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQ0MzMxKSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQ0MzMxIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMTE3Ljg1OTM3NSwzMTUuMTI1TDExNy44NTkzNzUsMzQwLjEyNUw0MDYuNDEwMTU2MjUsMzc1LjQ3NDA3OTA3OTgyMTY1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDQzMzIpIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDQzMzIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik0zNTQuMjE4NzUsMzE1LjEyNUwzNTQuMjE4NzUsMzQwLjEyNUw0MjEuMzIwNzk2MzYwMDE0NDcsMzY1LjEyNSIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQ0MzMzKSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQ0MzMzIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNNTg1LjgwNDY4NzUsMzE1LjEyNUw1ODUuODA0Njg3NSwzNDAuMTI1TDUxOC43MDI2NDExMzk5ODU1LDM2NS4xMjUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkNDMzNCkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkNDMzNCIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTg0Ni4zMDQ2ODc1LDMxNS4xMjVMODQ2LjMwNDY4NzUsMzQwLjEyNUw1MzMuNjEzMjgxMjUsMzc1Ljk3MzkzNjM4MjEwOTYiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkNDMzNSkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkNDMzNSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTQ0Ni4yMDY5ODQ4MzIwMzg0LDQwMS40MDYyNUw0MDIuNzE4NzUsNDM0LjU0Njg3NUw0MDIuNzE4NzUsNDY3LjY4NzUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkNDMzNikiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkNDMzNiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTQwMi43MTg3NSw1MDMuOTY4NzVMNDAyLjcxODc1LDUzNy4xMDkzNzVMNDM3LjQ2NjkxOTE3MzI1MDEsNjAzLjc5NDgwMTEwMjYyODQiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkNDMzNykiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkNDMzNyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTQ3MC41MTE3MTg3NSw3NjQuNTU5MzczNDc0MTIwOUw0NzAuMDExNzE4NzUsNzk3LjE5OTk5Njk0ODI0MjJMNDcwLjAxMTcxODc1LDgzMC4zNDA2MjE5NDgyNDIyIiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDQzMzgpIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDQzMzgiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik00NzAuMDExNzE4NzUsODY2LjYyMTg3MTk0ODI0MjJMNDcwLjAxMTcxODc1LDg5MS42MjE4NzE5NDgyNDIyTDQ3MC4wMTE3MTg3NSw5MTYuNjIxODcxOTQ4MjQyMiIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQ0MzM5KSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQ0MzM5IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNNTAzLjU1NjUxOTM2NzQwODUsNjAzLjc5NDc5OTA5MTUzMDFMNTM3LjMwNDY4NzUsNTM3LjEwOTM3NUw1MzcuMzA0Njg3NSw0ODUuODI4MTI1TDUzNy4zMDQ2ODc1LDQzNC41NDY4NzVMNDkzLjgxNjQ1MjY2Nzk2MTYsNDAxLjQwNjI1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDQzNDApIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDQzNDAiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbHMiPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHRyYW5zZm9ybT0iIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHRyYW5zZm9ybT0iIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHRyYW5zZm9ybT0iIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHRyYW5zZm9ybT0iIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHRyYW5zZm9ybT0iIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHRyYW5zZm9ybT0iIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHRyYW5zZm9ybT0iIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHRyYW5zZm9ybT0iIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHRyYW5zZm9ybT0iIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHRyYW5zZm9ybT0iIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwMi43MTg3NSw0MzQuNTQ2ODc1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNTIuODEyNSwtOC4wMDc4MTI1KSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSI3Ni40Mzc1IiBoZWlnaHQ9IjE2LjM1OTM3NSIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+dGhlIGl0aCBlbnRyeTwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDAyLjcxODc1LDUzNy4xMDkzNzUpIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDUuNDY4NzUsLTguMDA3ODEyNSkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMTY3LjAzMTI1IiBoZWlnaHQ9IjE2LjM1OTM3NSIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+bmFtZSBpbmRleCBpbiBzeW1ib2wgZW50cnk8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ3MC4wMTE3MTg3NSw3OTcuMTk5OTk2OTQ4MjQyMikiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQuMjAzMTI1LC04LjAwNzgxMjUpIiBjbGFzcz0ibGFiZWwiPjxyZWN0IHJ4PSIwIiByeT0iMCIgd2lkdGg9IjguMDMxMjUiIGhlaWdodD0iMTYuMzU5Mzc1IiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5ZPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIiB0cmFuc2Zvcm09IiIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIiBjbGFzcz0ibGFiZWwiPjxyZWN0IHJ4PSIwIiByeT0iMCIgd2lkdGg9IjAiIGhlaWdodD0iMCIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MzcuMzA0Njg3NSw0ODUuODI4MTI1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNC4yMDMxMjUsLTguMDA3ODEyNSkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iOC45ODQzNzUiIGhlaWdodD0iMTYuMzU5Mzc1IiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5OPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGVzIj48ZyBjbGFzcz0ibm9kZSIgaWQ9IkEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ3MC4wMTE3MTg3NSwzOC4xNDA2MjUpIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTE0NS40NjA5Mzc1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iMjkwLjkyMTg3NSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEzNS40NjA5Mzc1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5nZXQgbW9kdWxlIGJhc2UgZnJvbSAvcHJvYy8mbHQ7cGlkJmd0Oy9tYXBzIGZpbGU8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgaWQ9IkIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ3MC4wMTE3MTg3NSwxMjQuNDIxODc1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii0xMTAiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIyMjAiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDAsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPlByb2dyYW0gdGFibGUgaXMgYXQgdGhlIGJlZ2lubmluZzwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBpZD0iQyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDcwLjAxMTcxODc1LDIxMC43MDMxMjUpIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTE0Ni40MTQwNjI1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iMjkyLjgyODEyNSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEzNi40MTQwNjI1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5GaW5kIC5keW5hbWljIHNlY3Rpb24gaW4gUEhUIGJ5IFBUX0RZTkFNSUM8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgaWQ9IkQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM1NC4yMTg3NSwyOTYuOTg0Mzc1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii04OC41IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iMTc3IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzguNSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+R2V0IC5zdHJ0YWIgYnkgRFRfU1RSVEFCPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGUiIGlkPSJFIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1ODUuODA0Njg3NSwyOTYuOTg0Mzc1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii05My4wODU5Mzc1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iMTg2LjE3MTg3NSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTgzLjA4NTkzNzUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPkdldCAuc3ltdGFiIGJ5IERUX1NZTVRBQjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBpZD0iRiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTE3Ljg1OTM3NSwyOTYuOTg0Mzc1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii05Ny44NTkzNzUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxOTUuNzE4NzUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC04Ny44NTkzNzUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPkdldCAucmVsKGEpLnBsdCBieSBEVF9KTVBSRUw8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgaWQ9IkciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDg0Ni4zMDQ2ODc1LDI5Ni45ODQzNzUpIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTExNy40MTQwNjI1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iMjM0LjgyODEyNSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwNy40MTQwNjI1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5HZXQgLnJlbChhKS5wbHQgc2l6ZSBieSBEVF9QTFRSRUxTWjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBpZD0iSSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDcwLjAxMTcxODc1LDM4My4yNjU2MjUpIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTYzLjYwMTU2MjUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxMjcuMjAzMTI1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNTMuNjAxNTYyNSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+TG9vcCBpbiAucmVsKGEpLnBsdDwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBpZD0iSiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDAyLjcxODc1LDQ4NS44MjgxMjUpIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTk1LjExNzE4NzUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxOTAuMjM0Mzc1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODUuMTE3MTg3NSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+R2V0IHN5bWJvbCBlbnRyeSBpbiAuc3ltdGFiPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGUiIGlkPSJIIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NzAuMDExNzE4NzUsNjY3LjE1NDY4NTk3NDEyMTEpIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwb2x5Z29uIHBvaW50cz0iOTYuOTA0Njg3NTAwMDAwMDEsMCAxOTMuODA5Mzc1MDAwMDAwMDIsLTk2LjkwNDY4NzUwMDAwMDAxIDk2LjkwNDY4NzUwMDAwMDAxLC0xOTMuODA5Mzc1MDAwMDAwMDIgMCwtOTYuOTA0Njg3NTAwMDAwMDEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTk2LjkwNDY4NzUwMDAwMDAxLDk2LjkwNDY4NzUwMDAwMDAxKSI+PC9wb2x5Z29uPjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc5LjUzMTI1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5OYW1lIGluIC5zdHJ0YWIgbWF0Y2hlZCA/PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGUiIGlkPSJLIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NzAuMDExNzE4NzUsODQ4LjQ4MTI0Njk0ODI0MjIpIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTY1LjA3MDMxMjUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxMzAuMTQwNjI1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNTUuMDcwMzEyNSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+VXBkYXRlIHRhYmxlIGl0ZW08L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgaWQ9IkwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ3MC4wMTE3MTg3NSw5MzcuODAxNTU5NDQ4MjQyMikiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGNpcmNsZSB4PSItMjEuMTc5Njg3NSIgeT0iLTE4LjE0MDYyNSIgcj0iMjEuMTc5Njg3NSI+PC9jaXJjbGU+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTEuMTc5Njg3NSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+RW5kPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvZz48L2c+PC9zdmc+

我的基础代码来自于[1],总的项目后面我会更新到zhougy0717/inject_got仓库中。

Get module base

这里要做的其实就是获取对应的image在虚拟内存中的位置。例如:
可执行文件

    // 打开文件/proc/pid/maps,获取指定pid进程加载的内存模块信息
    fp = fopen(filename, "r");
    if(fp != NULL){
        // 每次一行,读取文件 /proc/pid/maps中内容
        while(fgets(line, sizeof(line), fp)){
            // 查找指定的so模块
            if(strstr(line, module_name)){
                // 分割字符串
                pch = strtok(line, "-");
                // 字符串转长整形
                addr = strtoul(pch, NULL, 16);
                break;
            }
        }
    }
    fclose(fp);
    return (void*)addr;

.rel.plt还是.rela.plt

rel和rela是两种relocation type。是rel还是rela会影响到后续选择的数据结构类型。到底该用rel还是rela,是取决于processor type的。而x86_64都是rela类型的,i386和arm32都是rel类型的。除了通过Google来得到rel type,还有更靠谱的方法是,检查.dynamic section的DT_PLTREL字段。

    for(i=0;i < dynamicSize / sizeof(Elf64_Dyn);i ++)
    {
        uint64_t val = dynamic_table[i].d_un.d_val;
        if (dynamic_table[i].d_tag == DT_PLTREL)
        {
            // DT_RELA = 7
            // DT_REL = 17
            relType = dynamic_table[i].d_un.d_val;
        }
    }

从.rel(a).plt index到.strtab index

这一段代码要做的就是找到.rel(a).plt表项所代表的函数的名字。这个函数的名字是存储在.strtab节的。代码大致如下:

    // 获取.rel(a).plt, .symtab, .strtab地址
    for(i=0;i < dynamicSize / sizeof(Elf64_Dyn);i ++)
    {
        uint64_t val = dynamic_table[i].d_un.d_val;
        if (dynamic_table[i].d_tag == DT_JMPREL)
        {
            jmpRelOff = dynamic_table[i].d_un.d_ptr;
        }
        if (dynamic_table[i].d_tag == DT_STRTAB)
        {
            strTabOff = dynamic_table[i].d_un.d_ptr;
        }
        if (dynamic_table[i].d_tag == DT_PLTRELSZ)
        {
            pltRelSz = dynamic_table[i].d_un.d_val;
        }
        if (dynamic_table[i].d_tag == DT_SYMTAB)
        {
            symTabOff = dynamic_table[i].d_un.d_ptr;
        }
    }
    
    Elf64_Rela* rel_table = (Elf64_Rela*)jmpRelOff;
    // 遍历查找要hook的导入函数
    // i ==> .rela.plt item index
    for(i = 0;i < pltRelSz / sizeof(Elf64_Rela);i++)
    {
        int number = ELF64_R_SYM(rel_table[i].r_info); // .symtab index
        Elf64_Sym* symEnt = (Elf64_Sym*)(number*sizeof(Elf64_Sym) + symTabOff);
        char* funcName = (char*)(symEnt->st_name + strTabOff);
        if(strcmp(funcName, "puts") == 0)
        {
            // 获取当前内存分页的大小
            uint64_t page_size = getpagesize();
            // 获取内存分页的起始地址(需要内存对齐)
            uint64_t mem_page_start = (uint64_t)(((Elf64_Addr)rel_table[i].r_offset + (uint64_t)base_addr)) & (~(page_size - 1));
            mprotect((void *)mem_page_start, page_size, PROT_READ | PROT_WRITE | PROT_EXEC);
            *(uint64_t *)(rel_table[i].r_offset + base_addr) = (uint64_t)my_puts; // overwrite GOT item
            break;
        }
    }

下图就是上面这段代码的示意图。

  • 在解析.dynamic节,获取.rel(a).plt, .symtab, .strtab信息时,要注意的是Elf64_Dyn的定义,它是一个union结构,是区分值类型和指针类型的,其定义如下:
typedef struct {
        Elf64_Xword d_tag;
        union {
                Elf64_Xword     d_val;
                Elf64_Addr      d_ptr;
        } d_un;
} Elf64_Dyn;

在获取内存地址的时候要用d_ptr,而在获取例如DT_PLTRELSZ时,就显然是一个值类型。

  • 前面说的relocation type在这里就会发挥作用。.rel(a).plt表项在不同的relocation type的情况下,其数据结构是不同的。他们的结构和尺寸都是不同的。
    • rel是Elf64_Rel
    • rela是Elf64_Rela
  • DT_SYMTAB是.symtab节,每一个symbol是一个Elf64_Sym数据结构
  • .strtab是所有符号的名字字符串表格。而Elf64_Sym.st_name是表格的偏移地址。注意,不是表格索引。所以获取名字的方法是symEnt->st_name + strTabOff
  • 最后,修改对应的页表属性,然后修改对应的内存地址就可以水到渠成了

参考文献

[1] Android so注入(inject)和Hook技术学习(二)——Got表hook之导入表hook

[2] Executable and Linkable Format

[3] Oracle Documentation

[4] Executable and Linking Format Specification, Version 1.2

%E5%A6%82%E6%9E%9C%E6%83%B3%E4%BF%AE%E6%94%B9POSIX%20API%E7%9A%84%E8%A1%8C%E4%B8%BA%EF%BC%8C%E9%80%9A%E5%B8%B8%E6%88%91%E4%BB%AC%E7%9A%84%E7%AC%AC%E4%B8%80%E6%83%B3%E6%B3%95%E6%98%AF%E4%BF%AE%E6%94%B9libc%E5%BA%93%E5%87%BD%E6%95%B0%EF%BC%8C%E5%B9%B6%E7%BB%B4%E6%8A%A4%E4%B8%80%E4%BB%BD%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84libc%E3%80%82%E8%BF%99%E6%A0%B7%E5%81%9A%E7%9A%84%E4%BB%A3%E4%BB%B7%E9%9D%9E%E5%B8%B8%E5%A4%A7%EF%BC%8C%E5%9B%A0%E4%B8%BAlibc%E6%98%AF%E5%9F%BA%E7%A1%80%E5%BA%93%EF%BC%8C%E6%8E%A5%E5%8F%A3%E9%9D%9E%E5%B8%B8%E5%A4%9A%EF%BC%8C%E6%B6%89%E5%8F%8A%E7%9A%84%E9%9D%A2%E4%B9%9F%E5%BE%88%E5%B9%BF%E3%80%82%E4%BF%AE%E6%94%B9%E5%8F%AF%E8%83%BD%E4%B8%8D%E9%9A%BE%EF%BC%8C%E4%BD%86%E5%90%8E%E6%9C%9F%E7%BB%B4%E6%8A%A4%EF%BC%8Cmerge%E4%B8%BB%E5%B9%B2%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%AF%94%E8%BE%83%E9%BA%BB%E7%83%A6%EF%BC%8C%E4%B9%9F%E6%B2%A1%E6%9C%89%E4%BB%B7%E5%80%BC%E3%80%82%E4%BF%AE%E6%94%B9libc%E5%87%BD%E6%95%B0%E5%AE%9E%E7%8E%B0%EF%BC%8C%E8%BF%98%E6%9C%89%E4%B8%80%E4%B8%AA%E7%BC%BA%E7%82%B9%E6%98%AF%EF%BC%8C%E7%BC%96%E8%AF%91%E6%97%B6%E4%BF%AE%E6%94%B9%EF%BC%8C%E8%80%8C%E9%9D%9E%E8%BF%90%E8%A1%8C%E6%97%B6%E3%80%82%E8%BF%99%E4%BC%9A%E7%BB%99%E4%B8%80%E4%BA%9B%E6%97%A0%E6%B3%95%E4%B8%8B%E7%BA%BF%E5%B9%B6%E9%87%8D%E6%96%B0%E6%89%93%E5%8C%85%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%B8%A6%E6%9D%A5%E5%9B%B0%E6%89%B0%EF%BC%8C%E4%BE%8B%E5%A6%82%E7%A8%8B%E5%BA%8F%E5%B7%B2%E7%BB%8F%E5%88%86%E5%8F%91%EF%BC%8C%E9%87%8D%E6%96%B0%E6%89%93%E5%8C%85%E5%86%8D%E5%88%86%E5%8F%91%E8%80%97%E6%97%B6%E8%80%97%E5%8A%9B%E3%80%82%E5%A6%82%E6%9E%9C%E8%83%BD%E6%89%BE%E5%88%B0%E8%BF%90%E8%A1%8C%E6%97%B6%E4%BF%AE%E6%94%B9%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%8C%E4%BE%8B%E5%A6%82%EF%BC%8C%E6%9A%82%E5%81%9C%E6%9C%8D%E5%8A%A1%EF%BC%8C%E6%9B%BF%E6%8D%A2%E4%B8%80%E4%B8%AA%E5%BA%93%E6%96%87%E4%BB%B6%E5%B0%B1%E5%8F%AF%E4%BB%A5%E4%BF%AE%E6%94%B9%E6%9F%90%E4%BA%9B%E8%A1%8C%E4%B8%BA%E3%80%82%E5%A6%82%E6%9E%9C%E8%83%BD%E5%81%9A%E5%88%B0%E8%BF%90%E8%A1%8C%E6%97%B6%E4%BF%AE%E6%94%B9%EF%BC%8C%E5%AF%B9%E4%BA%8E%E8%B0%83%E8%AF%95%E4%B9%9F%E6%98%AF%E9%9D%9E%E5%B8%B8%E5%8F%8B%E5%A5%BD%E7%9A%84%E3%80%82%0A%E5%B9%B8%E8%BF%90%E7%9A%84%E6%98%AF%EF%BC%8C%E5%9C%A8Linux%E4%B8%8A%EF%BC%8C%E4%BF%AE%E6%94%B9libc%E7%9A%84%E6%96%B9%E6%B3%95%E5%BE%88%E5%A4%9A%EF%BC%9A%0A1.%20%E4%BD%BF%E7%94%A8LD_PRELOAD%EF%BC%8C%E8%A6%86%E7%9B%96libc%E4%B8%AD%E7%9A%84%E5%87%BD%E6%95%B0%0A2.%20%E4%BD%BF%E7%94%A8alias%E6%9B%BF%E4%BB%A3weak_alias%EF%BC%8C%E7%BC%96%E8%AF%91%E6%9B%BF%E6%8D%A2libc%E5%87%BD%E6%95%B0%0A3.%20%E4%BD%BF%E7%94%A8GOT%E8%A1%A8%E8%A6%86%E7%9B%96libc%E5%87%BD%E6%95%B0%E5%AE%9E%E7%8E%B0%0A%0A1%E5%92%8C3%E9%83%BD%E6%98%AF%E5%8A%A8%E6%80%81%EF%BC%8C%E8%BF%90%E8%A1%8C%E6%97%B6%E4%BF%AE%E6%94%B9%E3%80%823%E6%9B%B4%E6%A3%92%E7%9A%84%E6%98%AF%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%81%9A%E8%BF%90%E8%A1%8C%E6%97%B6%E5%8A%A8%E6%80%81%E8%8E%B7%E5%BE%97libc%E7%9A%84%E5%8E%9F%E5%AE%9E%E7%8E%B0%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88%EF%BC%8C%E5%B9%B6%E7%94%A8%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AE%9E%E4%BE%8B%E5%8E%BB%E8%A6%86%E5%86%99%E3%80%82%E8%BF%99%E6%A0%B7%E5%9C%A8%E5%86%85%E9%83%A8%E5%8F%AF%E4%BB%A5%E4%BF%9D%E5%AD%98%E4%B8%A4%E4%BB%BD%E5%AE%9E%E4%BE%8B%EF%BC%8C%E8%80%8C%E6%97%A0%E9%9C%80%E7%BB%B4%E6%8A%A4%E5%BC%80%E6%BA%90%E5%AE%9E%E4%BE%8B%E3%80%82%0A%E5%9C%A8%E6%95%B4%E4%B8%AA%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%92%8C%E5%AE%9E%E9%AA%8C%E4%B8%AD%E6%9F%A5%E9%98%85%E4%BA%86%E4%B8%8D%E5%B0%91%E8%B5%84%E6%96%99%EF%BC%8C%E5%9B%9E%E5%A4%B4%E7%9C%8B%E6%9D%A5%EF%BC%8C%E5%85%B6%E4%B8%AD%E6%AF%94%E8%BE%83%E6%9C%89%E4%BB%B7%E5%80%BC%E7%9A%84%E5%BA%94%E5%BD%93%E6%98%AF%E6%96%87%E6%9C%AB%E7%9A%84%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE%E4%B8%AD%E5%88%97%E5%87%BA%E7%9A%84%E4%B8%80%E4%BA%9B%E9%93%BE%E6%8E%A5%E3%80%82%0A%5BAndroid%20so%E6%B3%A8%E5%85%A5(inject)%E5%92%8CHook%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%BA%8C%EF%BC%89%E2%80%94%E2%80%94Got%E8%A1%A8hook%E4%B9%8B%E5%AF%BC%E5%85%A5%E8%A1%A8hook%5D(https%3A%2F%2Fwww.cnblogs.com%2Fgoodhacker%2Fp%2F9306997.html)%0A%E6%88%91%E7%9A%84%E5%AE%9E%E9%AA%8C%E4%BB%A3%E7%A0%81%E5%9F%BA%E4%BA%8E%E8%BF%99%E4%B8%AA%E7%BD%91%E9%A1%B5%E4%B8%AD%E7%9A%84%E6%96%B9%E6%B3%95%E4%BA%8C%E5%AE%9E%E4%BE%8B%E4%BB%A3%E7%A0%81%EF%BC%8C%E9%80%9A%E8%BF%87%E8%A7%A3%E6%9E%90.dynamic%20section%E6%9D%A5%E8%8E%B7%E5%8F%96GOT%E5%9C%B0%E5%9D%80%EF%BC%8C%E5%B9%B6%E8%A6%86%E7%9B%96%E5%AF%B9%E5%BA%94%E8%A1%A8%E9%A1%B9%0A%5BExecutable%20and%20Linkable%20Format%5D(https%3A%2F%2Fstevens.netmeister.org%2F631%2Felf.html)%0A%E8%BF%99%E4%B8%AA%E5%B8%96%E5%AD%90%E9%9D%9E%E5%B8%B8%E6%A3%92%EF%BC%8C%E8%AF%A6%E7%BB%86%E9%98%90%E8%BF%B0%E4%BA%86%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E7%9A%84%E8%BF%87%E7%A8%8B%EF%BC%8C%E5%8C%85%E6%8B%AClink%20editor%E4%BB%A5%E5%8F%8Aruntime%20dynamic%20link%E6%B5%81%E7%A8%8B%E3%80%82%E5%8F%AA%E6%98%AF%E5%8F%AF%E8%83%BD%E6%97%B6%E9%97%B4%E6%AF%94%E8%BE%83%E4%B9%85%EF%BC%8C%E5%85%B6%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E9%93%BE%E6%8E%A5%E9%83%BD%E5%A4%B1%E6%95%88%E4%BA%86%0A%5BOracle%20Documentation%5D(https%3A%2F%2Fdocs.oracle.com%2Fcd%2FE19683-01%2F817-3677%2F6mj8mbtc9%2Findex.html%23chapter6-79797)%0A%5BExecutable%20and%20Linking%20Format%20Specification%2C%20Version%201.2%5D(https%3A%2F%2Frefspecs.linuxbase.org%2Felf%2Felf.pdf)%0A%E8%BF%99%E4%B8%A4%E4%B8%AA%E9%93%BE%E6%8E%A5%E9%83%BD%E7%BB%99%E5%87%BA%E4%BA%86%E4%B8%80%E4%BA%9B%E8%BE%83%E4%B8%BA%E5%AE%98%E6%96%B9%E7%9A%84%E9%98%90%E8%BF%B0%EF%BC%8C%E9%92%88%E5%AF%B9%E5%90%84%E4%B8%AAsection%EF%BC%8C%E4%BB%A5%E5%8F%8A%E5%AF%B9%E5%BA%94%E7%9A%84%E5%8F%96%E5%80%BC%E7%AD%89%E7%AD%89%EF%BC%8C%E4%BD%9C%E4%B8%BA%E6%89%8B%E5%86%8C%E6%9F%A5%E8%AF%A2%E5%BE%88%E5%A5%BD%E3%80%82%0A%0A%23%23%20ELF%E6%A6%82%E8%BF%B0%0A%3E**from%20Wiki**%0A%3EExecutable%20and%20Linkable%20Format%20(ELF%2C%20formerly%20named%20Extensible%20Linking%20Format)%2C%20is%20a%20common%20standard%20file%20format%20for%20executable%20files%2C%20object%20code%2C%20shared%20libraries%2C%20and%20core%20dumps.%20%0A%0A%60%60%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2B-----------------%2B%0A%20%20%20%20%20%20%20%20%20%2B----%7C%20ELF%20File%20Header%20%7C----%2B%0A%20%20%20%20%20%20%20%20%20%7C%20%20%20%20%2B-----------------%2B%20%20%20%20%7C%0A%20%20%20%20%20%20%20%20%20v%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20v%0A%20%2B-----------------%2B%20%20%20%20%20%20%2B-----------------%2B%0A%20%7C%20Program%20Headers%20%7C%20%20%20%20%20%20%7C%20Section%20Headers%20%7C%0A%20%2B-----------------%2B%20%20%20%20%20%20%2B-----------------%2B%0A%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%0A%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%0A%20%20%20%20%20%20%7C%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%0A%20%20%20%20%20%20%7C%7C%20%20%20%2B------------------------%2B%20%20%7C%7C%0A%20%20%20%20%20%20%2B--%3E%20%7C%20Contents%20(Byte%20Stream)%20%7C%3C--%2B%0A%20%20%20%20%20%20%20%20%20%20%20%2B------------------------%2B%0A%60%60%60%0AELF%E6%A0%BC%E5%BC%8F%E9%80%9A%E5%B8%B8%E6%9C%89linking%20view%E5%92%8Cexecution%20view%EF%BC%8C%E5%8D%B3%E7%BC%96%E8%AF%91%E6%97%B6%EF%BC%8C%E5%92%8C%E8%BF%90%E8%A1%8C%E6%97%B6%E7%9A%84%E4%B8%8D%E5%90%8C%E3%80%82%0A!%5Bc6e4a6b28cbbfe15ec89929d8885ef51.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6377)%0Alinking%20view%E6%97%B6%EF%BC%8C%E5%8F%AF%E4%BB%A5%E6%B2%A1%E6%9C%89Program%20Header%20Table%EF%BC%8C%E4%BD%86%E5%BF%85%E9%A1%BB%E8%A6%81%E6%9C%89Section%20Header%20Table%0A%E5%8F%8D%E4%B9%8B%EF%BC%8Cexecution%20view%E6%97%B6%EF%BC%8C%E5%BF%85%E9%A1%BB%E6%9C%89Program%20Header%20Table%2C%20%E4%BD%86%E5%8F%AF%E4%BB%A5%E6%B2%A1%E6%9C%89Section%20Header%20Table%0A%3E%E6%88%91%E7%90%86%E8%A7%A3%E4%B9%8B%E6%89%80%E4%BB%A5%E8%A6%81%E8%BF%99%E4%B9%88%E5%88%86%E6%88%90%E4%B8%8D%E5%90%8C%E7%9A%84view%E7%9A%84%E5%8E%9F%E5%9B%A0%E6%98%AF%EF%BC%8C%E8%BF%90%E8%A1%8C%E6%97%B6%EF%BC%8C%E5%86%85%E5%AD%98%E6%AF%94%E8%BE%83%E5%AE%9D%E8%B4%B5%EF%BC%8CELF%E6%96%87%E4%BB%B6%E8%A2%AB%E5%8A%A0%E8%BD%BD%E6%97%B6%EF%BC%8C%E7%9B%B8%E5%85%B3%E7%9A%84%E8%8A%82(section)%E8%A2%AB%E5%90%88%E5%B9%B6%E6%88%90segment%E3%80%82%0A%0Asegment%E5%88%97%E8%A1%A8%5B2%5D%0A!%5B3b25828c42fd0bec473b2eded7e98d9b.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6378)%0A%E7%A8%8B%E5%BA%8F%E8%BF%90%E8%A1%8C%E6%97%B6%EF%BC%8C%E5%B0%B1%E4%BD%93%E7%8E%B0%E4%B8%BA%E8%BF%99%E4%BA%9B%E6%AE%B5%E3%80%82%E8%80%8C%E5%AF%B9%E4%BA%8E%E6%9C%AC%E6%96%87%E6%AF%94%E8%BE%83%E9%87%8D%E8%A6%81%E7%9A%84%E6%AE%B5%E5%B0%B1%E6%98%AFDYNAMIC%E6%AE%B5%EF%BC%8C%E5%85%B6%E4%B8%AD%E5%8C%85%E5%90%AB%E4%BA%86%E4%B8%80%E7%BB%84_DYNAMIC%20array%E3%80%82%E5%90%8E%E6%96%87%E5%86%8D%E5%81%9A%E4%BB%8B%E7%BB%8D%E3%80%82%0A%0Asection%E5%88%97%E8%A1%A8%E8%8A%82%E9%80%89%5B2%5D%0A!%5B4531bf460ddcca48ecd458d30faa9021.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6379)%0Asection%E5%B0%B1%E6%98%AF%E6%88%91%E4%BB%AC%E5%B8%B8%E8%A7%81%E7%9A%84%E4%BB%A5%E7%82%B9%E5%BC%80%E5%A4%B4%E7%9A%84%E4%B8%80%E4%BA%9B%E6%A0%87%E8%AE%B0%E3%80%82%E9%93%BE%E6%8E%A5%E8%84%9A%E6%9C%AC%EF%BC%88linker%20script%2C%20.lds%E6%96%87%E4%BB%B6%EF%BC%89%EF%BC%8C%E4%B9%9F%E6%AD%A3%E6%98%AF%E5%AE%9A%E4%B9%89%E7%9A%84%E8%BF%99%E4%BA%9BELF%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E8%8A%82%E3%80%82%E5%B8%B8%E8%A7%81%E7%9A%84%E8%8A%82%E6%9C%89%3A%20.bss%2C%20.data%2C%20.text%2C%20.init%E7%AD%89%E7%AD%89%E3%80%82%0A%0A%23%23%20%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%0A%E6%88%91%E4%BB%AC%E7%9F%A5%E9%81%93%E5%BD%93%E5%BC%95%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%93%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E9%80%9A%E5%B8%B8%E6%9C%89%E4%B8%A4%E7%A7%8D%E9%93%BE%E6%8E%A5%E6%96%B9%E5%BC%8F%EF%BC%8C%E4%B8%80%E7%A7%8D%E6%98%AF%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%EF%BC%8C%E4%B8%80%E7%A7%8D%E6%98%AF%E9%9D%99%E6%80%81%E9%93%BE%E6%8E%A5%E3%80%82%E9%9D%99%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93%E5%9C%A8Windows%E4%B8%8A%E6%98%AF.lib%E7%BB%93%E5%B0%BE%E7%9A%84%EF%BC%8C%E5%9C%A8Linux%E5%B9%B3%E5%8F%B0%E4%B8%8A%E6%98%AF.a%E7%BB%93%E5%B0%BE%E7%9A%84%E3%80%82%E9%9D%99%E6%80%81%E5%BA%93%E4%B8%8D%E6%98%AF%E4%B8%80%E7%A7%8D%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%EF%BC%8C%E8%80%8C%E5%8F%AA%E6%98%AF%E4%B8%80%E4%BA%9B%E4%BB%A3%E7%A0%81%E5%92%8C%E6%95%B0%E6%8D%AE%E6%89%93%E5%8C%85%EF%BC%88Archive%EF%BC%89%E3%80%82%E5%BD%93%E5%8F%91%E7%94%9F%E9%93%BE%E6%8E%A5%E6%97%B6%EF%BC%8C%E7%94%B1%E9%93%BE%E6%8E%A5%E5%99%A8%E5%B0%86%E5%85%B6%E4%B8%AD%E7%9A%84%E4%BB%A3%E7%A0%81%E5%92%8C%E6%95%B0%E6%8D%AE%E5%88%86%E5%88%AB%E6%94%BE%E5%88%B0%E6%9C%80%E7%BB%88%E7%9A%84ELF%E6%96%87%E4%BB%B6%E7%9A%84%E5%AF%B9%E5%BA%94%E7%9A%84%E8%8A%82%EF%BC%88section%EF%BC%89%E3%80%82%0A%E8%80%8C%E5%8A%A8%E6%80%81%E5%BA%93%E6%98%AF%E4%B8%80%E7%A7%8D%E5%AE%8C%E5%85%A8%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84%E4%B8%9C%E8%A5%BF%EF%BC%8C%E5%8A%A8%E6%80%81%E5%BA%93%E7%9A%84%E8%A1%8C%E4%B8%BA%E6%9B%B4%E8%B6%8B%E8%BF%91%E4%BA%8E%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E3%80%82%E5%9C%A8Windows%E5%B9%B3%E5%8F%B0%E4%B8%8A%EF%BC%8C%E5%8A%A8%E6%80%81%E5%BA%93%E6%96%87%E4%BB%B6%E4%BB%A5.dll%E7%BB%93%E5%B0%BE%EF%BC%8C%E5%9C%A8Linux%E5%B9%B3%E5%8F%B0%E4%B8%8A%EF%BC%8C%E5%8A%A8%E6%80%81%E5%BA%93%E6%96%87%E4%BB%B6%E4%BB%A5.so%E7%BB%93%E5%B0%BE%E3%80%82%0A%E5%9C%A8Windows%E4%B8%8B%EF%BC%8C%E5%A6%82%E6%9E%9C%E8%A6%81%E8%BF%9B%E8%A1%8C%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%EF%BC%8C%E5%BF%85%E9%A1%BB%E4%BD%BF%E7%94%A8LoadLibrary%E5%87%BD%E6%95%B0%E6%89%93%E5%BC%80%E4%B8%80%E4%B8%AA.dll%E5%BA%93%E6%96%87%E4%BB%B6%EF%BC%8C%E5%86%8D%E7%94%A8GetProcAddress%E8%8E%B7%E5%8F%96%E5%85%B7%E4%BD%93%E5%87%BD%E6%95%B0%E7%9A%84%E5%9C%B0%E5%9D%80%EF%BC%8C%E8%BF%9B%E8%A1%8C%E8%B0%83%E7%94%A8%E3%80%82dll%E5%AF%BC%E5%87%BA%E5%87%BD%E6%95%B0%E5%88%97%E8%A1%A8%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4%E6%9F%A5%E7%9C%8B%EF%BC%9A%60dumpbin%20%2Fexports%20%3Cdll%E6%96%87%E4%BB%B6%E5%AE%8C%E6%95%B4%E8%B7%AF%E5%BE%84%3E%60%E3%80%82%0ALinux%E4%B8%8B%E4%B9%9F%E6%9C%89%E7%B1%BB%E4%BC%BC%E7%9A%84%E6%96%B9%E5%BC%8F%EF%BC%8C%E5%B0%B1%E6%98%AF%E5%8F%AF%E4%BB%A5%E7%94%A8dlopen%E6%89%93%E5%BC%80%E4%B8%80%E4%B8%AA.so%E6%96%87%E4%BB%B6%EF%BC%8C%E5%86%8D%E7%94%A8dlsym%E6%89%BE%E5%88%B0%E5%AF%B9%E5%BA%94%E7%9A%84%E5%87%BD%E6%95%B0%E3%80%82%E4%BD%86%E6%98%AFLinux%E9%80%9A%E5%B8%B8%E4%BD%BF%E7%94%A8%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93%E7%9A%84%E6%96%B9%E5%BC%8F%EF%BC%8C%E6%98%AF%E7%9B%B4%E6%8E%A5%E9%93%BE%E6%8E%A5%E3%80%82%E4%BE%8B%E5%A6%82%EF%BC%9A%0A%60gcc%20-L%2Flib%20-ltest%20main.c%20-o%20test%60%0A%E8%BF%99%E5%B0%B1%E6%98%AF%E5%9C%A8lib%E6%90%9C%E7%B4%A2%E8%B7%AF%E5%BE%84%E4%B8%8B%EF%BC%8C%E6%89%BE%E5%88%B0libtest.so%EF%BC%8C%E5%B9%B6%E9%93%BE%E6%8E%A5%E3%80%82%E6%B3%A8%E6%84%8F%E8%BF%99%E9%87%8C%E9%BB%98%E8%AE%A4%E5%85%88%E5%B0%9D%E8%AF%95%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%B2%A1%E6%9C%89.so%E6%96%87%E4%BB%B6%EF%BC%8C%E4%BC%9A%E5%86%8D%E5%B0%9D%E8%AF%95%E9%9D%99%E6%80%81%E9%93%BE%E6%8E%A5.a%E6%96%87%E4%BB%B6%E3%80%82%E5%A6%82%E6%9E%9C%E9%83%BD%E6%B2%A1%E6%9C%89%EF%BC%8C%E5%B0%B1%E4%BC%9A%E6%8A%A5%E9%94%99%E3%80%82%E8%BF%99%E4%B9%9F%E5%B0%B1%E6%98%AF%E8%AF%B4Linux%E5%B9%B3%E5%8F%B0%E4%B8%8A%EF%BC%8C%E9%80%9A%E8%BF%87-l%E5%8F%82%E6%95%B0%E6%8C%87%E5%AE%9A%E7%9A%84%E9%93%BE%E6%8E%A5%E5%8F%82%E6%95%B0%EF%BC%8C%E6%98%AF%E9%BB%98%E8%AE%A4%E5%B0%9D%E8%AF%95%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%EF%BC%8C%E5%85%B6%E6%AC%A1%E6%89%8D%E6%98%AF%E9%9D%99%E6%80%81%E9%93%BE%E6%8E%A5%E3%80%82%0A%E5%A6%82%E6%9E%9C%E6%83%B3%E6%8C%87%E5%AE%9A%E4%BD%BF%E7%94%A8%E9%9D%99%E6%80%81%E9%93%BE%E6%8E%A5%EF%BC%8C%E5%8F%AF%E4%BB%A5%E7%94%A8%E4%B8%8B%E9%9D%A2%E7%9A%84%E5%91%BD%E4%BB%A4%EF%BC%9A%0A%60gcc%20-L%2Flib%20-static%20-ltest%20main.c%20-o%20test%60%0A%E6%88%96%E8%80%85%0A%60gcc%20-L%2Flib%20libtest.a%20main.c%20-o%20test%60%0A%0A%23%23%23%20How%20is%20an%20executable%20binary%20in%20Linux%20being%20executed%20%3F%5B2%5D%0A1.%20%60sys_execve%60%20function%20(in%20arch%2Fx86%2Fkernel%2Fprocess.c)%20handles%20the%20execvc%20system%20call%20from%20user%20space.%20It%20calls%20%60do_execve%60%20function.%20%0A2.%20%60do_execve%60%20function%20(in%20fs%2Fexec.c)%20opens%20the%20executable%20binary%20file%20and%20does%20some%20preparation.%20It%20calls%20%60search_binary_handler%60%20function.%20%0A3.%20%60search_binary_handler%60%20function%20(in%20fs%2Fexec.c)%20finds%20out%20the%20type%20of%20executable%20binary%20and%20calls%20the%20corresponding%20handler%2C%20which%20in%20our%20case%2C%20is%20%60load_elf_binary%60%20function.%0A4.%20%60load_elf_binary%60%20(in%20fs%2Fbinfmt_elf.c)%20loads%20the%20user's%20executable%20binary%20file%20into%20memory.%20It%20allocates%20memory%20segments%20and%20zeros%20out%20the%20BSS%20section%20by%20calling%20the%20padzero%20function.%0A%60load_elf_binary%60%20also%20examines%20whether%20the%20user's%20executable%20binary%20contains%20an%20INTERP%20segment%20or%20not.%0A5.%20If%20the%20executable%20binary%20is%20dynamically%20linked%2C%20then%20the%20compiler%20will%20usually%20creates%20an%20**INTERP**%20segment%20(which%20is%20usually%20the%20same%20as%20.interp%20section%20in%20ELF's%20%22linking%20view%22)%2C%20which%20contains%20the%20full%20pathname%20of%20an%20%22interpreter%22%2C%20usually%20is%20the%20Glibc%20runtime%20linker%20ld.so.%0ATo%20see%20this%2C%20use%20command%20%60readelf%20-p%20.interp%20a.out%60%0A%0A6.%20Thus%2C%20if%20the%20ELF%20executable%20binary%20file%20contains%20an%20**INTERP**%20segment%2C%20%60load_elf_binary%60%20will%20call%20load_elf_interp%20function%20to%20load%20the%20image%20of%20this%20interpreter%20as%20well.%0A7.%20Finally%2C%20%60load_elf_binary%60%20calls%20start_thread%20(in%20arch%2Fx86%2Fkernel%2Fprocess_64.c)%20and%20passes%20control%20to%20either%20the%20interpreter%20or%20the%20user%20program.%0A%0A%E8%BF%99%E4%B8%AA1-7%E5%B0%B1%E6%98%AFELF%E6%96%87%E4%BB%B6%E8%A2%AB%E5%8A%A0%E8%BD%BD%E7%9A%84%E8%BF%87%E7%A8%8B%EF%BC%8C%E4%B9%8B%E5%90%8E%EF%BC%8C%E5%86%8D%E5%8F%AA%E8%A6%81%E4%B8%80%E4%B8%AA%E8%B7%B3%E8%BD%AC%E8%AF%AD%E5%8F%A5%EF%BC%8C%E5%B0%B1%E5%8F%AF%E4%BB%A5%E7%9C%9F%E6%AD%A3%E7%9A%84%E6%89%A7%E8%A1%8C%E8%BF%99%E4%B8%AA%E7%A8%8B%E5%BA%8F%E4%BA%86%E3%80%82%E8%BF%99%E9%87%8C%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E5%B0%B1%E6%98%AF%E7%AC%AC5%E6%AD%A5%E3%80%82%E5%A6%82%E6%9E%9C%E8%A2%AB%E5%8A%A0%E8%BD%BD%E7%9A%84%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%98%AF%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E7%94%9F%E6%88%90%E7%9A%84%EF%BC%8C%E5%8D%B3%E8%A6%81%E4%B9%88%E6%98%AF%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93%EF%BC%8C%E8%A6%81%E4%B9%88%E6%98%AF%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%EF%BC%8C%E5%88%99%E5%8A%A0%E8%BD%BD%E6%97%B6%EF%BC%8C%E5%86%85%E6%A0%B8%E4%BC%9A%E7%BB%99ELF%E7%9A%84%E5%86%85%E5%AD%98%E9%95%9C%E5%83%8F%EF%BC%88%E5%8D%B3%E6%89%80%E8%B0%93%E7%9A%84executing%20view%EF%BC%89%E5%8A%A0%E4%B8%80%E4%B8%AAINTERP%E6%AE%B5%EF%BC%88segment%EF%BC%89%E3%80%82%E8%80%8C%E8%BF%99%E4%B8%AA%E6%AE%B5%E5%B0%B1%E6%98%AF%E6%89%80%E8%B0%93%E7%9A%84runtime%20linker%EF%BC%88compile%E6%97%B6%E7%9A%84linker%EF%BC%8C%E5%8D%B3ld%EF%BC%8C%E7%A7%B0%E4%B8%BAlink%20editor%EF%BC%89%EF%BC%8C%E4%B9%9F%E5%B0%B1%E6%98%AFld.so%E3%80%82%0A%0A%23%23%23%20ld.so%0A%E4%BB%80%E4%B9%88%E6%98%AFld.so%3F%20ld.so%E5%81%9A%E4%BA%86%E4%BA%9B%E5%95%A5%EF%BC%9F%E6%96%87%E7%8C%AE%5B2%5D%E9%83%BD%E5%81%9A%E4%BA%86%E5%BE%88%E5%A5%BD%E7%9A%84%E8%AF%B4%E6%98%8E%E3%80%82%0A%3E%20ld.so%20is%20the%20runtime%20linker%2Floader%20(the%20compile-time%20linker%20ld%20is%20formally%20called%20%22link%20editor%22)%20for%20dynamic%20executables.%20It%20provides%20the%20following%20services%20%5B2%5D%3A%0A%3E%20-%20Analyzes%20the%20user's%20executable%20binary's%20DYNAMIC%20segment%20and%20determines%20what%20dependencies%20are%20required.%20%0A%3E%20-%20Locates%20and%20loads%20these%20**dependencies**%2C%20analyzes%20their%20DYNAMIC%20segments%20to%20determine%20if%20more%20dependencies%20are%20required.%0A%3E%20-%20Performs%20any%20necessary%20relocations%20to%20bind%20these%20objects.%0A%3E%20-%20Calls%20any%20initialization%20functions%20(see%20below)%20provided%20by%20these%20dependencies.%0A%3E%20-%20Passes%20control%20to%20user's%20executable%20binary.%0A%0A%23%23%23%20How%20does%20ld.so%20work%20%3F%5B2%5D%0Ald.so%E6%98%AF%E7%94%A8%E6%9D%A5%E5%8A%A0%E8%BD%BD%E6%89%80%E6%9C%89%E7%9A%84%E5%8A%A8%E6%80%81%E5%BA%93%E7%9A%84%EF%BC%8C%E6%89%80%E4%BB%A5ld.so%E6%9C%AC%E8%BA%AB%E4%B8%8D%E6%98%AF%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BD%E7%9A%84%E3%80%82ld.so%E7%9A%84%E5%85%A5%E5%8F%A3%E5%9C%A8_dl_start%E3%80%82%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87gdb%E5%81%9C%E5%9C%A8%E8%BF%99%E4%B8%AA%E5%87%BD%E6%95%B0%E4%B8%8A%E3%80%82%0A%60%60%60%0A(gdb)%20break%20_dl_start%0AFunction%20%22_dl_start%22%20not%20defined.%0AMake%20breakpoint%20pending%20on%20future%20shared%20library%20load%3F%20(y%20or%20%5Bn%5D)%20y%0ABreakpoint%201%20(_dl_start)%20pending.%0A(gdb)%20run%0AStarting%20program%3A%20a.out%0A%0ABreakpoint%201%2C%200x0000003433e00fa0%20in%20_dl_start%20()%20from%20%2Flib64%2Fld-linux-x86-64.so.2%0A(gdb)%20bt%0A%230%20%200x0000003433e00fa0%20in%20_dl_start%20()%20from%20%2Flib64%2Fld-linux-x86-64.so.2%0A%231%20%200x0000003433e00a78%20in%20_start%20()%20from%20%2Flib64%2Fld-linux-x86-64.so.2%0A%232%20%200x0000000000000001%20in%20%3F%3F%20()%0A%233%20%200x00007fffffffe4f2%20in%20%3F%3F%20()%0A%234%20%200x0000000000000000%20in%20%3F%3F%20()%0A...%0A(gdb)%20x%2F10i%20%24pc%0A%20%20%200x3433e00a70%20%3C_start%3E%3A%20%20%20%20%20%20%20mov%20%20%20%20%25rsp%2C%25rdi%0A%20%20%200x3433e00a73%20%3C_start%2B3%3E%3A%20%20%20%20%20callq%20%200x3433e00fa0%20%3C_dl_start%3E%0A%20%20%200x3433e00a78%20%3C_dl_start_user%3E%3A%20%20%20%20%20%20%20mov%20%20%20%20%25rax%2C%25r12%0A%20%20%200x3433e00a7b%20%3C_dl_start_user%2B3%3E%3A%20%20%20%20%20mov%20%20%20%200x21b30b(%25rip)%2C%25eax%20%20%20%20%20%20%20%20%23%200x343401bd8c%20%3C_dl_skip_args%3E%0A...%0A%60%60%60%0A%E5%BD%93_dl_start%E6%89%A7%E8%A1%8C%E5%AE%8C%E5%90%8E%EF%BC%8Cld.so%E5%B0%B1%E4%BC%9A%E4%B8%BA%E6%88%91%E4%BB%AC%E5%88%86%E6%9E%90%E4%BE%9D%E8%B5%96%E5%85%B3%E7%B3%BB%EF%BC%8C%E5%B9%B6%E5%8A%A0%E8%BD%BD%E8%B5%B7%E6%89%80%E6%9C%89%E5%BF%85%E9%9C%80%E7%9A%84%E5%8A%A8%E6%80%81%E5%BA%93%E6%96%87%E4%BB%B6%E3%80%82%0A!%5Be64fb8aa42aac26092b764a6ebccaf43.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6382)%0A%E4%B8%8A%E5%9B%BE%E5%B0%B1%E6%98%AFld.so%E5%8A%A0%E8%BD%BD%E5%AE%8C%E6%88%90%E5%90%8E%EF%BC%8C%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%86%85%E5%AD%98%E5%88%86%E5%B8%83%E3%80%82%E5%85%B6%E4%B8%AD%E5%8F%AF%E4%BB%A5%E5%8F%91%E7%8E%B0%E6%AF%8F%E4%B8%AAso%E6%96%87%E4%BB%B6%E9%83%BD%E5%8D%A0%E4%BA%864%E4%B8%AA%E8%A1%A8%E9%A1%B9%E3%80%82%E6%88%91%E4%B8%80%E5%BA%A6%E4%BB%A5%E4%B8%BA%E8%BF%994%E4%B8%AA%E8%A1%A8%E9%A1%B9%E9%83%BD%E6%98%AF%E5%90%8C%E6%A0%B7%E7%9A%84%E4%B8%9C%E8%A5%BF%E3%80%82%E4%BD%86%E5%A6%82%E4%B8%8A%E5%9B%BE%E6%89%80%E7%A4%BA%2C%E8%BF%99%E6%AF%8F%E4%B8%80%E6%AE%B5%E5%AE%9E%E9%99%85%E6%98%AF%E5%8A%A8%E6%80%81%E5%BA%93%E8%A2%AB%E5%8A%A0%E8%BD%BD%E7%94%9F%E6%88%90%E7%9A%84%E6%AE%B5%EF%BC%8C%E6%AF%8F%E4%B8%80%E6%AE%B5%E6%9C%89%E4%B8%8D%E5%90%8C%E7%9A%84%E5%86%85%E5%AE%B9%E5%92%8C%E4%B8%8D%E5%90%8C%E7%9A%84%E6%9D%83%E9%99%90%E6%A0%87%E8%AE%B0%E3%80%82%E8%80%8C%E6%88%91%E4%BB%AC%E5%85%B3%E5%BF%83%E7%9A%84%E5%92%8C%E5%87%BD%E6%95%B0%E8%B7%B3%E8%BD%AC%E7%9B%B8%E5%85%B3%E7%9A%84PLT%26GOT%E6%95%B0%E6%8D%AE%E5%9C%A8%E8%BF%99%E9%87%8C%EF%BC%9A%0A%60%60%60%0A0000003434551000%20%20%20%20%20%204K%20rw---%20%20%2Flib64%2Flibc-2.5.so%20%20%20%20%20%3C--%20.got.plt%20.data%20sections%0A%60%60%60%0A%23%23%20PLT%20%26%20GOT%0APLT%20%3D%20Procedure%20Linkage%20Table%0AGOT%20%3D%20Global%20Offsets%20Table%0APLT%E8%A1%A8%E6%90%AD%E9%85%8DGOT%E8%A1%A8%E5%B0%B1%E5%8F%AF%E4%BB%A5%E5%AE%8C%E6%88%90%E5%8A%A8%E6%80%81%E5%BA%93%E5%87%BD%E6%95%B0%E7%9A%84%E9%87%8D%E5%AE%9A%E5%90%91%E3%80%82%0A%E5%BD%93%E7%BC%96%E8%AF%91%E6%97%B6%EF%BC%8C%E5%9C%A8%E9%93%BE%E6%8E%A5%E9%98%B6%E6%AE%B5%EF%BC%8C%E7%BC%96%E8%AF%91%E5%99%A8%E4%BC%9A%E6%9F%A5%E6%89%BE%E5%87%BD%E6%95%B0%E5%AE%9A%E4%B9%89%EF%BC%8C%E5%A6%82%E6%9E%9C%E5%9C%A8%E6%89%80%E6%9C%89%E7%9A%84%E5%8F%AF%E9%87%8D%E5%AE%9A%E5%90%91%E4%BB%A3%E7%A0%81%E4%B8%AD%EF%BC%8C%E5%8D%B3.o%E3%80%81.a%E6%96%87%E4%BB%B6%EF%BC%8C%E6%97%A0%E6%B3%95%E6%89%BE%E5%88%B0%E5%87%BD%E6%95%B0%E5%AE%9A%E4%B9%89%EF%BC%8C%E5%88%99%E4%BC%9A%E5%8E%BB%E9%93%BE%E6%8E%A5%E6%8C%87%E5%AE%9A%E7%9A%84%E5%8A%A8%E6%80%81%E5%BA%93.so%E6%96%87%E4%BB%B6%E4%B8%AD%E6%89%BE%E3%80%82%E8%BF%99%E9%87%8C%E6%9C%89%E4%B8%A4%E5%B1%82%E6%84%8F%E6%80%9D%EF%BC%9A%0A1.%20%E4%BC%9A%E4%BC%98%E5%85%88%E6%9F%A5%E6%89%BE%E6%9C%89%E5%87%BD%E6%95%B0%E5%AE%9A%E4%B9%89%E7%9A%84%EF%BC%8C%E4%B9%9F%E5%B0%B1%E6%98%AF%E8%AF%B4%E9%9D%99%E6%80%81%E5%BA%93%E6%88%96%E6%BA%90%E6%96%87%E4%BB%B6%E4%B8%AD%E5%AE%9A%E4%B9%89%E7%9A%84%E5%87%BD%E6%95%B0%E6%98%AF%E5%8F%AF%E4%BB%A5%E8%A6%86%E7%9B%96%E5%8A%A8%E6%80%81%E5%BA%93%E4%B8%AD%E5%87%BD%E6%95%B0%E7%9A%84%0A2.%20%E7%BC%96%E8%AF%91%E5%99%A8%E4%BC%9A%E4%B8%BA%E5%8A%A8%E6%80%81%E5%BA%93%E4%B8%AD%E5%87%BD%E6%95%B0%E7%94%9F%E6%88%90%E8%B7%B3%E8%BD%AC%E4%BB%A3%E7%A0%81%E3%80%82%E8%80%8C%E8%BF%99%E4%B8%AA%E8%B7%B3%E8%BD%AC%E4%BB%A3%E7%A0%81%E5%B0%B1%E6%98%AFPLT%E8%A1%A8%0A%0A%E5%8F%AF%E4%BB%A5%E7%94%A8%60objdump%20-M%20intel%20-dj%20.plt%20a.out%60%E5%91%BD%E4%BB%A4%E6%9F%A5%E7%9C%8BPLT%E8%A1%A8%E5%85%B7%E4%BD%93%E5%8F%8D%E7%BC%96%E8%AF%91%E4%BB%A3%E7%A0%81%EF%BC%8C%E4%BE%8B%E5%A6%82%EF%BC%9A%0A!%5B0cedb50bdb3533f742e00a36b7e1ecc7.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6383)%0A%E4%B8%80%E4%B8%AAPLT%E8%A1%A8%E9%A1%B9%E5%B0%B1%E6%98%AF3%E6%9D%A1%E6%B1%87%E7%BC%96%E8%AF%AD%E5%8F%A5%2C%E5%85%B6%E6%B5%81%E7%A8%8B%E5%B0%B1%E6%98%AF%E4%B8%8B%E5%9B%BE%E4%B8%AD%E7%9A%841-9%0A!%5B72a1cbeb63b77c76658f39d3659009d0.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6384)%0A-%20%E7%AC%AC%E4%B8%80%E6%9D%A1%E6%B1%87%E7%BC%96%E8%AF%AD%E5%8F%A5%EF%BC%8C%E5%B0%B1%E6%98%AF%E8%B7%B3%E8%BD%AC%E5%88%B0GOT%E5%AF%B9%E5%BA%94%E8%A1%A8%E9%A1%B9%EF%BC%8C%E5%BD%93%E8%AF%A5%E8%A1%A8%E9%A1%B9%E5%B0%9A%E6%9C%AA%E8%A2%AB%E5%A1%AB%E5%85%85%E6%97%B6%EF%BC%88%E5%87%BD%E6%95%B0%E7%AC%AC%E4%B8%80%E6%AC%A1%E8%A2%AB%E8%B0%83%E7%94%A8%EF%BC%89%EF%BC%8CGOT%E8%A1%A8%E9%A1%B9%E4%BC%9A%E9%87%8D%E6%96%B0%E8%B7%B3%E5%9B%9E%E5%88%B0PLT%E8%A1%A8%E9%A1%B9%E7%9A%84%E4%B8%8B%E4%B8%80%E6%9D%A1%E6%B1%87%E7%BC%96%0A-%20%E7%AC%AC%E4%BA%8C%E6%9D%A1%E6%B1%87%E7%BC%96%E8%AF%AD%E5%8F%A5%EF%BC%8C%E5%B0%86%E5%87%BD%E6%95%B0%E7%BC%96%E5%8F%B7push%E5%88%B0%E6%A0%88%E4%B8%8A%EF%BC%8C%E6%AD%A4%E6%97%B6%E6%98%AF%E5%87%86%E5%A4%87%E4%B8%80%E6%AC%A1%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%0A-%20%E7%AC%AC%E4%B8%89%E6%9D%A1%E6%B1%87%E7%BC%96%E8%AF%AD%E5%8F%A5%EF%BC%8C%E8%B7%B3%E8%BD%AC%E5%88%B0PLT%E8%A1%A8%E5%BC%80%E5%A7%8B%E7%9A%84%E5%9C%B0%E6%96%B9%E3%80%82PLT%E7%AC%AC%E4%B8%80%E4%B8%AA%E8%A1%A8%E9%A1%B9%E6%8C%87%E5%90%91%E7%9A%84%E6%98%AF_dl_runtime_resolve%E5%87%BD%E6%95%B0%EF%BC%8C%E8%AF%A5%E5%87%BD%E6%95%B0%E4%BC%9A%E6%89%BE%E5%88%B0%E4%B9%8B%E5%89%8D%E4%BC%A0%E5%85%A5%E7%9A%84%E5%87%BD%E6%95%B0%E7%BC%96%E5%8F%B7%E5%AF%B9%E5%BA%94%E7%9A%84%E5%87%BD%E6%95%B0%E5%9C%B0%E5%9D%80%EF%BC%8C%E5%B9%B6%E5%A1%AB%E5%85%85%E5%AF%B9%E5%BA%94%E7%9A%84GOT%E8%A1%A8%E9%A1%B9%E3%80%82%0A%0A%E5%85%B3%E4%BA%8E%E5%87%BD%E6%95%B0%E7%BC%96%E5%8F%B7%EF%BC%8C%E4%B8%BE%E4%B8%AA%E4%BE%8B%E5%AD%90%EF%BC%8C%E8%A7%A3%E9%87%8A%E4%B8%80%E4%B8%8B%EF%BC%9A%0A%60%60%60%0A%23include%20%3Cstdio.h%3E%0A%23include%20%3Cfcntl.h%3E%0Aint%20func(void)%0A%7B%0A%20%20%20%20open(%22foo.txt%22%2C%20O_CREAT)%3B%0A%20%20%20%20fopen(%22foo.txt%22%2C%20%22rw%22)%3B%0A%20%20%20%20printf(%22hello%2C%20in%20test.so%5Cn%22)%3B%0A%20%20%20%20return%200%3B%0A%7D%0A%60%60%60%0A%E8%BF%99%E9%87%8C%E5%BC%95%E7%94%A8%E4%BA%86glibc%E9%87%8C%E7%9A%843%E4%B8%AA%E5%87%BD%E6%95%B0%EF%BC%8C%E7%94%A8readelf%20-r%E6%9F%A5%E7%9C%8B%EF%BC%8C%E5%88%99%E4%BC%9A%E5%BE%97%E5%88%B0%E4%B8%8B%E9%9D%A2%E7%9A%84%E7%BB%93%E6%9E%9C%EF%BC%9A%0A%60%60%60%0A%E9%87%8D%E5%AE%9A%E4%BD%8D%E8%8A%82%20'.rela.plt'%20at%20offset%200x508%20contains%203%20entries%3A%0A%20%20%E5%81%8F%E7%A7%BB%E9%87%8F%20%20%20%20%20%20%20%20%20%20%E4%BF%A1%E6%81%AF%20%20%20%20%20%20%20%20%20%20%20%E7%B1%BB%E5%9E%8B%20%20%20%20%20%20%20%20%20%20%20%E7%AC%A6%E5%8F%B7%E5%80%BC%20%20%20%20%20%20%20%20%E7%AC%A6%E5%8F%B7%E5%90%8D%E7%A7%B0%20%2B%20%E5%8A%A0%E6%95%B0%0A000000201018%20%20000200000007%20R_X86_64_JUMP_SLO%200000000000000000%20puts%40GLIBC_2.2.5%20%2B%200%0A000000201020%20%20000400000007%20R_X86_64_JUMP_SLO%200000000000000000%20open%40GLIBC_2.2.5%20%2B%200%0A000000201028%20%20000500000007%20R_X86_64_JUMP_SLO%200000000000000000%20fopen%40GLIBC_2.2.5%20%2B%200%0A%60%60%60%0A%E5%88%99puts%E5%AF%B9%E5%BA%94%E7%9A%84%E7%BC%96%E5%8F%B7%E5%B0%B1%E6%98%AF0%EF%BC%8Copen%E6%98%AF1%EF%BC%8Cfopen%E6%98%AF2%E3%80%82%E7%9C%8B%E7%9C%8BPLT%E8%A1%A8%EF%BC%9A%0A%60%60%60%0A000000000000580%20%3Cputs%40plt%3E%3A%0A%20580%3A%09ff%2025%2092%200a%2020%2000%20%20%20%20%09jmp%20%20%20%20QWORD%20PTR%20%5Brip%2B0x200a92%5D%20%20%20%20%20%20%20%20%23%20201018%20%3Cputs%40GLIBC_2.2.5%3E%0A%20586%3A%0968%2000%2000%2000%2000%20%20%20%20%20%20%20%09push%20%20%200x0%0A%2058b%3A%09e9%20e0%20ff%20ff%20ff%20%20%20%20%20%20%20%09jmp%20%20%20%20570%20%3C.plt%3E%0A%0A0000000000000590%20%3Copen%40plt%3E%3A%0A%20590%3A%09ff%2025%208a%200a%2020%2000%20%20%20%20%09jmp%20%20%20%20QWORD%20PTR%20%5Brip%2B0x200a8a%5D%20%20%20%20%20%20%20%20%23%20201020%20%3Copen%40GLIBC_2.2.5%3E%0A%20596%3A%0968%2001%2000%2000%2000%20%20%20%20%20%20%20%09push%20%20%200x1%0A%2059b%3A%09e9%20d0%20ff%20ff%20ff%20%20%20%20%20%20%20%09jmp%20%20%20%20570%20%3C.plt%3E%0A%0A00000000000005a0%20%3Cfopen%40plt%3E%3A%0A%205a0%3A%09ff%2025%2082%200a%2020%2000%20%20%20%20%09jmp%20%20%20%20QWORD%20PTR%20%5Brip%2B0x200a82%5D%20%20%20%20%20%20%20%20%23%20201028%20%3Cfopen%40GLIBC_2.2.5%3E%0A%205a6%3A%0968%2002%2000%2000%2000%20%20%20%20%20%20%20%09push%20%20%200x2%0A%205ab%3A%09e9%20c0%20ff%20ff%20ff%20%20%20%20%20%20%20%09jmp%20%20%20%20570%20%3C.plt%3E%0A%60%60%60%0A%E7%90%86%E8%A7%A3%E4%BA%86PLT%E5%92%8CGOT%E8%A1%A8%E5%9C%A8%E8%A7%A3%E6%9E%90%E5%87%BD%E6%95%B0%E5%9C%B0%E5%9D%80%E4%B8%AD%E7%9A%84%E4%BD%9C%E7%94%A8%EF%BC%8C%E5%B0%B1%E5%8F%AF%E4%BB%A5%E7%9D%80%E6%89%8B%E4%BF%AE%E6%94%B9GOT%E8%A1%A8%EF%BC%8C%E8%AE%A9%E5%87%BD%E6%95%B0%E8%B7%B3%E8%BD%AC%E5%88%B0%E6%88%91%E4%BB%AC%E5%B8%8C%E6%9C%9B%E7%9A%84%E5%87%BD%E6%95%B0%E6%89%A7%E8%A1%8C%E3%80%82%0A%23%23%20%E6%9B%BF%E6%8D%A2GOT%E8%A1%A8%E9%A1%B9%0A%E6%AD%A3%E5%A6%82%E5%89%8D%E6%96%87%E6%89%80%E8%AF%B4%EF%BC%8C%E8%A6%81%E5%81%9A%E8%BF%99%E4%B8%AA%E6%9B%BF%E6%8D%A2%E7%9A%84%E6%93%8D%E4%BD%9C%EF%BC%8C%E5%B0%B1%E6%98%AF%E8%A6%81%E6%89%BE%E5%88%B0GOT%E8%A1%A8%E5%AF%B9%E5%BA%94%E7%9A%84%E8%A1%A8%E9%A1%B9%E5%9C%A8%E5%93%AA%E9%87%8C%EF%BC%8C%E7%84%B6%E5%90%8E%E4%BF%AE%E6%94%B9%E5%AF%B9%E5%BA%94%E7%9A%84%E5%87%BD%E6%95%B0%E5%9C%B0%E5%9D%80%E5%8D%B3%E5%8F%AF%E3%80%82%E8%BF%99%E6%B6%89%E5%8F%8A%E5%88%B0%E8%A7%A3%E6%9E%90%E5%86%85%E5%AD%98%E4%B8%AD%E7%9A%84%E7%A8%8B%E5%BA%8Felf%E6%A0%BC%E5%BC%8F%E7%9A%84%E9%95%9C%E5%83%8F%E3%80%82%0A%23%23%23%20dynamic%20section%0A%E6%89%80%E6%9C%89%E5%92%8C%E9%87%8D%E5%AE%9A%E5%90%91%E6%9C%89%E5%85%B3%E7%9A%84%E4%BF%A1%E6%81%AF%E9%83%BD%E5%8C%85%E5%90%AB%E5%9C%A8dynamic%20section%E4%B8%AD%EF%BC%8C%E5%9C%A8elf%E7%9A%84execution%20view%E4%B8%AD%EF%BC%8C%E4%B9%9F%E5%8F%AF%E4%BB%A5%E7%A7%B0%E4%BD%9Cdynamic%20segment%E3%80%82%E5%AE%9E%E9%99%85%E4%B8%8A%EF%BC%8C%E8%BF%99%E4%B8%A4%E8%80%85%E6%98%AF%E5%90%8C%E4%B8%80%E4%B8%AA%E4%B8%9C%E8%A5%BF%EF%BC%8C%E5%8F%AA%E6%98%AF%E5%AD%98%E5%9C%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E4%B8%8D%E5%90%8C%E3%80%82%E5%BD%93%E7%84%B6%EF%BC%8C%E5%9B%A0%E4%B8%BA%E6%88%91%E4%BB%AC%E8%A6%81%E5%81%9A%E7%9A%84%E6%98%AF%E5%8A%A8%E6%80%81%E7%9A%84GOT%E4%BF%AE%E6%94%B9%EF%BC%8C%E6%89%80%E4%BB%A5%E6%88%91%E4%BB%AC%E8%A6%81%E6%89%BE%E5%88%B0dynamic%20segment%E5%9C%A8%E5%86%85%E5%AD%98%E4%B8%AD%E7%9A%84%E4%BD%8D%E7%BD%AE%E3%80%82%0A%E7%94%B1%E5%89%8D%E6%96%87%E5%8F%AF%E7%9F%A5%EF%BC%8C%E8%A6%81%E5%9C%A8execution%20view%E4%B8%AD%E6%9F%A5%E6%89%BE%E6%AE%B5%EF%BC%8C%E5%BA%94%E8%AF%A5%E8%A6%81%E7%94%A8%E5%88%B0Programm%20Header%20Table%EF%BC%88PHT%EF%BC%89%E3%80%82%E9%80%9A%E8%BF%87%60objdump%20-x%60%E5%91%BD%E4%BB%A4%E5%8F%AF%E4%BB%A5%E6%9F%A5%E7%9C%8BPHT%E8%A1%A8%E9%A1%B9%E3%80%82%E5%85%B6%E4%B8%AD%E6%88%91%E4%BB%AC%E5%85%B3%E5%BF%83%E7%9A%84%E5%B0%B1%E6%98%AFDYNAMIC%E6%AE%B5%E3%80%82%E5%AE%83%E5%8C%85%E5%90%AB%E4%BA%86%E6%89%80%E6%9C%89dynamic%20section%E7%9A%84%E4%BF%A1%E6%81%AF%E3%80%82%E4%BB%A3%E7%A0%81%E9%87%8C%E9%9D%A2%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%A6%82%E4%B8%8B%E7%9A%84%E8%8E%B7%E5%BE%97dynamic%E3%80%82%0A%60%60%60%20c%0A%2F%2F%201.%20%E9%80%9A%E8%BF%87%2Fproc%2F%3Cpid%3E%2Fmaps%E5%BE%97%E5%88%B0elf%E5%8A%A0%E8%BD%BD%E7%9A%84%E5%9C%B0%E5%9D%80%0A%20%20%20%20snprintf(filename%2C%20sizeof(filename)%2C%20%22%2Fproc%2F%25d%2Fmaps%22%2C%20pid)%3B%0A%0A%20%20%20%20%2F%2F%20%E6%89%93%E5%BC%80%E6%96%87%E4%BB%B6%2Fproc%2Fpid%2Fmaps%EF%BC%8C%E8%8E%B7%E5%8F%96%E6%8C%87%E5%AE%9Apid%E8%BF%9B%E7%A8%8B%E5%8A%A0%E8%BD%BD%E7%9A%84%E5%86%85%E5%AD%98%E6%A8%A1%E5%9D%97%E4%BF%A1%E6%81%AF%0A%20%20%20%20fp%20%3D%20fopen(filename%2C%20%22r%22)%3B%0A%20%20%20%20if(fp%20!%3D%20NULL)%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20%E6%AF%8F%E6%AC%A1%E4%B8%80%E8%A1%8C%EF%BC%8C%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6%20%2Fproc%2Fpid%2Fmaps%E4%B8%AD%E5%86%85%E5%AE%B9%0A%20%20%20%20%20%20%20%20while(fgets(line%2C%20sizeof(line)%2C%20fp))%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E6%9F%A5%E6%89%BE%E6%8C%87%E5%AE%9A%E7%9A%84so%E6%A8%A1%E5%9D%97%0A%20%20%20%20%20%20%20%20%20%20%20%20if(strstr(line%2C%20module_name))%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E5%88%86%E5%89%B2%E5%AD%97%E7%AC%A6%E4%B8%B2%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pch%20%3D%20strtok(line%2C%20%22-%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E9%95%BF%E6%95%B4%E5%BD%A2%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20addr%20%3D%20strtoul(pch%2C%20NULL%2C%2016)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20fclose(fp)%3B%0A%20%20%0A%2F%2F%202.%20%E9%80%9A%E8%BF%87%E9%81%8D%E5%8E%86program%20header%20table%EF%BC%8C%E6%89%BE%E5%88%B0dynameic%E6%AE%B5%0A%20%20%20%20unsigned%20long%20long%20dynamicAddr%20%3D%200%3B%0A%20%20%20%20unsigned%20int%20dynamicSize%20%3D%200%3B%0A%20%20%20%20int%20j%20%3D%200%3B%0A%20%20%20%20for%20(j%20%3D%200%3B%20j%20%3C%20phdr_count%3B%20j%2B%2B)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20if%20(phdr_table%5Bj%5D.p_type%20%3D%3D%20PT_DYNAMIC)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20dynamicAddr%20%3D%20phdr_table%5Bj%5D.p_vaddr%20%2B%20(uint64_t)base_addr%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20dynamicSize%20%3D%20phdr_table%5Bj%5D.p_memsz%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%60%60%60%0A%23%23%23%20relocation%20tables%0A%E9%80%9A%E8%BF%87%60objdump%20-h%60%E5%91%BD%E4%BB%A4%E5%8F%AF%E4%BB%A5%E6%9F%A5%E7%9C%8B%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E7%9A%84section%E3%80%82%E5%92%8Crelocation%E7%9B%B8%E5%85%B3%E7%9A%84%E8%8A%82%E6%9C%89%EF%BC%9A%0A-%20.got%0A-%20.got.plt%0A-%20.plt%0A-%20rel(a).dyn%0A-%20rel(a).plt%0A-%20%E5%85%B6%E4%BB%96rel(a).xxx%E8%8A%82%0A%E5%88%9A%E5%BC%80%E5%A7%8B%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E8%BF%99%E4%BA%9B%E7%B1%BB%E4%BC%BC%E7%9A%84%E8%8A%82%E5%90%8D%E5%BE%88%E5%AE%B9%E6%98%93%E8%AE%A9%E4%BA%BA%E6%B7%B7%E6%B7%86%E3%80%82%E5%85%B6%E5%AE%9E%E5%92%8C%E6%88%91%E4%BB%AC%E7%9B%AE%E6%A0%87%E7%9C%9F%E6%AD%A3%E7%9B%B8%E5%85%B3%E7%9A%84%E6%98%AFrel(a).plt%E3%80%82%E5%85%B6%E4%BB%96%E7%9A%84%E8%AE%A9%E6%88%91%E4%BE%9D%E6%AC%A1%E6%BE%84%E6%B8%85%E4%B8%80%E4%B8%8B%E3%80%82%E4%B8%8D%E8%BF%87%E9%83%BD%E6%98%AF%E6%88%91%E4%B8%AA%E4%BA%BA%E7%9A%84%E7%90%86%E8%A7%A3%EF%BC%8C%E5%8F%AF%E8%83%BD%E6%9C%89%E5%81%8F%E9%A2%87%E4%B9%8B%E5%A4%84%E3%80%82%0A%E5%85%88%E7%94%A8%60readelf%20-S%60%E6%9F%A5%E7%9C%8B%E4%B8%80%E4%B8%8Bsection%20header%20table%E3%80%82%0A!%5B019332646fc3af113a870a76896c8b89.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6385)%0A.plt%E5%92%8C.plt.got%E4%BB%A5%E5%8F%8A.got%E5%92%8C.got.plt%E9%83%BD%E6%98%AFPROGBITS%E7%B1%BB%E5%9E%8B%E3%80%82%E5%85%B3%E4%BA%8EPROGBITS%E7%B1%BB%E5%9E%8B%E7%9A%84%E8%A7%A3%E9%87%8A%E6%98%AF%EF%BC%9A%0A%3E%20**PROGBITS**%20is%20stored%20in%20the%20disk%20image%2C%20as%20opposed%20to%20allocated%20and%20initialized%20at%20load.%0A%3E%20%E8%8A%82%E5%8C%BA%E7%B1%BB%E5%9E%8B%EF%BC%9APROGBITS-%E7%A8%8B%E5%BA%8F%E5%AE%9A%E4%B9%89%E7%9A%84%E4%BF%A1%E6%81%AF%EF%BC%8CNOBITS-%E4%B8%8D%E5%8D%A0%E7%94%A8%E6%96%87%E4%BB%B6%E7%A9%BA%E9%97%B4(bss)%2CREL-%E9%87%8D%E5%AE%9A%E4%BD%8D%E8%A1%A8%E9%A1%B9%0A%0A%E5%AF%B9%E4%BA%8E%E5%90%84%E8%8A%82%E5%8C%BA%EF%BC%8C%5B2%5D%E4%B8%AD%E7%9A%84%E8%A7%A3%E9%87%8A%E4%B8%BA%EF%BC%9A%0A-%20.plt%3A%09For%20dynamic%20binaries%2C%20this%20Procedure%20Linkage%20Table%20holds%20the%20trampoline%2Flinkage%20code.%20See%20paragraphs%20below.%0A-%20.got%3A%09For%20dynamic%20binaries%2C%20this%20Global%20Offset%20Table%20holds%20the%20addresses%20of%20variables%20which%20are%20relocated%20upon%20loading.%0A-%20.got.plt%3A%09For%20dynamic%20binaries%2C%20this%20Global%20Offset%20Table%20holds%20the%20addresses%20of%20functions%20in%20dynamic%20libraries.%20They%20are%20used%20by%20trampoline%20code%20in%20.plt%20section.%0A%0A%E5%AF%B9%E4%BA%8E.plt.got%E5%8C%BA%E7%BD%91%E4%B8%8A%E6%90%9C%E5%88%B0%E7%9A%84%E8%A7%A3%E9%87%8A%E6%98%AF%EF%BC%9A%0A-%20This%20just%20seems%20to%20contain%20code%20to%20jump%20to%20the%20first%20entry%20of%20the%20.got.%0A%0A%E8%BF%99%E9%87%8C%E5%BE%88%E5%AE%B9%E6%98%93%E8%AE%A9%E4%BA%BA%E6%9C%89%E5%BE%88%E6%B7%B7%E4%B9%B1%E7%9A%84%E6%84%9F%E8%A7%89%EF%BC%8C%E5%8F%88%E6%98%AF.got.plt%E7%9A%84%2C%20%E5%8F%88%E6%98%AF.plt.got%E7%9A%84%E3%80%82%E7%BD%91%E7%BB%9C%E4%B8%8A%E4%B9%9F%E5%BE%88%E9%9A%BE%E6%9F%A5%E5%88%B0%E4%B8%A4%E8%80%85%E4%B9%8B%E9%97%B4%E7%9A%84%E8%81%94%E7%B3%BB%E5%92%8C%E5%8C%BA%E5%88%AB%E3%80%82%E6%A0%B9%E6%8D%AE%E6%88%91%E4%B8%AA%E4%BA%BA%E7%9A%84%E5%AE%9E%E9%AA%8C%E7%BB%8F%E9%AA%8C%EF%BC%8C%E5%90%8E%E6%96%87%E5%B0%9D%E8%AF%95%E8%A7%A3%E9%87%8A%E4%B8%80%E4%B8%8B%E3%80%82%E5%85%88%E5%AF%B9%E8%BF%99%E5%87%A0%E4%B8%AA%E8%8A%82%E5%8C%BA%E5%81%9A%E4%B8%80%E4%B8%AA%E6%80%BB%E7%BB%93%E3%80%82%0A-%20%E8%BF%994%E4%B8%AA%E9%83%BD%E6%98%AF%E7%BC%96%E8%AF%91%E6%97%B6%E5%86%B3%E5%AE%9A%E7%9A%84%EF%BC%8C%E8%8A%82%E7%B1%BB%E5%9E%8B%E9%83%BD%E6%98%AFPROGBITS%E3%80%82%E4%BF%A1%E6%81%AF%E9%83%BD%E6%98%AF%E5%AD%98%E5%9C%A8%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E9%87%8C%EF%BC%8C%E8%80%8Cruntime%E5%8F%AF%E7%94%A8%E7%9A%84%E4%BF%A1%E6%81%AF%E9%83%BD%E6%98%AF%E9%80%9A%E8%BF%87%E9%87%8D%E5%AE%9A%E5%90%91%E5%BE%97%E5%88%B0%E7%9A%84%EF%BC%8C%E5%8D%B3%E9%80%9A%E8%BF%87rel(a).xxx%E8%8A%82%E5%8C%BA%E8%8E%B7%E5%BE%97%E7%9A%84%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80%E4%B8%AD%E5%AD%98%E5%82%A8%E7%9A%84%E6%95%B0%E6%8D%AE%0A-%20%E6%89%80%E6%9C%89%E4%BB%A5.plt%E5%BC%80%E5%A4%B4%E7%9A%84%E8%8A%82%E5%8C%BA%EF%BC%8C%E9%83%BD%E6%98%AF%E4%B8%80%E4%BA%9B%E8%B7%B3%E6%9D%BF%E4%BB%A3%E7%A0%81%E3%80%82%0A-%20%E6%89%80%E6%9C%89%E4%BB%A5.got%E5%BC%80%E5%A4%B4%E7%9A%84%E8%8A%82%E5%8C%BA%EF%BC%8C%E9%83%BD%E6%98%AF%E4%B8%80%E4%BA%9B%E6%95%B0%E6%8D%AE%EF%BC%8C%E5%AD%98%E5%82%A8%E7%9D%80%E8%BF%99%E4%BA%9B%E5%87%BD%E6%95%B0%E8%A2%ABresolve%E5%90%8E%E6%9C%80%E7%BB%88%E7%9A%84%E5%9C%B0%E5%9D%80%E3%80%82%0A-%20.plt%E5%BC%80%E5%A4%B4%E8%A1%A8%E9%A1%B9%E7%9A%84%E8%B7%B3%E6%9D%BF%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%B0%B1%E6%98%AF%E8%B7%B3%E8%BD%AC%E5%88%B0%E5%AF%B9%E5%BA%94%E7%9A%84.got%E8%A1%A8%E9%A1%B9%E4%B8%AD%E5%86%B3%E5%AE%9A%E6%9C%80%E7%BB%88%E7%9A%84%E6%89%A7%E8%A1%8C%E5%9C%B0%E5%9D%80%E3%80%82%0A%60%60%60x86asm%0A%23%20table%20of%20a%20dynamic%20library%20(.so)%0A%20%20%5B10%5D%20.plt%20%20%20%20%20%20%20%20%20%20%20%20%20%20PROGBITS%20%20%20%20%20%20%20%20%200000000000000610%20%2000000610%0A%20%20%5B11%5D%20.plt.got%20%20%20%20%20%20%20%20%20%20PROGBITS%20%20%20%20%20%20%20%20%200000000000000640%20%2000000640%0A%20%20%5B20%5D%20.got%20%20%20%20%20%20%20%20%20%20%20%20%20%20PROGBITS%20%20%20%20%20%20%20%20%200000000000200fc0%20%2000000fc0%0A%20%20%5B21%5D%20.got.plt%20%20%20%20%20%20%20%20%20%20PROGBITS%20%20%20%20%20%20%20%20%200000000000201000%20%2000001000%0A%60%60%60%0A%0A%23%23%23%23%20.plt%20vs%20.plt.got%0A%E5%85%88%E4%B8%8A2%E4%B8%AA%E4%BE%8B%E5%AD%90%EF%BC%8C%E5%88%86%E5%88%AB%E6%98%AF.plt%E5%92%8C.plt.got%E8%8A%82%E7%9A%84%E3%80%82%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%87%BA%EF%BC%8C%E8%BF%992%E4%B8%AA%E8%8A%82%E9%83%BD%E6%98%AF%E4%B8%80%E4%BA%9B%E8%B7%B3%E8%BD%AC%E4%BB%A3%E7%A0%81%E3%80%82%E6%8C%89%E7%85%A7%E5%89%8D%E6%96%87%E7%9A%84%E8%A7%A3%E9%87%8A%EF%BC%8C.plt%E8%8A%82%E8%A1%A8%E9%A1%B9%E5%B0%B1%E6%98%AF%E9%9C%80%E8%A6%81%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E7%9A%84%E4%B8%80%E4%BA%9B%E5%87%BD%E6%95%B0%E7%9A%84%E8%B7%B3%E6%9D%BF%E4%BB%A3%E7%A0%81%E3%80%82%E8%B7%B3%E8%BD%AC%E4%BB%A3%E7%A0%81%E7%9A%84%E7%9B%AE%E7%9A%84%E5%9C%B0%E6%98%AFGOT%E8%A1%A8%E9%A1%B9%E3%80%82%E7%84%B6%E5%90%8E%E9%80%9A%E8%BF%87runtime%20linker%EF%BC%88ld.so)%E6%9D%A5%E5%AE%8C%E6%88%90%E5%87%BD%E6%95%B0%E5%9C%B0%E5%9D%80%E7%9A%84%E8%A7%A3%E6%9E%90%E3%80%82%0A.plt.got%E7%9A%84%E5%86%85%E5%AE%B9%E4%B8%8E.plt%E9%9D%9E%E5%B8%B8%E7%B1%BB%E4%BC%BC%EF%BC%8C%E4%B9%9F%E6%98%AF%E4%B8%80%E4%BA%9B%E8%B7%B3%E6%9D%BF%E4%BB%A3%E7%A0%81%E3%80%82%E8%80%8C%E4%B8%94jmpq%E6%8C%87%E4%BB%A4%E5%90%8E%EF%BC%8C%E6%B2%A1%E6%9C%89push%E6%8C%87%E4%BB%A4%E5%92%8C%E5%8F%A6%E4%B8%80%E6%9D%A1jmpq%E6%8C%87%E4%BB%A4%E3%80%82%E8%BF%99%E4%B8%AA%E8%8A%82%E5%92%8C.plt%E8%8A%82%E5%88%B0%E5%BA%95%E6%9C%89%E5%95%A5%E5%8C%BA%E5%88%AB%EF%BC%9F%E5%95%A5%E6%97%B6%E5%80%99%E4%BC%9A%E7%94%A8%E5%88%B0%E8%AF%A5%E8%8A%82%E7%9A%84%E8%B7%B3%E8%BD%AC%E6%8C%87%E4%BB%A4%EF%BC%9F%0A%60%60%60armasm%0A%23%20.plt%E8%8A%82%E4%B8%BE%E4%BE%8B%0A00000000000008c0%20%3Cfopen%40plt%3E%3A%0A%208c0%3A%09ff%2025%20ea%2016%2020%2000%20%20%20%20%09jmpq%20%20%20*0x2016ea(%25rip)%20%20%20%20%20%20%20%20%23%20201fb0%20%3Cfopen%40GLIBC_2.2.5%3E%0A%208c6%3A%0968%2009%2000%2000%2000%20%20%20%20%20%20%20%09pushq%20%20%240x9%0A%208cb%3A%09e9%2050%20ff%20ff%20ff%20%20%20%20%20%20%20%09jmpq%20%20%20820%20%3C.plt%3E%0A%0A%0A%23%20.plt.got%E8%8A%82%E4%B8%BE%E4%BE%8B%0A00000000000005d0%20%3Cfopen%40plt%3E%3A%0A%205d0%3A%09ff%2025%2012%200a%2020%2000%20%20%20%20%09jmpq%20%20%20*0x200a12(%25rip)%20%20%20%20%20%20%20%20%23%20200fe8%20%3Cfopen%40GLIBC_2.2.5%3E%0A%205d6%3A%0966%2090%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09xchg%20%20%20%25ax%2C%25ax%0A%60%60%60%0A%E7%BB%8F%E8%BF%87%E6%88%91%E7%9A%84%E5%AE%9E%E9%AA%8C%E5%8F%91%E7%8E%B0%EF%BC%8C%E5%BD%93%E5%8F%91%E7%94%9F%E7%B1%BB%E4%BC%BC%E8%BF%99%E7%A7%8D%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88%E8%B5%8B%E5%80%BC%E6%97%B6%EF%BC%8C%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%87%BD%E6%95%B0%E5%B0%B1%E4%BC%9A%E5%87%BA%E7%8E%B0%E5%9C%A8.plt.got%E8%8A%82%EF%BC%8C%E5%90%8C%E6%97%B6.plt%E8%8A%82%E4%B8%AD%E5%B0%B1%E4%B8%8D%E5%86%8D%E5%8C%85%E5%90%AB%E8%BF%99%E4%B8%AA%E5%87%BD%E6%95%B0%E3%80%82%0A%60%60%60c%0AFuncPuts%20old_puts%20%3D%20NULL%3B%0Aold_puts%20%3D%20puts%3B%20%2F%2F%20puts%20as%20a%20function%20pointer%2C%20assigned%20to%20a%20variable%0A%60%60%60%0A%E5%BD%93%E5%87%BD%E6%95%B0%E4%B8%8D%E5%9C%A8.plt%E8%8A%82%E6%97%B6%EF%BC%8C%E5%87%BD%E6%95%B0%E7%9A%84%E8%B7%B3%E8%BD%AC%E5%8F%98%E6%88%90%E9%9D%99%E6%80%81%E7%9A%84%E4%BA%86%E3%80%82%E7%94%A8%60objdump%20-S%60%E5%AF%B9%E7%85%A7%E6%B1%87%E7%BC%96%E5%92%8C%E6%BA%90%E7%A0%81%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%8F%91%E7%8E%B0%EF%BC%8C%E5%AF%B9%E6%AD%A4%E7%B1%BB%E5%87%BD%E6%95%B0%E7%9A%84%E8%B0%83%E7%94%A8%E5%B0%B1%E6%98%AF%E8%B7%B3%E8%BD%AC%E5%88%B0%E5%AF%B9%E5%BA%94%E7%9A%84.plt.got%E8%A1%A8%E9%A1%B9%E3%80%82%0A%60%60%60x86asm%0Aputs(%22hello%22)%3B%0A%20751%3A%20%20%2048%208d%203d%208c%2000%2000%2000%20%20%20%20lea%20%20%20%200x8c(%25rip)%2C%25rdi%20%20%20%20%20%20%20%20%23%207e4%20%3C_fini%2B0x14%3E%0A%20758%3A%20%20%20e8%20e3%20fe%20ff%20ff%20%20%20%20%20%20%20%20%20%20callq%20%20640%20%3Cputs%40plt%3E%0A%20%0A%20%23%20%E5%AF%B9%E5%BA%94%E7%9A%84.plt.got%E8%A1%A8%E9%A1%B9%0A%200000000000000640%20%3Cputs%40plt%3E%3A%0A%20640%3A%20%20%20ff%2025%2082%2009%2020%2000%20%20%20%20%20%20%20jmpq%20%20%20*0x200982(%25rip)%20%20%20%20%20%20%20%20%23%20200fc8%20%3Cputs%40GLIBC_2.2.5%3E%0A%20646%3A%20%20%2066%2090%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20xchg%20%20%20%25ax%2C%25ax%20%0A%60%60%60%0A%3E%20**%E6%B3%A8**%3A%20%60xchg%20%25ax%2C%20%25ax%60%E6%98%AF%E4%B8%80%E6%9D%A1NOP%E6%8C%87%E4%BB%A4%EF%BC%8C%E5%8F%82%E7%9C%8B%5BWhy%20does%20Visual%20Studio%20use%20xchg%20ax%2Cax%5D(https%3A%2F%2Fstackoverflow.com%2Fquestions%2F2136043%2Fwhy-does-visual-studio-use-xchg-ax-ax)%0A%0A%E5%BD%93%E5%8F%AA%E6%9C%89.plt.got%E5%8C%85%E5%90%AB%E8%AF%A5%E5%87%BD%E6%95%B0%E8%A1%A8%E9%A1%B9%E6%97%B6%EF%BC%8C%E6%88%91%E4%BB%AC%E7%9A%84GOT%E6%9B%BF%E6%8D%A2%E9%AD%94%E6%B3%95%E5%B0%B1%E5%A4%B1%E6%95%88%E4%BA%86%E3%80%82%E6%89%80%E4%BB%A5%E5%A6%82%E6%9E%9C%E6%83%B3%E4%BF%9D%E5%AD%98%E5%8E%9F%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88%EF%BC%8C%E6%AD%A3%E7%A1%AE%E7%9A%84%E5%81%9A%E6%B3%95%E5%BA%94%E5%BD%93%E6%98%AF%EF%BC%9A%0A%60%60%60c%0A%2F%2F%20Don't%20do%20like%20this.%0A%2F%2F%20It%20will%20kick%20puts%20from%20.plt%20and%20put%20it%20into%20.plt.got.%0A%2F%2F%20We%20might%20not%20be%20able%20to%20substitute%20its%20address%20via%20rel%20tables.%0A%2F%2F%20old_puts%20%3D%20puts%3B%20%0A%0A%2F%2F%20Below%20is%20RECOMMENDED!!!%0Aif%20(old_puts%20%3D%3D%20NULL)%20%7B%20%2F%2F%20save%20original%20libc%20function%20pointer%0A%20%20%20%20old_puts%20%3D%20(FuncPuts)*(uint64_t%20*)(rel_table%5Bi%5D.r_offset%20%2B%20base_addr)%3B%0A%7D%0A*(uint64_t%20*)(rel_table%5Bi%5D.r_offset%20%2B%20base_addr)%20%3D%20(uint64_t)my_puts%3B%0A%60%60%60%0A%0A%23%23%23%23%20.got%20vs%20.got.plt%0A%E6%8C%89%E7%85%A7%E5%89%8D%E6%96%87%E7%9A%84%E8%A7%A3%E9%87%8A%EF%BC%8C.got%E8%8A%82%E5%AD%98%E5%82%A8%E7%9A%84%E6%98%AF%E9%9C%80%E8%A6%81%E5%8A%A8%E6%80%81resolve%E7%9A%84%E5%8F%98%E9%87%8F%EF%BC%88%E5%BA%94%E5%BD%93%E6%98%AF%E5%8A%A8%E6%80%81%E5%BA%93%E4%B8%AD%E5%AE%9A%E4%B9%89%E7%9A%84%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%EF%BC%89%E3%80%82%E8%80%8C.got.plt%E6%98%AF%E5%AF%B9%E5%BA%94.plt%E8%8A%82%E7%9A%84%E5%87%BD%E6%95%B0%E5%9C%B0%E5%9D%80%E8%A1%A8%E9%A1%B9%E3%80%82%0A%E5%AE%9E%E9%99%85%E7%9A%84%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C%E6%98%AF%EF%BC%9A%0A-%20%E5%AF%B9%E4%BA%8E%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%EF%BC%8C.got.plt%E4%B8%8D%E5%AD%98%E5%9C%A8%EF%BC%8C%E8%80%8C.plt%E8%A1%A8%E9%A1%B9%E7%9B%B4%E6%8E%A5%E8%B7%B3%E8%BD%AC%E5%88%B0.got%E8%A1%A8%E9%A1%B9%E6%89%A7%E8%A1%8C%E3%80%82%E5%87%BD%E6%95%B0%E7%9A%84GOT%E8%A1%A8%E4%BD%8D%E7%BD%AE%EF%BC%88_GLOBAL_OFFSET_TABLE_%EF%BC%89%E5%9C%A80x201f50%0A%60%60%60x86asm%0A%3E%20objdump%20-d%20--section%3D.plt%20mytest%20%0A%0Amytest%EF%BC%9A%20%20%20%20%20%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%20elf64-x86-64%0A%0ADisassembly%20of%20section%20.plt%3A%0A%0A0000000000000820%20%3C.plt%3E%3A%0A%20820%3A%20%20%20ff%2035%2032%2017%2020%2000%20%20%20%20%20%20%20pushq%20%200x201732(%25rip)%20%20%20%20%20%20%20%20%23%20201f58%20%3C_GLOBAL_OFFSET_TABLE_%2B0x8%3E%0A%20826%3A%20%20%20ff%2025%2034%2017%2020%2000%20%20%20%20%20%20%20jmpq%20%20%20*0x201734(%25rip)%20%20%20%20%20%20%20%20%23%20201f60%20%3C_GLOBAL_OFFSET_TABLE_%2B0x10%3E%0A%2082c%3A%20%20%200f%201f%2040%2000%20%20%20%20%20%20%20%20%20%20%20%20%20nopl%20%20%200x0(%25rax)%0A%20%0A%20%3E%20objdump%20-d%20--section%3D.got%20mytest%20%20%20%20%0A%0Amytest%EF%BC%9A%20%20%20%20%20%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%20elf64-x86-64%0A%0ADisassembly%20of%20section%20.got%3A%0A%0A0000000000201f50%20%3C_GLOBAL_OFFSET_TABLE_%3E%3A%0A%20%20201f50%3A%20%20%20%20%20%20%2050%201d%2020%2000%2000%2000%2000%2000%2000%2000%2000%2000%2000%2000%2000%2000%0A%20%20%20%20%20%20%20%20...%0A%60%60%60%0A-%20%E5%AF%B9%E4%BA%8E%E4%B8%80%E4%B8%AA%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93%E6%96%87%E4%BB%B6%EF%BC%8C%E5%88%99%E5%A6%82%E5%89%8D%E6%96%87%E6%89%80%E8%BF%B0%E4%B8%80%E8%87%B4%EF%BC%8C%E5%8D%B3.got%E8%B4%9F%E8%B4%A3%E8%B7%B3%E8%BD%AC%E5%8F%98%E9%87%8F%EF%BC%8C%E8%80%8C.got.plt%E8%B4%9F%E8%B4%A3%E8%B7%B3%E8%BD%AC%E5%87%BD%E6%95%B0%E3%80%82%E5%87%BD%E6%95%B0%E7%9A%84GOT%E8%A1%A8%E4%BD%8D%E7%BD%AE%EF%BC%88_GLOBAL_OFFSET_TABLE_%EF%BC%89%E5%9C%A80x201000%0A%60%60%60x86asm%0A%3E%20objdump%20-d%20--section%3D.plt%20libtest.so%20%20%20%20%0A%0Alibtest.so%EF%BC%9A%20%20%20%20%20%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%20elf64-x86-64%0A%0ADisassembly%20of%20section%20.plt%3A%0A%0A0000000000000610%20%3C.plt%3E%3A%0A%20610%3A%20%20%20ff%2035%20f2%2009%2020%2000%20%20%20%20%20%20%20pushq%20%200x2009f2(%25rip)%20%20%20%20%20%20%20%20%23%20201008%20%3C_GLOBAL_OFFSET_TABLE_%2B0x8%3E%0A%20616%3A%20%20%20ff%2025%20f4%2009%2020%2000%20%20%20%20%20%20%20jmpq%20%20%20*0x2009f4(%25rip)%20%20%20%20%20%20%20%20%23%20201010%20%3C_GLOBAL_OFFSET_TABLE_%2B0x10%3E%0A%2061c%3A%20%20%200f%201f%2040%2000%20%20%20%20%20%20%20%20%20%20%20%20%20nopl%20%20%200x0(%25rax)%0A%0A%3E%20objdump%20-d%20--section%3D.got.plt%20libtest.so%20%20%20%20%0A%0Alibtest.so%EF%BC%9A%20%20%20%20%20%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%20elf64-x86-64%0A%0ADisassembly%20of%20section%20.got.plt%3A%0A%0A0000000000201000%20%3C_GLOBAL_OFFSET_TABLE_%3E%3A%0A%20%20201000%3A%20%20%20%20%20%20%2000%200e%2020%2000%2000%2000%2000%2000%2000%2000%2000%2000%2000%2000%2000%2000%20%0A%20%20%20%20%20%20%20%20...%0A%60%60%60%0A%E4%BD%86%E5%85%B6%E5%AE%9E%EF%BC%8C%E6%88%91%E4%BB%AC%E9%9C%80%E8%A6%81%E5%85%B3%E6%B3%A8%E7%9A%84%E6%98%AF%E9%87%8D%E5%AE%9A%E5%90%91%E7%9A%84%E8%A1%A8%E6%A0%BC%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E7%9B%B4%E6%8E%A5%E6%9F%A5%E7%9C%8B.got%E5%92%8C.got.plt%E8%8A%82%E5%8C%BA%E3%80%82%E5%90%8E%E6%96%87%E4%BC%9A%E8%BF%9B%E4%B8%80%E6%AD%A5%E8%A7%A3%E9%87%8A%E3%80%82%E8%80%8C%E5%9C%A8%E7%9C%9F%E6%AD%A3%E7%9A%84GOT%E8%A1%A8%E9%A1%B9%E6%9B%BF%E6%8D%A2%E4%B8%AD%EF%BC%8C%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E5%92%8C%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93%E5%B9%B6%E6%B2%A1%E6%9C%89%E8%A1%A8%E7%8E%B0%E5%87%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%E3%80%82%0A%23%23%23%20Rerwrite%20GOT%0A%E9%87%8D%E5%86%99GOT%E8%A1%A8%E9%A1%B9%E7%9A%84%E6%80%9D%E8%B7%AF%E5%B0%B1%E6%98%AF%E5%89%8D%E9%9D%A2%E8%AE%B2%E8%BF%B0%E7%9A%84PLT%2BGOT%E5%8A%A8%E6%80%81%E8%A7%A3%E6%9E%90%E5%87%BD%E6%95%B0%E5%9C%B0%E5%9D%80%E7%9A%84%E6%96%B9%E6%B3%95%E3%80%82%E8%80%8C%E8%A6%86%E5%86%99%E7%9A%84%E6%96%B9%E6%B3%95%E6%98%AF%E9%80%9A%E8%BF%87%E9%87%8D%E5%AE%9A%E5%90%91%E8%A1%A8%E6%A0%BC%E6%89%BE%E5%88%B0GOT%E8%A1%A8%EF%BC%8C%E5%B9%B6%E6%89%BE%E5%88%B0%E5%AF%B9%E5%BA%94%E7%9A%84%E8%A1%A8%E9%A1%B9%E7%B4%A2%E5%BC%95%EF%BC%8C%E4%BF%AE%E6%94%B9%E8%AF%A5%E7%B4%A2%E5%BC%95%E5%A4%84%E7%9A%84%E5%86%85%E5%AD%98%E3%80%82%E6%B5%81%E7%A8%8B%E5%A4%A7%E8%87%B4%E5%A6%82%E4%B8%8B%EF%BC%9A%0A%60%60%60mermaid%0Agraph%20TD%0AA%5B%22get%20module%20base%20from%20%2Fproc%2F%3Cpid%3E%2Fmaps%20file%22%5D%20--%3E%20B%5B%22Program%20table%20is%20at%20the%20beginning%22%5D%0AB%20--%3E%20C%5B%22Find%20.dynamic%20section%20in%20PHT%20by%20PT_DYNAMIC%22%5D%0AC%20--%3E%20D%5B%22Get%20.strtab%20by%20DT_STRTAB%22%5D%0AC%20--%3E%20E%5B%22Get%20.symtab%20by%20DT_SYMTAB%22%5D%0AC%20--%3E%20F%5B%22Get%20.rel(a).plt%20by%20DT_JMPREL%22%5D%0AC%20--%3E%20G%5B%22Get%20.rel(a).plt%20size%20by%20DT_PLTRELSZ%22%5D%0AF%20--%3E%20I%5B%22Loop%20in%20.rel(a).plt%22%5D%0AD%20--%3E%20I%0AE%20--%3E%20I%0AG%20--%3E%20I%0AI%20--%3E%20%7Cthe%20ith%20entry%7C%20J%5BGet%20symbol%20entry%20in%20.symtab%5D%0A%0AJ%20--%3E%20%7Cname%20index%20in%20symbol%20entry%7C%20H%7BName%20in%20.strtab%20matched%20%3F%7D%0AH%20--%3E%20%7CY%7C%20K%5BUpdate%20table%20item%5D%0AK%20--%3E%20L((End))%0AH%20--%3E%20%7CN%7CI%0A%60%60%60%0A%E6%88%91%E7%9A%84%E5%9F%BA%E7%A1%80%E4%BB%A3%E7%A0%81%E6%9D%A5%E8%87%AA%E4%BA%8E%5B1%5D%EF%BC%8C%E6%80%BB%E7%9A%84%E9%A1%B9%E7%9B%AE%E5%90%8E%E9%9D%A2%E6%88%91%E4%BC%9A%E6%9B%B4%E6%96%B0%E5%88%B0%5Bzhougy0717%2Finject_got%5D(https%3A%2F%2Fgithub.com%2Fzhougy0717%2Finject_got)%E4%BB%93%E5%BA%93%E4%B8%AD%E3%80%82%0A%23%23%23%23%20Get%20module%20base%0A%E8%BF%99%E9%87%8C%E8%A6%81%E5%81%9A%E7%9A%84%E5%85%B6%E5%AE%9E%E5%B0%B1%E6%98%AF%E8%8E%B7%E5%8F%96%E5%AF%B9%E5%BA%94%E7%9A%84image%E5%9C%A8%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E4%B8%AD%E7%9A%84%E4%BD%8D%E7%BD%AE%E3%80%82%E4%BE%8B%E5%A6%82%EF%BC%9A%0A%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%0A!%5Be31d1d9013e9146aa111206290984949.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6390)%0Alibc%E5%8A%A8%E6%80%81%E5%BA%93%0A!%5B6d153497c7a859245a4976e8f451a815.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6388)%0A%E6%A0%B9%E6%8D%AE%E5%89%8D%E6%96%87%E7%9A%84%E8%A7%A3%E9%87%8A%EF%BC%8C%E8%BF%99%E9%87%8C%E4%B8%8D%E5%90%8C%E7%9A%84%E9%A1%B9%E7%9B%AE%E8%A1%A8%E7%A4%BA%E7%9A%84%E6%98%AF%E4%B8%8D%E5%90%8C%E7%9A%84%E6%AE%B5%E3%80%82%E8%80%8C%E6%A0%B9%E6%8D%AE%E6%88%91%E7%9A%84%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C%EF%BC%8C%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8C%B9%E9%85%8D%E9%A1%B9%E5%B0%B1%E6%98%AF%E6%88%91%E4%BB%AC%E8%A6%81%E6%89%BE%E7%9A%84%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80%E3%80%82%E8%80%8C%E8%A7%A3%E6%9E%90%E8%BF%99%E4%B8%AA%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80%EF%BC%8C%E5%B0%B1%E6%98%AF%E5%81%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D%EF%BC%8C%E4%BB%A3%E7%A0%81%E5%A6%82%E4%B8%8B%EF%BC%9A%0A%60%60%60c%0A%20%20%20%20%2F%2F%20%E6%89%93%E5%BC%80%E6%96%87%E4%BB%B6%2Fproc%2Fpid%2Fmaps%EF%BC%8C%E8%8E%B7%E5%8F%96%E6%8C%87%E5%AE%9Apid%E8%BF%9B%E7%A8%8B%E5%8A%A0%E8%BD%BD%E7%9A%84%E5%86%85%E5%AD%98%E6%A8%A1%E5%9D%97%E4%BF%A1%E6%81%AF%0A%20%20%20%20fp%20%3D%20fopen(filename%2C%20%22r%22)%3B%0A%20%20%20%20if(fp%20!%3D%20NULL)%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20%E6%AF%8F%E6%AC%A1%E4%B8%80%E8%A1%8C%EF%BC%8C%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6%20%2Fproc%2Fpid%2Fmaps%E4%B8%AD%E5%86%85%E5%AE%B9%0A%20%20%20%20%20%20%20%20while(fgets(line%2C%20sizeof(line)%2C%20fp))%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E6%9F%A5%E6%89%BE%E6%8C%87%E5%AE%9A%E7%9A%84so%E6%A8%A1%E5%9D%97%0A%20%20%20%20%20%20%20%20%20%20%20%20if(strstr(line%2C%20module_name))%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E5%88%86%E5%89%B2%E5%AD%97%E7%AC%A6%E4%B8%B2%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pch%20%3D%20strtok(line%2C%20%22-%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E9%95%BF%E6%95%B4%E5%BD%A2%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20addr%20%3D%20strtoul(pch%2C%20NULL%2C%2016)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20fclose(fp)%3B%0A%20%20%20%20return%20(void*)addr%3B%0A%60%60%60%0A%23%23%23%23%20.rel.plt%E8%BF%98%E6%98%AF.rela.plt%0Arel%E5%92%8Crela%E6%98%AF%E4%B8%A4%E7%A7%8Drelocation%20type%E3%80%82%E6%98%AFrel%E8%BF%98%E6%98%AFrela%E4%BC%9A%E5%BD%B1%E5%93%8D%E5%88%B0%E5%90%8E%E7%BB%AD%E9%80%89%E6%8B%A9%E7%9A%84%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%B1%BB%E5%9E%8B%E3%80%82%E5%88%B0%E5%BA%95%E8%AF%A5%E7%94%A8rel%E8%BF%98%E6%98%AFrela%EF%BC%8C%E6%98%AF%E5%8F%96%E5%86%B3%E4%BA%8Eprocessor%20type%E7%9A%84%E3%80%82%E8%80%8Cx86_64%E9%83%BD%E6%98%AFrela%E7%B1%BB%E5%9E%8B%E7%9A%84%EF%BC%8Ci386%E5%92%8Carm32%E9%83%BD%E6%98%AFrel%E7%B1%BB%E5%9E%8B%E7%9A%84%E3%80%82%E9%99%A4%E4%BA%86%E9%80%9A%E8%BF%87Google%E6%9D%A5%E5%BE%97%E5%88%B0rel%20type%EF%BC%8C%E8%BF%98%E6%9C%89%E6%9B%B4%E9%9D%A0%E8%B0%B1%E7%9A%84%E6%96%B9%E6%B3%95%E6%98%AF%EF%BC%8C%E6%A3%80%E6%9F%A5.dynamic%20section%E7%9A%84DT_PLTREL%E5%AD%97%E6%AE%B5%E3%80%82%0A%60%60%60c%0A%20%20%20%20for(i%3D0%3Bi%20%3C%20dynamicSize%20%2F%20sizeof(Elf64_Dyn)%3Bi%20%2B%2B)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20uint64_t%20val%20%3D%20dynamic_table%5Bi%5D.d_un.d_val%3B%0A%20%20%20%20%20%20%20%20if%20(dynamic_table%5Bi%5D.d_tag%20%3D%3D%20DT_PLTREL)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20DT_RELA%20%3D%207%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20DT_REL%20%3D%2017%0A%20%20%20%20%20%20%20%20%20%20%20%20relType%20%3D%20dynamic_table%5Bi%5D.d_un.d_val%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%60%60%60%0A%23%23%23%23%20%E4%BB%8E.rel(a).plt%20index%E5%88%B0.strtab%20index%0A%E8%BF%99%E4%B8%80%E6%AE%B5%E4%BB%A3%E7%A0%81%E8%A6%81%E5%81%9A%E7%9A%84%E5%B0%B1%E6%98%AF%E6%89%BE%E5%88%B0.rel(a).plt%E8%A1%A8%E9%A1%B9%E6%89%80%E4%BB%A3%E8%A1%A8%E7%9A%84%E5%87%BD%E6%95%B0%E7%9A%84%E5%90%8D%E5%AD%97%E3%80%82%E8%BF%99%E4%B8%AA%E5%87%BD%E6%95%B0%E7%9A%84%E5%90%8D%E5%AD%97%E6%98%AF%E5%AD%98%E5%82%A8%E5%9C%A8.strtab%E8%8A%82%E7%9A%84%E3%80%82%E4%BB%A3%E7%A0%81%E5%A4%A7%E8%87%B4%E5%A6%82%E4%B8%8B%EF%BC%9A%0A%60%60%60c%0A%20%20%20%20%2F%2F%20%E8%8E%B7%E5%8F%96.rel(a).plt%2C%20.symtab%2C%20.strtab%E5%9C%B0%E5%9D%80%0A%20%20%20%20for(i%3D0%3Bi%20%3C%20dynamicSize%20%2F%20sizeof(Elf64_Dyn)%3Bi%20%2B%2B)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20uint64_t%20val%20%3D%20dynamic_table%5Bi%5D.d_un.d_val%3B%0A%20%20%20%20%20%20%20%20if%20(dynamic_table%5Bi%5D.d_tag%20%3D%3D%20DT_JMPREL)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20jmpRelOff%20%3D%20dynamic_table%5Bi%5D.d_un.d_ptr%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20(dynamic_table%5Bi%5D.d_tag%20%3D%3D%20DT_STRTAB)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20strTabOff%20%3D%20dynamic_table%5Bi%5D.d_un.d_ptr%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20(dynamic_table%5Bi%5D.d_tag%20%3D%3D%20DT_PLTRELSZ)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20pltRelSz%20%3D%20dynamic_table%5Bi%5D.d_un.d_val%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20(dynamic_table%5Bi%5D.d_tag%20%3D%3D%20DT_SYMTAB)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20symTabOff%20%3D%20dynamic_table%5Bi%5D.d_un.d_ptr%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20Elf64_Rela*%20rel_table%20%3D%20(Elf64_Rela*)jmpRelOff%3B%0A%20%20%20%20%2F%2F%20%E9%81%8D%E5%8E%86%E6%9F%A5%E6%89%BE%E8%A6%81hook%E7%9A%84%E5%AF%BC%E5%85%A5%E5%87%BD%E6%95%B0%0A%20%20%20%20%2F%2F%20i%20%3D%3D%3E%20.rela.plt%20item%20index%0A%20%20%20%20for(i%20%3D%200%3Bi%20%3C%20pltRelSz%20%2F%20sizeof(Elf64_Rela)%3Bi%2B%2B)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20int%20number%20%3D%20ELF64_R_SYM(rel_table%5Bi%5D.r_info)%3B%20%2F%2F%20.symtab%20index%0A%20%20%20%20%20%20%20%20Elf64_Sym*%20symEnt%20%3D%20(Elf64_Sym*)(number*sizeof(Elf64_Sym)%20%2B%20symTabOff)%3B%0A%20%20%20%20%20%20%20%20char*%20funcName%20%3D%20(char*)(symEnt-%3Est_name%20%2B%20strTabOff)%3B%0A%20%20%20%20%20%20%20%20if(strcmp(funcName%2C%20%22puts%22)%20%3D%3D%200)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E5%86%85%E5%AD%98%E5%88%86%E9%A1%B5%E7%9A%84%E5%A4%A7%E5%B0%8F%0A%20%20%20%20%20%20%20%20%20%20%20%20uint64_t%20page_size%20%3D%20getpagesize()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E8%8E%B7%E5%8F%96%E5%86%85%E5%AD%98%E5%88%86%E9%A1%B5%E7%9A%84%E8%B5%B7%E5%A7%8B%E5%9C%B0%E5%9D%80%EF%BC%88%E9%9C%80%E8%A6%81%E5%86%85%E5%AD%98%E5%AF%B9%E9%BD%90%EF%BC%89%0A%20%20%20%20%20%20%20%20%20%20%20%20uint64_t%20mem_page_start%20%3D%20(uint64_t)(((Elf64_Addr)rel_table%5Bi%5D.r_offset%20%2B%20(uint64_t)base_addr))%20%26%20(~(page_size%20-%201))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20mprotect((void%20*)mem_page_start%2C%20page_size%2C%20PROT_READ%20%7C%20PROT_WRITE%20%7C%20PROT_EXEC)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20*(uint64_t%20*)(rel_table%5Bi%5D.r_offset%20%2B%20base_addr)%20%3D%20(uint64_t)my_puts%3B%20%2F%2F%20overwrite%20GOT%20item%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%60%60%60%0A%E4%B8%8B%E5%9B%BE%E5%B0%B1%E6%98%AF%E4%B8%8A%E9%9D%A2%E8%BF%99%E6%AE%B5%E4%BB%A3%E7%A0%81%E7%9A%84%E7%A4%BA%E6%84%8F%E5%9B%BE%E3%80%82%0A!%5B8a9964ab6563f1cffe61dabed1422c42.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6392)%0A%E8%BF%99%E9%87%8C%E5%80%BC%E5%BE%97%E6%B3%A8%E6%84%8F%E7%9A%84%E6%98%AF%EF%BC%9A%0A-%20%E5%9C%A8%E8%A7%A3%E6%9E%90.dynamic%E8%8A%82%EF%BC%8C%E8%8E%B7%E5%8F%96.rel(a).plt%2C%20.symtab%2C%20.strtab%E4%BF%A1%E6%81%AF%E6%97%B6%EF%BC%8C%E8%A6%81%E6%B3%A8%E6%84%8F%E7%9A%84%E6%98%AFElf64_Dyn%E7%9A%84%E5%AE%9A%E4%B9%89%EF%BC%8C%E5%AE%83%E6%98%AF%E4%B8%80%E4%B8%AAunion%E7%BB%93%E6%9E%84%EF%BC%8C%E6%98%AF%E5%8C%BA%E5%88%86%E5%80%BC%E7%B1%BB%E5%9E%8B%E5%92%8C%E6%8C%87%E9%92%88%E7%B1%BB%E5%9E%8B%E7%9A%84%EF%BC%8C%E5%85%B6%E5%AE%9A%E4%B9%89%E5%A6%82%E4%B8%8B%EF%BC%9A%0A%60%60%60c%0Atypedef%20struct%20%7B%0A%20%20%20%20%20%20%20%20Elf64_Xword%20d_tag%3B%0A%20%20%20%20%20%20%20%20union%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Elf64_Xword%20%20%20%20%20d_val%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Elf64_Addr%20%20%20%20%20%20d_ptr%3B%0A%20%20%20%20%20%20%20%20%7D%20d_un%3B%0A%7D%20Elf64_Dyn%3B%0A%60%60%60%0A%E5%9C%A8%E8%8E%B7%E5%8F%96%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80%E7%9A%84%E6%97%B6%E5%80%99%E8%A6%81%E7%94%A8d_ptr%2C%E8%80%8C%E5%9C%A8%E8%8E%B7%E5%8F%96%E4%BE%8B%E5%A6%82DT_PLTRELSZ%E6%97%B6%EF%BC%8C%E5%B0%B1%E6%98%BE%E7%84%B6%E6%98%AF%E4%B8%80%E4%B8%AA%E5%80%BC%E7%B1%BB%E5%9E%8B%E3%80%82%0A-%20%E5%89%8D%E9%9D%A2%E8%AF%B4%E7%9A%84relocation%20type%E5%9C%A8%E8%BF%99%E9%87%8C%E5%B0%B1%E4%BC%9A%E5%8F%91%E6%8C%A5%E4%BD%9C%E7%94%A8%E3%80%82.rel(a).plt%E8%A1%A8%E9%A1%B9%E5%9C%A8%E4%B8%8D%E5%90%8C%E7%9A%84relocation%20type%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%EF%BC%8C%E5%85%B6%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E6%98%AF%E4%B8%8D%E5%90%8C%E7%9A%84%E3%80%82%E4%BB%96%E4%BB%AC%E7%9A%84%E7%BB%93%E6%9E%84%E5%92%8C%E5%B0%BA%E5%AF%B8%E9%83%BD%E6%98%AF%E4%B8%8D%E5%90%8C%E7%9A%84%E3%80%82%0A%20%20%20%20-%20rel%E6%98%AFElf64_Rel%0A%20%20%20%20-%20rela%E6%98%AFElf64_Rela%0A-%20DT_SYMTAB%E6%98%AF.symtab%E8%8A%82%EF%BC%8C%E6%AF%8F%E4%B8%80%E4%B8%AAsymbol%E6%98%AF%E4%B8%80%E4%B8%AAElf64_Sym%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%0A-%20.strtab%E6%98%AF%E6%89%80%E6%9C%89%E7%AC%A6%E5%8F%B7%E7%9A%84%E5%90%8D%E5%AD%97%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%A1%A8%E6%A0%BC%E3%80%82%E8%80%8CElf64_Sym.st_name%E6%98%AF%E8%A1%A8%E6%A0%BC%E7%9A%84%E5%81%8F%E7%A7%BB%E5%9C%B0%E5%9D%80%E3%80%82%E6%B3%A8%E6%84%8F%EF%BC%8C%E4%B8%8D%E6%98%AF%E8%A1%A8%E6%A0%BC%E7%B4%A2%E5%BC%95%E3%80%82%E6%89%80%E4%BB%A5%E8%8E%B7%E5%8F%96%E5%90%8D%E5%AD%97%E7%9A%84%E6%96%B9%E6%B3%95%E6%98%AF%60symEnt-%3Est_name%20%2B%20strTabOff%60%E3%80%82%0A-%20%E6%9C%80%E5%90%8E%EF%BC%8C%E4%BF%AE%E6%94%B9%E5%AF%B9%E5%BA%94%E7%9A%84%E9%A1%B5%E8%A1%A8%E5%B1%9E%E6%80%A7%EF%BC%8C%E7%84%B6%E5%90%8E%E4%BF%AE%E6%94%B9%E5%AF%B9%E5%BA%94%E7%9A%84%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80%E5%B0%B1%E5%8F%AF%E4%BB%A5%E6%B0%B4%E5%88%B0%E6%B8%A0%E6%88%90%E4%BA%86%0A%0A%23%23%20%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE%0A%5B1%5D%20%5BAndroid%20so%E6%B3%A8%E5%85%A5(inject)%E5%92%8CHook%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%BA%8C%EF%BC%89%E2%80%94%E2%80%94Got%E8%A1%A8hook%E4%B9%8B%E5%AF%BC%E5%85%A5%E8%A1%A8hook%5D(https%3A%2F%2Fwww.cnblogs.com%2Fgoodhacker%2Fp%2F9306997.html)%0A%5B2%5D%20%5BExecutable%20and%20Linkable%20Format%5D(https%3A%2F%2Fstevens.netmeister.org%2F631%2Felf.html)%0A%5B3%5D%20%5BOracle%20Documentation%5D(https%3A%2F%2Fdocs.oracle.com%2Fcd%2FE19683-01%2F817-3677%2F6mj8mbtc9%2Findex.html%23chapter6-79797)%0A%5B4%5D%20%5BExecutable%20and%20Linking%20Format%20Specification%2C%20Version%201.2%5D(https%3A%2F%2Frefspecs.linuxbase.org%2Felf%2Felf.pdf)%0A