mirror of
https://github.com/palera1n/palera1n.git
synced 2026-10-30 21:19:48 +01:00
fix: do proper checks for pongo bin
This commit is contained in:
4 files changed
+31
-20
No files matched your search
@@ -88,6 +88,29 @@ payload_t g_payload_kpf = {
|
|||||||
.uncompressed_data_len = embedded_checkra1n_kpf_pongo_len,
|
.uncompressed_data_len = embedded_checkra1n_kpf_pongo_len,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define PONGO_MAX_SZ (0x7fe00)
|
||||||
|
#define MACHO_MAGIC_32 (0xFEEDFACE)
|
||||||
|
#define MACHO_MAGIC_64 (0xFEEDFACF)
|
||||||
|
|
||||||
|
bool check_payload_validity(const payload_t *payload, bool isPongo)
|
||||||
|
{
|
||||||
|
if (!payload || !payload->data || payload->data_len < 4)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const uint32_t magic = *(const uint32_t *)payload->data;
|
||||||
|
const bool isMachO = (magic == MACHO_MAGIC_32 || magic == MACHO_MAGIC_64);
|
||||||
|
|
||||||
|
if (isPongo) {
|
||||||
|
if (isMachO || payload->data_len > PONGO_MAX_SZ)
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
if (!isMachO)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool override_payload_from_file(const char *path, payload_t *out)
|
bool override_payload_from_file(const char *path, payload_t *out)
|
||||||
{
|
{
|
||||||
FILE *f = fopen(path, "rb");
|
FILE *f = fopen(path, "rb");
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ extern payload_t g_payload_kpf;
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bool check_payload_validity(const payload_t *payload, bool isPongo);
|
||||||
bool override_payload_from_file(const char *path, payload_t *out);
|
bool override_payload_from_file(const char *path, payload_t *out);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
+7
-15
@@ -333,11 +333,10 @@ void parse_arguments(int argc, char* argv[]) {
|
|||||||
LOG_ERROR("Failed to load pongo payload, is the path correct?");
|
LOG_ERROR("Failed to load pongo payload, is the path correct?");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (g_payload_pongo.data_len > PONGO_MAX_SZ) {
|
if (!check_payload_validity(&g_payload_pongo, true)) {
|
||||||
LOG_ERROR("Pongo payload is too large! %zu bytes (max %zu)", g_payload_pongo.data_len, PONGO_MAX_SZ);
|
LOG_ERROR("Pongo payload is invalid or too large! %zu bytes", g_payload_pongo.data_len);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
// TODO: check if macho, otherwise exit
|
|
||||||
LOG("Overriding pongo payload with %s", optarg);
|
LOG("Overriding pongo payload with %s", optarg);
|
||||||
break;
|
break;
|
||||||
case 'K': // --override-kpf
|
case 'K': // --override-kpf
|
||||||
@@ -345,11 +344,8 @@ void parse_arguments(int argc, char* argv[]) {
|
|||||||
LOG_ERROR("Failed to load kpf payload, is the path correct?");
|
LOG_ERROR("Failed to load kpf payload, is the path correct?");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (g_payload_kpf.data_len < 4
|
if (!check_payload_validity(&g_payload_kpf, false)) {
|
||||||
|| (memcmp(g_payload_kpf.data, MACHO_MAGIC_64, 4) != 0
|
LOG_ERROR("KPF payload is invalid! Is it a valid Mach-O binary?");
|
||||||
&& memcmp(g_payload_kpf.data, MACHO_MAGIC_32, 4) != 0))
|
|
||||||
{
|
|
||||||
LOG_ERROR("Invalid kpf payload, is it macho?");
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
LOG("Overriding kpf payload with %s", optarg);
|
LOG("Overriding kpf payload with %s", optarg);
|
||||||
@@ -476,8 +472,8 @@ void parse_arguments(int argc, char* argv[]) {
|
|||||||
LOG_ERROR("Failed to load pongo payload from env, is the path correct?");
|
LOG_ERROR("Failed to load pongo payload from env, is the path correct?");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (g_payload_pongo.data_len > PONGO_MAX_SZ) {
|
if (!check_payload_validity(&g_payload_pongo, true)) {
|
||||||
LOG_ERROR("Pongo payload is too large! %zu bytes (max %zu)", g_payload_pongo.data_len, PONGO_MAX_SZ);
|
LOG_ERROR("Pongo payload is invalid or too large! %zu bytes", g_payload_pongo.data_len);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
LOG("Overriding pongo payload with %s (from env)", env_pongo);
|
LOG("Overriding pongo payload with %s (from env)", env_pongo);
|
||||||
@@ -489,10 +485,7 @@ void parse_arguments(int argc, char* argv[]) {
|
|||||||
LOG_ERROR("Failed to load kpf payload from env, is the path correct?");
|
LOG_ERROR("Failed to load kpf payload from env, is the path correct?");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (g_payload_kpf.data_len < 4
|
if (!check_payload_validity(&g_payload_kpf, false)) {
|
||||||
|| (memcmp(g_payload_kpf.data, MACHO_MAGIC_64, 4) != 0
|
|
||||||
&& memcmp(g_payload_kpf.data, MACHO_MAGIC_32, 4) != 0))
|
|
||||||
{
|
|
||||||
LOG_ERROR("Invalid kpf payload from env, is it macho?");
|
LOG_ERROR("Invalid kpf payload from env, is it macho?");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@@ -517,7 +510,6 @@ void parse_arguments(int argc, char* argv[]) {
|
|||||||
LOG("Overriding ramdisk payload with %s (from env)", env_ramdisk);
|
LOG("Overriding ramdisk payload with %s (from env)", env_ramdisk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// MARK: Flag checks
|
// MARK: Flag checks
|
||||||
|
|
||||||
if ((palerain_flags & palerain_option_pongo_exit) &&
|
if ((palerain_flags & palerain_option_pongo_exit) &&
|
||||||
|
|||||||
@@ -46,11 +46,6 @@ typedef transfer_ret_t p1_transfer_ret_t;
|
|||||||
typedef checkm8_err_t p1_checkm8_err_t;
|
typedef checkm8_err_t p1_checkm8_err_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PONGO_MAX_SZ (0x7fe00)
|
|
||||||
// used for checking overridden files (KPF mainly)
|
|
||||||
#define MACHO_MAGIC_32 (const unsigned char[]){ 0xCE, 0xFA, 0xED, 0xFE }
|
|
||||||
#define MACHO_MAGIC_64 (const unsigned char[]){ 0xCF, 0xFA, 0xED, 0xFE }
|
|
||||||
|
|
||||||
p1_checkm8_err_t send_compressed_pongo(p1_usb_handle_t *handle, const uint8_t *pongo_bin, const size_t pongo_bin_length);
|
p1_checkm8_err_t send_compressed_pongo(p1_usb_handle_t *handle, const uint8_t *pongo_bin, const size_t pongo_bin_length);
|
||||||
p1_checkm8_err_t send_full_pongo_jailbreak(p1_usb_handle_t *handle);
|
p1_checkm8_err_t send_full_pongo_jailbreak(p1_usb_handle_t *handle);
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user