Advertisement
Guest User

Untitled

a guest
May 30th, 2024
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.90 KB | None | 0 0
  1. import argparse
  2. import os
  3. import sys
  4.  
  5. from pwn import *
  6.  
  7. from elftools.elf.elffile import ELFFile
  8. from elftools.elf.dynamic import DynamicSection
  9. from pathlib import Path
  10. from rgbprint import rgbprint, Color
  11. from typing import Callable, Dict, Iterable, List, Type
  12.  
  13. #
  14. # constants.py
  15. #
  16.  
  17. DEBUG_FILE = Path(__file__).resolve().parent / 'debug.txt'
  18.  
  19. #
  20. # helpers.py
  21. #
  22.  
  23. def write_data_to_a_debug_file(file: str, data: str) -> None:
  24. try:
  25. with open(file, 'a+') as debug_file:
  26. debug_file.write(data)
  27. except Exception as error:
  28. raise Exception(f'FUNCTION: write_data_to_a_debug_file() - {error}')
  29.  
  30. #
  31. # elf_local_data.py
  32. #
  33.  
  34. class ELFLocalData():
  35. _el_file: Type[ELFFile]
  36. _el_segments_dict: Dict
  37. _el_segments_iterable: Iterable
  38. _el_sections_dict: Dict
  39. _el_sections_iterable: Iterable
  40. _el_tags_dict: Dict
  41. _el_elf_base_address: int
  42. _el_elf_init_section_offset: int
  43.  
  44. #
  45.  
  46. def __init__(self) -> None:
  47. file = open(self._program_path, 'rb')
  48. self._el_file = ELFFile(file)
  49.  
  50. self._el_set_all_elf_segments()
  51. self._el_set_all_elf_sections()
  52. self._el_set_all_elf_tags()
  53. self._el_set_elf_base_address()
  54. self._el_set_elf_init_section_offset()
  55.  
  56. #
  57.  
  58. def el_get_segment_by_number(self, number) -> Dict:
  59. return self._el_segments_dict[number]
  60.  
  61.  
  62. def el_get_section_by_name(self, name) -> Dict:
  63. return self._el_sections_dict[name]
  64.  
  65.  
  66. def el_get_tag_by_name(self, name) -> Dict:
  67. return self._el_tags_dict[name]
  68.  
  69.  
  70. def el_get_elf_base_address(self) -> int:
  71. return self._el_elf_base_address
  72.  
  73.  
  74. def el_get_elf_init_section_offset(self) -> int:
  75. return self._el_elf_init_section_offset
  76.  
  77. #
  78.  
  79. def _el_set_all_elf_segments(self) -> Dict:
  80. self._el_segments_dict = {}
  81. counter = 0
  82. self._el_segments_iterable = self._el_file.iter_segments()
  83. for segment in self._el_segments_iterable:
  84. current_segment = {}
  85. for key, value in segment.header.items():
  86. current_segment[key] = value
  87. self._el_segments_dict.update({counter : current_segment})
  88. counter += 1
  89.  
  90. return self._el_segments_dict
  91.  
  92.  
  93. def _el_set_all_elf_sections(self) -> Dict:
  94. self._el_sections_dict = {}
  95. self._el_sections_iterable = self._el_file.iter_sections()
  96. for section in self._el_sections_iterable:
  97. current_section = {}
  98. for key, value in section.header.items():
  99. current_section[key] = value
  100. self._el_sections_dict.update({section.name : current_section})
  101.  
  102. return self._el_sections_dict
  103.  
  104.  
  105. def _el_set_all_elf_tags(self) -> Dict:
  106. self._el_tags_dict = {}
  107. for section in self._el_sections_iterable:
  108. if section.is_null() == False:
  109. if not isinstance(section, DynamicSection):
  110. for tag in section.iter_tags():
  111. self._el_tags_dict.update({tag['d_tag'] : tag['d_val']})
  112.  
  113. return self._el_tags_dict
  114.  
  115.  
  116. def _el_set_elf_base_address(self) -> int:
  117. for i in range(len(self._el_segments_dict)):
  118. if self._el_segments_dict[i]['p_type'] == 'PT_LOAD':
  119. if self._virtual_memory_mapping == True:
  120. address = self._el_segments_dict[i]['p_vaddr']
  121. else:
  122. address = self._el_segments_dict[i]['p_paddr']
  123. offset = self._el_segments_dict[i]['p_offset']
  124. break
  125. self._el_elf_base_address = address - offset
  126.  
  127. return self._el_elf_base_address
  128.  
  129.  
  130. def _el_set_elf_init_section_offset(self) -> None:
  131. self._el_elf_init_section_offset = self._el_sections_dict['.init']['sh_addr'] - self._el_elf_base_address
  132.  
  133. return self._el_elf_init_section_offset
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement