1 /* Force .got aligned to 4K, so it very likely gets at 0x804a100 2 (0x60 bytes .tdata and 0xa0 bytes .dynamic) */ 3 .section ".tdata", "awT", @progbits 4 .balign 4096 5 .globl sg1, sg2, sg3, sg4, sg5, sg6, sg7, sg8 6 .globl sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8 7 .hidden sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8 8 sg1: .long 17 9 sg2: .long 18 10 sg3: .long 19 11 sg4: .long 20 12 sg5: .long 21 13 sg6: .long 22 14 sg7: .long 23 15 sg8: .long 24 16 sl1: .long 65 17 sl2: .long 66 18 sl3: .long 67 19 sl4: .long 68 20 sl5: .long 69 21 sl6: .long 70 22 sl7: .long 71 23 sl8: .long 72 24 sh1: .long 257 25 sh2: .long 258 26 sh3: .long 259 27 sh4: .long 260 28 sh5: .long 261 29 sh6: .long 262 30 sh7: .long 263 31 sh8: .long 264 32 /* Force .text aligned to 4K, so it very likely gets at 0x8049000. */ 33 .text 34 .balign 4096 35 .globl fn2 36 .type fn2,@function 37 fn2: 38 pushl %ebp 39 movl %esp, %ebp 40 pushl %ebx 41 pushl %eax 42 call 1f 43 1: popl %ebx 44 addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx 45 nop;nop;nop;nop 46 47 /* GD -> IE because variable is not defined in executable */ 48 leal sG1@tlsgd(,%ebx,1), %eax 49 call ___tls_get_addr@plt 50 nop;nop;nop;nop 51 52 /* GD -> IE because variable is not defined in executable where 53 the variable is referenced through @gottpoff too */ 54 leal sG2@tlsgd(,%ebx,1), %eax 55 call ___tls_get_addr@plt 56 nop;nop;nop;nop 57 58 /* GD -> IE because variable is not defined in executable where 59 the variable is referenced through @gotntpoff too */ 60 leal sG3@tlsgd(,%ebx,1), %eax 61 call ___tls_get_addr@plt 62 nop;nop;nop;nop 63 64 /* GD -> IE because variable is not defined in executable where 65 the variable is referenced through @gottpoff and @gotntpoff too */ 66 leal sG4@tlsgd(,%ebx,1), %eax 67 call ___tls_get_addr@plt 68 nop;nop;nop;nop 69 70 /* GD -> LE with global variable defined in executable */ 71 leal sg1@tlsgd(,%ebx,1), %eax 72 call ___tls_get_addr@plt 73 nop;nop;nop;nop 74 75 /* GD -> LE with local variable defined in executable */ 76 leal sl1@tlsgd(,%ebx,1), %eax 77 call ___tls_get_addr@plt 78 nop;nop;nop;nop 79 80 /* GD -> LE with hidden variable defined in executable */ 81 leal sh1@tlsgd(,%ebx,1), %eax 82 call ___tls_get_addr@plt 83 nop;nop;nop;nop 84 85 /* LD -> LE */ 86 leal sl1@tlsldm(%ebx), %eax 87 call ___tls_get_addr@PLT 88 nop;nop 89 leal sl1@dtpoff(%eax), %edx 90 nop;nop 91 leal sl2@dtpoff(%eax), %ecx 92 nop;nop;nop;nop 93 94 /* LD -> LE against hidden variables */ 95 leal sh1@tlsldm(%ebx), %eax 96 call ___tls_get_addr@PLT 97 nop;nop 98 leal sh1@dtpoff(%eax), %edx 99 nop;nop 100 leal sh2@dtpoff(%eax), %ecx 101 nop;nop;nop;nop 102 103 /* @gottpoff IE against global var */ 104 movl %gs:0, %ecx 105 nop;nop 106 subl sG2@gottpoff(%ebx), %ecx 107 nop;nop;nop;nop 108 109 /* @gottpoff IE against global var */ 110 movl %gs:0, %eax 111 nop;nop 112 subl sG4@gottpoff(%ebx), %eax 113 nop;nop;nop;nop 114 115 /* @gotntpoff IE against global var */ 116 movl %gs:0, %ecx 117 nop;nop 118 addl sG3@gotntpoff(%ebx), %ecx 119 nop;nop;nop;nop 120 121 /* @gotntpoff IE against global var */ 122 movl %gs:0, %eax 123 nop;nop 124 addl sG4@gotntpoff(%ebx), %eax 125 nop;nop;nop;nop 126 127 /* @gottpoff IE -> LE against global var defined in exec */ 128 movl %gs:0, %ecx 129 nop;nop 130 subl sg1@gottpoff(%ebx), %ecx 131 nop;nop;nop;nop 132 133 /* @gotntpoff IE -> LE against local var */ 134 movl %gs:0, %ecx 135 nop;nop 136 addl sl1@gotntpoff(%ebx), %eax 137 nop;nop;nop;nop 138 139 /* @gottpoff IE -> LE against hidden var */ 140 movl %gs:0, %ecx 141 nop;nop 142 subl sh1@gottpoff(%ebx), %ecx 143 nop;nop;nop;nop 144 145 /* Direct access through %gs */ 146 147 /* @gotntpoff IE against global var */ 148 movl sG5@gotntpoff(%ebx), %ecx 149 nop;nop 150 movl %gs:(%ecx), %edx 151 nop;nop;nop;nop 152 153 /* @gotntpoff IE->LE against local var */ 154 movl sl5@gotntpoff(%ebx), %eax 155 nop;nop 156 movl %gs:(%eax), %edx 157 nop;nop;nop;nop 158 159 /* @gotntpoff IE->LE against hidden var */ 160 movl sh5@gotntpoff(%ebx), %edx 161 nop;nop 162 movl %gs:(%edx), %edx 163 nop;nop;nop;nop 164 165 /* GD -> IE because variable is not defined in executable */ 166 leal sG1@tlsgd(%ebx), %eax 167 call ___tls_get_addr@plt 168 nop;nop;nop;nop;nop 169 170 movl -4(%ebp), %ebx 171 leave 172 ret 173