frostegater, да, именно так, но немного не так. Ещё нужно, чтобы математика была точной и опираться на указанные в заголовке размеры:
- 0x28 - размер ELF декриптованного файла.
- 0x2C - размер всего файла с заголовком.
- 0xB0 - размер архива.
Только по твоей формуле как мы будем забивать декриптованный ELF нулями до размера
0x28, если он уже будет запакован

Тут нужно как-то изловчиться по другому...
- Считали некриптованый ELF файл
- Подобрали заголовок >= по позиции 0х28
- Забили ELF нулями до этого размера 0х28
- Зажали его
- Измерили размер архива
- (размер разархивированного архива записан в последних 4-ёх байтах GZ-архива, должен равняться позиции 0x28 - это и есть конец архива)
- Забили конец архива нулями до размера в позиции 0xB0
- Подписали
Я не понимаю, как у них
внутри архива оказывается конец на 1/3 архива, а остальное забито остатками декриптованного незаархивированного ELF. Они наверное архивируют не в чистое место памяти, а прямо туда же в начало, где находится ELF, потом отрезают по размеру 0xB0 и получается хвост не просто забитый нулями, а забитый остатками ELF
Причём зачем-то в последней строчке нулевого архива вставляют какой-то код. Оно ведь и так конец читать не будет и правильно разархивируется.