Advertisement
Guest User

Untitled

a guest
Feb 6th, 2016
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.83 KB | None | 0 0
  1. diff -ru glibc-2.22/elf/dl-deps.c glibc-2.22-patched/elf/dl-deps.c
  2. --- glibc-2.22/elf/dl-deps.c 2015-08-05 09:42:21.000000000 +0300
  3. +++ glibc-2.22-patched/elf/dl-deps.c 2016-01-29 23:12:33.928386477 +0300
  4. @@ -152,6 +152,27 @@
  5. map->l_reserved = 1;
  6. }
  7.  
  8. +/* Randomly shuffles first N elements of array A.
  9. + Element size is SIZE, initial seed is SEED. */
  10. +static void shuffle (void *a, unsigned n, size_t size, int seed)
  11. +{
  12. + char *aa = (char *)a;
  13. + uint32_t r = seed;
  14. + unsigned i;
  15. + for (i = 0; i < n; ++i)
  16. + {
  17. + unsigned j = r % n;
  18. + size_t k;
  19. + for (k = 0; k < size; ++k)
  20. + {
  21. + char tmp = aa[i * size + k];
  22. + aa[i * size + k] = aa[j * size + k];
  23. + aa[j * size + k] = tmp;
  24. + }
  25. + r = 1664525 * r + 1013904223; // LCG, "Numerical Recipes"
  26. + }
  27. +}
  28. +
  29. void
  30. internal_function
  31. _dl_map_object_deps (struct link_map *map,
  32. @@ -617,6 +638,7 @@
  33. i = 1;
  34. uint16_t seen[nlist];
  35. memset (seen, 0, nlist * sizeof (seen[0]));
  36. + shuffle (&l_initfini[1], nlist - 1, sizeof (l_initfini[0]), 0);
  37. while (1)
  38. {
  39. /* Keep track of which object we looked at this round. */
  40. diff -ru glibc-2.22/elf/dl-init.c glibc-2.22-patched/elf/dl-init.c
  41. --- glibc-2.22/elf/dl-init.c 2016-01-30 08:52:32.179810804 +0300
  42. +++ glibc-2.22-patched/elf/dl-init.c 2016-01-30 08:53:34.080995846 +0300
  43. @@ -24,6 +24,27 @@
  44. typedef void (*init_t) (int, char **, char **);
  45.  
  46.  
  47. +/* Randomly shuffles first N elements of array A.
  48. + Element size is SIZE, initial seed is SEED. */
  49. +static void shuffle (void *a, unsigned n, size_t size, int seed)
  50. +{
  51. + char *aa = (char *)a;
  52. + uint32_t r = seed;
  53. + unsigned i;
  54. + for (i = 0; i < n; ++i)
  55. + {
  56. + unsigned j = r % n;
  57. + size_t k;
  58. + for (k = 0; k < size; ++k)
  59. + {
  60. + char tmp = aa[i * size + k];
  61. + aa[i * size + k] = aa[j * size + k];
  62. + aa[j * size + k] = tmp;
  63. + }
  64. + r = 1664525 * r + 1013904223; // LCG, "Numerical Recipes"
  65. + }
  66. +}
  67. +
  68. static void
  69. call_init (struct link_map *l, int argc, char **argv, char **env)
  70. {
  71. @@ -67,13 +88,19 @@
  72.  
  73. jm = l->l_info[DT_INIT_ARRAYSZ]->d_un.d_val / sizeof (ElfW(Addr));
  74.  
  75. + unsigned *r = malloc (jm * sizeof (unsigned));
  76. + for (j = 0; j < jm; ++j)
  77. + r[j] = j;
  78. + // First entry comes from crtstuff, don't mess with it...
  79. + shuffle (&r[1], jm - 1, sizeof (unsigned), 0);
  80. +
  81. addrs = (ElfW(Addr) *) (init_array->d_un.d_ptr + l->l_addr);
  82. for (j = 0; j < jm; ++j)
  83. {
  84. + _dl_debug_printf ("%s: calling init_array[%d] = %lx\n",
  85. + l->l_name ? l->l_name : "", r[j],
  86. + (unsigned long) addrs[r[j]] - (unsigned long) l->l_addr);
  87. + ((init_t) addrs[r[j]]) (argc, argv, env);
  88. }
  89. }
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement