Реверс ARM бинарика

Тема в разделе "WASM.RESEARCH", создана пользователем Zubastic, 27 янв 2025.

  1. Zubastic

    Zubastic New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2025
    Сообщения:
    7
    Всем привет. На просторах интернета очень много материала по поводу x86 архитектуры, к сожалению информации по разбору ELF файлов с защитой я найти не смог. Не считая https://habr.com/ru/articles/513944/ но там достаточно примитивно.

    Пытаюсь расковырять файл https://github.com/ludwig-v/wireles...U2W/_/2020.07.08.1306/Extracted/usr/sbin/hcid от прошивки usb донгла. DIE показывает, что это потенциальный upx, однако сам upx расшифровать его не может.[​IMG]

    Судя по strace используется /dev/hwaes. Похоже на то, что товарищи форкнули upx и добавили aes (если это конечно aes).

    Код (Text):
    1. execve("/usr/sbin/hostapd", ["/usr/sbin/hostapd"], 0x7eed4dd8 /* 13 vars */)
    2. ("/proc/self/exe", O_RDONLY)            3
    3. (PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
    4. (0x76ef7000PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0)
    5. (0x76f3bd8c, 0x76f3cf58, 0)            
    6. (0x76f3b000PROT_READ|PROT_EXEC)        
    7. ("/proc/self/exe", "/usr/sbin/hostapd", 4095)
    8. (0x7ed853ac, 0x7ed854e0, 0)            
    9. (0x10000PROT_NONE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0)
    10. (0x10000PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0)
    11. (0x10000, 0x10134, 0)                  
    12. (PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
    13. ("/dev/hwaes", O_RDWR)                  4
    14. (4, _IOC(_IOC_READ|_IOC_WRITE, 0x62, 0x6, 0xc), 0x7ed852a0)
    15. (4)                                    
    16. (0x76eb2000, 277916)                  
    17. (0x10134, 0x99514, 0)                  
    18. (0x99514, 0x9951c, 0)                  
    19. (0x10000PROT_READ|PROT_EXEC)          
    20. (0xaa000PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0)
    21. (0xaa000, 0xaac6c, 0)                  
    22. (0xaa000PROT_READ|PROT_WRITE)          
    23. (0xab000)                              
    24. ("/lib/ld-linux.so.3", O_RDONLY)        4
    25. read(4, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\340\n\0\0004\0\0\0"..., 512)
    26. (PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
    27. (0x76ec5000PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0)
    28. (0x76ef4000PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 4, 0x1f000)
    29. (4)                                    
    30. (PROT_READ, MAP_PRIVATE, 3, 0)        
    31. (3)                                    
    32. (0x76ef7000, 286552)                  
    33. ()                                    
    34. uname({sysname="Linux", nodename="sk_mainboard", ...)
    35. (PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
    36. ("/etc/ld.so.preload", R_OK)          
    37. ("/tmp/lib/tls/v7l/neon/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    38. ("/tmp/lib/tls/v7l/neon/vfp", 0x7ed85488)
    39. ("/tmp/lib/tls/v7l/neon/libdl.so.2", O_RDONLY|O_CLOEXEC)
    40. ("/tmp/lib/tls/v7l/neon", 0x7ed85488)  
    41. ("/tmp/lib/tls/v7l/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    42. ("/tmp/lib/tls/v7l/vfp", 0x7ed85488)  
    43. ("/tmp/lib/tls/v7l/libdl.so.2", O_RDONLY|O_CLOEXEC)
    44. ("/tmp/lib/tls/v7l", 0x7ed85488)      
    45. ("/tmp/lib/tls/neon/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    46. ("/tmp/lib/tls/neon/vfp", 0x7ed85488)  
    47. ("/tmp/lib/tls/neon/libdl.so.2", O_RDONLY|O_CLOEXEC)
    48. ("/tmp/lib/tls/neon", 0x7ed85488)      
    49. ("/tmp/lib/tls/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    50. ("/tmp/lib/tls/vfp", 0x7ed85488)      
    51. ("/tmp/lib/tls/libdl.so.2", O_RDONLY|O_CLOEXEC)
    52. ("/tmp/lib/tls", 0x7ed85488)          
    53. ("/tmp/lib/v7l/neon/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    54. ("/tmp/lib/v7l/neon/vfp", 0x7ed85488)  
    55. ("/tmp/lib/v7l/neon/libdl.so.2", O_RDONLY|O_CLOEXEC)
    56. ("/tmp/lib/v7l/neon", 0x7ed85488)      
    57. ("/tmp/lib/v7l/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    58. ("/tmp/lib/v7l/vfp", 0x7ed85488)      
    59. ("/tmp/lib/v7l/libdl.so.2", O_RDONLY|O_CLOEXEC)
    60. ("/tmp/lib/v7l", 0x7ed85488)          
    61. ("/tmp/lib/neon/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    62. ("/tmp/lib/neon/vfp", 0x7ed85488)      
    63. ("/tmp/lib/neon/libdl.so.2", O_RDONLY|O_CLOEXEC)
    64. ("/tmp/lib/neon", 0x7ed85488)          
    65. ("/tmp/lib/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    66. ("/tmp/lib/vfp", 0x7ed85488)          
    67. ("/tmp/lib/libdl.so.2", O_RDONLY|O_CLOEXEC)
    68. ("/tmp/lib", {st_mode=S_IFDIR|0755, st_size=80, ...)
    69. ("/lib/tls/v7l/neon/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    70. ("/lib/tls/v7l/neon/vfp", 0x7ed85488)  
    71. ("/lib/tls/v7l/neon/libdl.so.2", O_RDONLY|O_CLOEXEC)
    72. ("/lib/tls/v7l/neon", 0x7ed85488)      
    73. ("/lib/tls/v7l/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    74. ("/lib/tls/v7l/vfp", 0x7ed85488)      
    75. ("/lib/tls/v7l/libdl.so.2", O_RDONLY|O_CLOEXEC)
    76. ("/lib/tls/v7l", 0x7ed85488)          
    77. ("/lib/tls/neon/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    78. ("/lib/tls/neon/vfp", 0x7ed85488)      
    79. ("/lib/tls/neon/libdl.so.2", O_RDONLY|O_CLOEXEC)
    80. ("/lib/tls/neon", 0x7ed85488)          
    81. ("/lib/tls/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    82. ("/lib/tls/vfp", 0x7ed85488)          
    83. ("/lib/tls/libdl.so.2", O_RDONLY|O_CLOEXEC)
    84. ("/lib/tls", 0x7ed85488)              
    85. ("/lib/v7l/neon/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    86. ("/lib/v7l/neon/vfp", 0x7ed85488)      
    87. ("/lib/v7l/neon/libdl.so.2", O_RDONLY|O_CLOEXEC)
    88. ("/lib/v7l/neon", 0x7ed85488)          
    89. ("/lib/v7l/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    90. ("/lib/v7l/vfp", 0x7ed85488)          
    91. ("/lib/v7l/libdl.so.2", O_RDONLY|O_CLOEXEC)
    92. ("/lib/v7l", 0x7ed85488)              
    93. ("/lib/neon/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    94. ("/lib/neon/vfp", 0x7ed85488)          
    95. ("/lib/neon/libdl.so.2", O_RDONLY|O_CLOEXEC)
    96. ("/lib/neon", 0x7ed85488)              
    97. ("/lib/vfp/libdl.so.2", O_RDONLY|O_CLOEXEC)
    98. ("/lib/vfp", 0x7ed85488)              
    99. ("/lib/libdl.so.2", O_RDONLY|O_CLOEXEC) 3
    100. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0h\t\0\0004\0\0\0"..., 512)
    101. (3, {st_mode=S_IFREG|0755, st_size=9752, ...)
    102. (PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)
    103. (0x76f2b000PROT_NONE)                  
    104. (0x76f3a000PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000)
    105. (3)                                    
    106. ("/tmp/lib/libm.so.6", O_RDONLY|O_CLOEXEC)
    107. ("/lib/libm.so.6", O_RDONLY|O_CLOEXEC)  3
    108. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\320<\0\0004\0\0\0"..., 512)
    109. (3, {st_mode=S_IFREG|0755, st_size=665120, ...)
    110. (PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)
    111. (0x76eb2000PROT_NONE)                  
    112. (0x76ec2000PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xa1000)
    113. (3)                                    
    114. ("/tmp/lib/librt.so.1", O_RDONLY|O_CLOEXEC)
    115. ("/lib/librt.so.1", O_RDONLY|O_CLOEXEC) 3
    116. read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\340\27\0\0004\0\0\0"..., 512)
    117. (3, {st_mode=S_IFREG|0755, st_size=26600, ...)
    118. (PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)
    119. (0x76f18000PROT_NONE)                  
    120. (0x76f27000PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5000)
    121. (3)                                    
    122. ("/tmp/lib/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    123. ("/lib/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    124. ("/usr/lib/tls/v7l/neon/vfp/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    125. ("/usr/lib/tls/v7l/neon/vfp", 0x7ed85440)
    126. ("/usr/lib/tls/v7l/neon/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    127. ("/usr/lib/tls/v7l/neon", 0x7ed85440)  
    128. ("/usr/lib/tls/v7l/vfp/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    129. ("/usr/lib/tls/v7l/vfp", 0x7ed85440)  
    130. ("/usr/lib/tls/v7l/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    131. ("/usr/lib/tls/v7l", 0x7ed85440)      
    132. ("/usr/lib/tls/neon/vfp/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    133. ("/usr/lib/tls/neon/vfp", 0x7ed85440)  
    134. ("/usr/lib/tls/neon/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    135. ("/usr/lib/tls/neon", 0x7ed85440)      
    136. ("/usr/lib/tls/vfp/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    137. ("/usr/lib/tls/vfp", 0x7ed85440)      
    138. ("/usr/lib/tls/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    139. ("/usr/lib/tls", 0x7ed85440)          
    140. ("/usr/lib/v7l/neon/vfp/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    141. ("/usr/lib/v7l/neon/vfp", 0x7ed85440)  
    142. ("/usr/lib/v7l/neon/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    143. ("/usr/lib/v7l/neon", 0x7ed85440)      
    144. ("/usr/lib/v7l/vfp/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    145. ("/usr/lib/v7l/vfp", 0x7ed85440)      
    146. ("/usr/lib/v7l/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    147. ("/usr/lib/v7l", 0x7ed85440)          
    148. ("/usr/lib/neon/vfp/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    149. ("/usr/lib/neon/vfp", 0x7ed85440)      
    150. ("/usr/lib/neon/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    151. ("/usr/lib/neon", 0x7ed85440)          
    152. ("/usr/lib/vfp/libnl-3.so.200", O_RDONLY|O_CLOEXEC)
    153. ("/usr/lib/vfp", 0x7ed85440)          
    154. ("/usr/lib/libnl-3.so.200", O_RDONLY|O_CLOEXEC) 3
    155. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\230W\0\0004\0\0\0"..., 512)
    156. (3, {st_mode=S_IFREG|0755, st_size=72948, ...)
    157. (PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
    158. (PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)
    159. (0x76dfd000PROT_NONE)                  
    160. (0x76e10000PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x11000)
    161. (3)                                    
    162. ("/tmp/lib/libnl-genl-3.so.200", O_RDONLY|O_CLOEXEC)
    163. ("/lib/libnl-genl-3.so.200", O_RDONLY|O_CLOEXEC)
    164. ("/usr/lib/libnl-genl-3.so.200", O_RDONLY|O_CLOEXEC) 3
    165. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\08\32\0\0004\0\0\0"..., 512)
    166. (3, {st_mode=S_IFREG|0755, st_size=23568, ...)
    167. (PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)
    168. (0x76f00000PROT_NONE)                  
    169. (0x76f10000PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000)
    170. (3)                                    
    171. ("/tmp/lib/libpthread.so.0", O_RDONLY|O_CLOEXEC)
    172. ("/lib/libpthread.so.0", O_RDONLY|O_CLOEXEC) 3
    173. read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\320H\0\0004\0\0\0"..., 512)
    174. (3, {st_mode=S_IFREG|0755, st_size=92608, ...)
    175. (PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)
    176. (0x76ddc000PROT_NONE)                  
    177. (0x76deb000PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15000)
    178. (0x76ded000PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0)
    179. (3)                                    
    180. ("/tmp/lib/libc.so.6", O_RDONLY|O_CLOEXEC)
    181. ("/lib/libc.so.6", O_RDONLY|O_CLOEXEC)  3
    182. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\\f\1\0004\0\0\0"..., 512)
    183. (3, {st_mode=S_IFREG|0755, st_size=1251160, ...)
    184. (PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)
    185. (0x76db0000PROT_NONE)                  
    186. (0x76dc0000PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x12d000)
    187. (0x76dc3000PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0)
    188. (3)                                    
    189. (PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
    190. (0x76efc850)                          
    191. (0x76dc0000PROT_READ)                  
    192. (0x76deb000PROT_READ)                  
    193. (0x76f3a000PROT_READ)                  
    194. (0x76ec2000PROT_READ)                  
    195. (0x76f27000PROT_READ)                  
    196. (0x76ef4000PROT_READ)                  
    197. (0x76efc3f8)                          
    198. (0x76efc400, 12)                      
    199. (32, {sa_handler=0x76dca1d0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x76cb0670, , 8)
    200. (SIGRT_1, {sa_handler=0x76dca2b8, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x76cb0670, , 8)
    201.  
    У меня сейчас какой-то кривой strace. Видимо его нужно правильно пересобрать. syscall он кроме read не понимает(

    Собственно хочу понять, а в ту ли сторону я ковыряю, или же это фейк и там фулл кастом пакер, который надо пытаться ковырять с абсолютно другой стороны, а не пытаться править upx.
     
  2. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    490
    как насчет закинуть armlinux server и подебажить в ида?
     
  3. Zubastic

    Zubastic New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2025
    Сообщения:
    7
    Поковырялся еще пару часиков. Судя по сигнатурам это 99% измененный upx. В итоге дошел до этого:
    Код (Text):
    1. upx: E:\Stuff\ARMimg_maker: Exception: compressed data violation
    Код сильно размазан + похоже, что там добавлена антиотладка тк если прицепиться к процессу, то он просто закроется. Однако если запустить его через gdb, то все ок, но любая бряка вне syscall приводит к SIGSEGV
    Код (Text):
    1. 13CB8: got SIGSEGV signal (Segmentation violation) (exc.code b, tid 827)
    С помощью gdb + catch syscall brk смог получить дамп процесса, однако необходимо патчить вызовы тк все syscall ведут в упакованный бинарик.
    --- Сообщение объединено, 28 янв 2025 ---
    Есть большое подозрение, что стоковый gdb работает тк функция /proc/[pid]/status возвращает статус отличный от trace, в отличие от иды или любого другого дебаггера.

    Код (Text):
    1. int __fastcall sub_14100(int a1)
    2. {
    3.   int v2; // r0
    4.   int v3; // r0
    5.   int v4; // r5
    6.   bool v6; // zf
    7.   int v7; // r4
    8.   int v8; // [sp+4h] [bp-174h] BYREF
    9.   char v9[32]; // [sp+8h] [bp-170h] BYREF
    10.   char v10[64]; // [sp+28h] [bp-150h] BYREF
    11.   char v11[272]; // [sp+68h] [bp-110h] BYREF
    12.  
    13.   sub_13A8C(v10, 0, 0x40);
    14.   v2 = sub_13A8C(v11, 0, 0x100);
    15.   v3 = sub_13C6C(v2);
    16.   sub_13D14((int)v10, "/proc/%d/status", v3);
    17.   v4 = sub_13A74(v10, "r");
    18.   if ( !v4 )
    19.     return 0;
    20.   v6 = a1 == 1;
    21.   v7 = a1 - 2;
    22.   if ( !v6 )
    23.   {
    24.     do
    25.     {
    26.       --v7;
    27.       sub_13A44((int)v11, 0x100, v4);
    28.     }
    29.     while ( v7 != 0xFFFFFFFF );
    30.   }
    31.   sub_13A44((int)v11, 0x100, v4);
    32.   sub_13B1C((int)v11, "%s %d", v9, &v8);
    33.   sub_13A38(v4);
    34.   return v8;
    35. }
    Ну и если посмотреть дамп, то тут видно, что он пытается получить статус скорее всего своего процесса.
    --- Сообщение объединено, 28 янв 2025 ---
    Статус в иде:
    Код (Text):
    1. Name:   ARMimg_maker
    2. State:  t (tracing stop)
    3. Tgid:   870
    4. Ngid:   0
    5. Pid:    870
    6. PPid:   868
    7. TracerPid:      868
    8. Uid:    0       0       0       0
    9. Gid:    0       0       0       0
    10. FDSize: 32
    11. Groups: 0
    12. VmPeak:      192 kB
    13. VmSize:      192 kB
    14. VmLck:         0 kB
    15. VmPin:         0 kB
    16. VmHWM:        12 kB
    17. VmRSS:        12 kB
    18. VmData:       36 kB
    19. VmStk:       136 kB
    20. VmExe:        20 kB
    21. VmLib:         0 kB
    22. VmPTE:         4 kB
    23. VmSwap:        0 kB
    24. Threads:        1
    25. SigQ:   1/963
    26. SigPnd: 0000000000000000
    27. ShdPnd: 0000000000000000
    28. SigBlk: 0000000000000000
    29. SigIgn: 0000000000000004
    30. SigCgt: 0000000000000000
    31. CapInh: 0000000000000000
    32. CapPrm: 0000001fffffffff
    33. CapEff: 0000001fffffffff
    34. CapBnd: 0000001fffffffff
    35. Cpus_allowed:   1
    36. Cpus_allowed_list:      0
    37. voluntary_ctxt_switches:        2
    38. nonvoluntary_ctxt_switches:     2
    Статус в gdb:
    Код (Text):
    1. Name:   ARMimg_maker
    2. State:  D (disk sleep)
    3. Tgid:   870
    4. Ngid:   0
    5. Pid:    870
    6. PPid:   868
    7. TracerPid:      868
    8. Uid:    0       0       0       0
    9. Gid:    0       0       0       0
    10. FDSize: 32
    11. Groups: 0
    12. VmPeak:     2004 kB
    13. VmSize:     2004 kB
    14. VmLck:         0 kB
    15. VmPin:         0 kB
    16. VmHWM:       660 kB
    17. VmRSS:       660 kB
    18. VmData:      324 kB
    19. VmStk:       264 kB
    20. VmExe:        20 kB
    21. VmLib:      1308 kB
    22. VmPTE:         6 kB
    23. VmSwap:        0 kB
    24. Threads:        1
    25. SigQ:   0/963
    26. SigPnd: 0000000000000000
    27. ShdPnd: 0000000000000000
    28. SigBlk: 0000000000000000
    29. SigIgn: 0000000000000004
    30. SigCgt: 0000000000000000
    31. CapInh: 0000000000000000
    32. CapPrm: 0000001fffffffff
    33. CapEff: 0000001fffffffff
    34. CapBnd: 0000001fffffffff
    35. Cpus_allowed:   1
    36. Cpus_allowed_list:      0
    37. voluntary_ctxt_switches:        1974
    38. nonvoluntary_ctxt_switches:     23
     
  4. Prober

    Prober Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    46
    Он самый, только сигнатуры битые. После восстановления распаковывается штатно.

    Распакованный.
     
    Zubastic и Marylin нравится это.
  5. Zubastic

    Zubastic New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2025
    Сообщения:
    7
    Большое спасибо) А какие именно сигнатуры они поломали? Хотелось бы это автоматизировать тк там все файлы этим покрыты.
    --- Сообщение объединено, 28 янв 2025 ---
    Ну и самое интересное лежит в файле https://github.com/ludwig-v/wireles...22.12.14.1100/Extracted/usr/sbin/ARMimg_maker
    --- Сообщение объединено, 28 янв 2025 ---
    Пробовал восстанавливать сигнатуры с помощью https://github.com/nozominetworks/upx-recovery-tool ну и смотрел сам с помощью https://cujo.com/blog/upx-anti-unpacking-techniques-in-iot-malware/
     
  6. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    490
    можно узнать шаги по де-паковке arm/upx?
     
  7. Prober

    Prober Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    46
    Сигнатура "UPX!" (байты 55 50 58 21) заменена на 55 22 55 22. В данном файле это сделано 3 раза. После обратной замены распаковывается под Windows обычной командой "upx -d".
     
    k3rnl, Zubastic и alex_dz нравится это.
  8. Zubastic

    Zubastic New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2025
    Сообщения:
    7
    Я поменял байты, однако он падает с ошибкой
    [​IMG]

    Версия была 3.9.5?
     
  9. Prober

    Prober Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    46
    Zubastic нравится это.
  10. Zubastic

    Zubastic New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2025
    Сообщения:
    7
    Получилось))
    Видимо это была старая версия
    На более новых https://github.com/ludwig-v/wireles...21.07.05.2308/Extracted/usr/sbin/ARMimg_maker так распаковать уже не выходит. Видимо они еще поломали заголовки.
    --- Сообщение объединено, 28 янв 2025 ---
    Нашел еще примеры:
    https://github.com/ludwig-v/wireles....03.1803/Extracted/etc/boa/cgi-bin/server.cgi - если вернуть сигнатуру назад, то распаковка успешна
    https://github.com/ludwig-v/wireles....08.1306/Extracted/etc/boa/cgi-bin/server.cgi - следующая версия, изменение сигнатуры уже не помогает
     
  11. Zubastic

    Zubastic New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2025
    Сообщения:
    7
    Интереснее даже сравнить вот эти файлы:
    https://github.com/ludwig-v/wireles....16.1452/Extracted/etc/boa/cgi-bin/upload.cgi - файл успешно распаковывается с подменой сигнатуры
    https://github.com/ludwig-v/wireles....08.1306/Extracted/etc/boa/cgi-bin/upload.cgi - файл НЕ распаковывается

    Однако если сравнить файлы, то получится вот такое:
    [​IMG]

    Разница всего в 100 байт. Такое ощущение, что товарищи заменили все 0x0A на 0x0D 0x0A.
    --- Сообщение объединено, 28 янв 2025 ---
    Поменял 0D 0A на 0A. Распаковалось :)
    --- Сообщение объединено, 28 янв 2025 ---
    Чтож следующая эволюция произошла позднее:
    https://github.com/ludwig-v/wireles....24.1526/Extracted/etc/boa/cgi-bin/upload.cgi - последний файл, который распаковывается успешно
    https://github.com/ludwig-v/wireles....17.1710/Extracted/etc/boa/cgi-bin/upload.cgi - новый крипт, файл вырос с 14 кб до 22.5. Содержимое уже отличается крайне сильно. Совпадений между версиями нет :dntknw:
    --- Сообщение объединено, 28 янв 2025 ---
    Если на старых версиях встречалась строка /etc/bluetooth/temp/addressme /etc/bluetooth/temp/addressit то в новых уже встречается /etc/bluetooth/temp/addressme a7775864862fd6bc7941a434d1cee
    Последнее это хэш коммита?
    --- Сообщение объединено, 28 янв 2025 ---
    А, нет, похоже на хэш файла.
    --- Сообщение объединено, 28 янв 2025 ---
    Причем похоже, что у упаковщика есть "злой" режим, которым пакуются самые важные файлы, такие как сама бизнес логика и "лайтовый", которым пакуется все остальное. Кстати от 0D 0A они отказались (с чего бы это вдруг, неужто получили коллизию, где это ломало работающий код?).
    Ну и в результате имеем:
    Код (Text):
    1. upx: E:\Stuff\ARMimg_maker: NotPackedException: not packed by UPX
    --- Сообщение объединено, 29 янв 2025 ---
    Причем особняком стоит файл https://github.com/ludwig-v/wireles...-engineering/blob/master/Reverse/ARMimg_maker он весит 18 кб, вместо 23кб в остальных сборках, но уже содержит в себе новый крипт.
     
  12. Zubastic

    Zubastic New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2025
    Сообщения:
    7
    В общем я в тупике. Крипт похож на upx, но что-то намешано.