[*] Binary protection state of libip6tc.so.0.1.0
Partial RELRO No Canary found NX disabled DSO No RPATH No RUNPATH No Symbols
[*] Function strcpy tear down of libip6tc.so.0.1.0
; assembly | /* r2dec pseudo code output */
| /* /logs/firmware/unblob_extracted/firmware_extract/56048-12514271.gzip_extract/gzip.uncompressed_extract/5243916-15068666.gzip_extract/gzip.uncompressed_extract/usr/lib/libip6tc.so.0.1.0 @ 0x3a94 */
| #include <stdint.h>
|
; (fcn) sym.ip6tc_commit () | uint32_t ip6tc_commit (int32_t arg_0h, int32_t arg_8h, char * src, int32_t arg_48h, int32_t arg_74h, int32_t arg1) {
| int32_t var_0h;
| int32_t var_8h;
| int32_t var_ch;
| char * var_10h;
| int32_t var_14h;
| char * var_18h;
| int32_t var_1ch;
| int32_t var_24h;
| r0 = arg1;
0x00003a94 ldr r3, [pc, 0x5ac] | r3 = *(0x4044);
0x00003a98 ldr r2, [pc, 0x5ac] | r2 = *(0x4048);
0x00003a9c add r3, pc, r3 | r3 = pc + r3;
0x00003aa0 ldr r2, [r3, r2] | r2 = *(0x4044);
0x00003aa4 ldr r3, [pc, 0x5a4] | r3 = *(0x404c);
0x00003aa8 add r3, pc, r3 | r3 = pc + r3;
0x00003aac str r2, [r3] | *(r3) = r2;
0x00003ab0 ldr r3, [r0, 4] | r3 = *((r0 + 4));
0x00003ab4 cmp r3, 0 |
| if (r3 == 0) {
0x00003ab8 beq 0x4040 | goto label_11;
| }
0x00003abc mov r1, r0 | r1 = r0;
0x00003ac0 push {r4, r5, r6, r7, r8, sb, sl, fp, lr} |
0x00003ac4 ldr r6, [r1, 8]! | r6 = *((r1 += 8));
0x00003ac8 mov r3, 0 | r3 = 0;
0x00003acc sub sp, sp, 0x24 |
0x00003ad0 mov sl, r6 | sl = r6;
0x00003ad4 mov sb, r3 | sb = r3;
| do {
0x00003ad8 cmp sl, r1 |
0x00003adc add r8, r3, 1 | r8 = r3 + 1;
| if (sl == r1) {
0x00003ae0 bne 0x3b04 |
0x00003ae4 cmp r8, 0 |
0x00003ae8 mov fp, r0 |
| if (r8 >= 0) {
0x00003aec bge 0x3b58 | goto label_12;
| }
| label_1:
0x00003af0 bl 0xff4 | errno_location ();
0x00003af4 mov r3, 0xc | r3 = 0xc;
0x00003af8 str r3, [r0] | *(r0) = r3;
| label_2:
0x00003afc mov r0, 0 | r0 = 0;
0x00003b00 b 0x3cf0 | goto label_13;
| }
0x00003b04 ldr r2, [sl, 0x28] | r2 = *((sl + 0x28));
0x00003b08 mov lr, sl | lr = sl;
0x00003b0c cmp r2, 0 |
0x00003b10 ldr r2, [lr, 0x54]! | r2 = *((lr += 0x54));
0x00003b14 str sb, [sl, 0x60] | *((sl + 0x60)) = sb;
| if (r2 != 0) {
0x00003b18 moveq r3, r8 | r3 = r8;
| }
| if (r2 != 0) {
0x00003b1c addeq sb, sb, 0xe8 | sb += 0xe8;
| }
| label_0:
0x00003b20 cmp r2, lr |
0x00003b24 mov ip, r3 |
0x00003b28 add r3, r3, 1 | r3++;
| if (r2 != lr) {
0x00003b2c streq sb, [sl, 0x68] | *((sl + 0x68)) = sb;
| }
| if (r2 != lr) {
0x00003b30 streq ip, [sl, 0x64] | *((sl + 0x64)) = ip;
| }
| if (r2 != lr) {
0x00003b34 addeq sb, sb, 0xd0 | sb += 0xd0;
| }
| if (r2 != lr) {
0x00003b38 ldreq sl, [sl] | sl = *(sl);
| }
0x00003b3c beq 0x3ad8 |
| } while (r2 == lr);
0x00003b40 str ip, [r2, 0x14] | *((r2 + 0x14)) = ip;
0x00003b44 ldr ip, [r2, 0x24] | ip = *((r2 + 0x24));
0x00003b48 str sb, [r2, 0x18] | *((r2 + 0x18)) = sb;
0x00003b4c add sb, sb, ip | sb += ip;
0x00003b50 ldr r2, [r2] | r2 = *(r2);
0x00003b54 b 0x3b20 | goto label_0;
| label_12:
0x00003b58 add r5, sb, 0x148 | r5 = sb + 0x148;
0x00003b5c mov r0, r5 | r0 = r5;
0x00003b60 bl 0xf4c | r0 = malloc (r0);
0x00003b64 subs r4, r0, 0 | r4 = r0 - 0;
| if (r4 == r0) {
0x00003b68 beq 0x3af0 | goto label_1;
| }
0x00003b6c mov r2, r5 | r2 = r5;
0x00003b70 mov r1, 0 | r1 = 0;
0x00003b74 bl 0xfb8 | memset (r0, r1, r2);
0x00003b78 ldr r7, [fp, 0x74] | r7 = *(arg_74h);
0x00003b7c lsl r0, r7, 4 | r0 = r7 << 4;
0x00003b80 bl 0xf4c | r0 = malloc (r0);
0x00003b84 cmp r0, 0 |
0x00003b88 str r0, [r4, 0x58] | *((r4 + 0x58)) = r0;
| if (r0 != 0) {
0x00003b8c bne 0x3ba8 | goto label_14;
| }
0x00003b90 bl 0xff4 | errno_location ();
0x00003b94 mov r3, 0xc | r3 = 0xc;
0x00003b98 str r3, [r0] | *(r0) = r3;
| do {
0x00003b9c mov r0, r4 | r0 = r4;
0x00003ba0 bl 0x103c | free (r0);
0x00003ba4 b 0x3afc | goto label_2;
| label_14:
0x00003ba8 lsl r3, r8, 4 | r3 = r8 << 4;
0x00003bac add r3, r3, 0x28 | r3 += 0x28;
0x00003bb0 mov r0, r3 | r0 = r3;
0x00003bb4 str r3, [sp, 8] | var_8h = r3;
0x00003bb8 bl 0xf4c | r0 = malloc (r0);
0x00003bbc subs r5, r0, 0 | r5 = r0 - 0;
| if (r5 != r0) {
0x00003bc0 bne 0x3bdc | goto label_15;
| }
0x00003bc4 bl 0xff4 | errno_location ();
0x00003bc8 mov r3, 0xc | r3 = 0xc;
0x00003bcc str r3, [r0] | *(r0) = r3;
| label_10:
0x00003bd0 ldr r0, [r4, 0x58] | r0 = *((r4 + 0x58));
0x00003bd4 bl 0x103c | free (r0);
0x00003bd8 b 0x3b9c |
| } while (1);
| label_15:
0x00003bdc ldr r2, [sp, 8] | r2 = var_8h;
0x00003be0 mov r1, 0 | r1 = 0;
0x00003be4 bl 0xfb8 | memset (r0, r1, r2);
0x00003be8 add r3, fp, 0x28 | r3 += src;
0x00003bec mov r1, r3 | r1 = r3;
0x00003bf0 mov r0, r4 | r0 = r4;
0x00003bf4 str r3, [sp, 0x10] | var_10h = r3;
0x00003bf8 bl 0xeec | strcpy (r0, r1)
0x00003bfc ldr r3, [fp, 0x48] | r3 = *(arg_48h);
0x00003c00 add sb, sb, 0xe8 | sb += 0xe8;
0x00003c04 str r3, [r4, 0x20] | *((r4 + 0x20)) = r3;
0x00003c08 ldr r3, [pc, 0x444] | r3 = *(0x4050);
0x00003c0c str r8, [r4, 0x24] | *((r4 + 0x24)) = r8;
0x00003c10 add r3, pc, r3 | r3 = pc + r3;
0x00003c14 str sb, [r4, 0x28] | *((r4 + 0x28)) = sb;
0x00003c18 str r7, [r4, 0x54] | *((r4 + 0x54)) = r7;
0x00003c1c str r3, [sp, 0x18] | var_18h = r3;
| do {
0x00003c20 add r3, r4, 0x60 | r3 = r4 + 0x60;
0x00003c24 cmp sl, r6 |
0x00003c28 str r3, [sp, 0xc] | var_ch = r3;
| if (sl == r6) {
0x00003c2c bne 0x3cf8 |
0x00003c30 ldr r6, [r4, 0x28] | r6 = *((r4 + 0x28));
0x00003c34 ldr sb, [pc, 0x41c] | sb = *(0x4054);
0x00003c38 sub r6, r6, 0xe8 | r6 -= 0xe8;
0x00003c3c add r6, r3, r6 | r6 = r3 + r6;
0x00003c40 ldr r3, [pc, 0x414] |
0x00003c44 mov r7, 0x40 | r7 = 0x40;
0x00003c48 add sb, pc, sb | sb = pc + sb;
0x00003c4c str r3, [r6, 0x8c] | *((r6 + 0x8c)) = r3;
0x00003c50 mov r1, sb | r1 = sb;
0x00003c54 strh r7, [r6, 0xa8] | *((r6 + 0xa8)) = r7;
0x00003c58 add r0, r6, 0xaa | r0 = r6 + 0xaa;
0x00003c5c bl 0xeec | strcpy (r0, r1)
0x00003c60 mov r1, sb | r1 = sb;
0x00003c64 add r0, r6, 0xc8 | r0 = r6 + 0xc8;
0x00003c68 bl 0xeec | strcpy (r0, r1)
0x00003c6c ldr r3, [r4, 0x28] | r3 = *((r4 + 0x28));
0x00003c70 mov r2, r7 | r2 = r7;
0x00003c74 add r3, r3, 0x60 | r3 = 0x40b8;
0x00003c78 str r3, [sp] | *(sp) = r3;
0x00003c7c mov r1, 0x29 | r1 = 0x29;
0x00003c80 mov r3, r4 | r3 = r4;
0x00003c84 ldr r0, [fp] | r0 = *(fp);
0x00003c88 bl 0xf94 | r0 = setsockopt ();
0x00003c8c cmp r0, 0 |
| if (r0 < 0) {
0x00003c90 blt 0x4034 | goto label_16;
| }
0x00003c94 ldr r1, [sp, 0x10] | r1 = var_10h;
0x00003c98 mov r0, r5 | r0 = r5;
0x00003c9c bl 0xeec | strcpy (r0, r1)
0x00003ca0 ldr r6, [fp, 8] | r6 = *(arg_8h);
0x00003ca4 str r8, [r5, 0x20] | *((r5 + 0x20)) = r8;
| label_6:
0x00003ca8 cmp r6, sl |
| if (r6 != sl) {
0x00003cac bne 0x3e60 | goto label_17;
| }
0x00003cb0 ldr r3, [sp, 8] | r3 = var_8h;
0x00003cb4 mov r2, 0x41 | r2 = 0x41;
0x00003cb8 str r3, [sp] | *(sp) = r3;
0x00003cbc mov r1, 0x29 | r1 = 0x29;
0x00003cc0 mov r3, r5 | r3 = r5;
0x00003cc4 ldr r0, [fp] | r0 = *(fp);
0x00003cc8 bl 0xf94 | r0 = setsockopt ();
0x00003ccc cmp r0, 0 |
| if (r0 < 0) {
0x00003cd0 blt 0x4034 | goto label_16;
| }
0x00003cd4 ldr r0, [r4, 0x58] | r0 = *((r4 + 0x58));
0x00003cd8 bl 0x103c | free (r0);
0x00003cdc mov r0, r4 | r0 = r4;
0x00003ce0 bl 0x103c | free (r0);
0x00003ce4 mov r0, r5 | r0 = r5;
0x00003ce8 bl 0x103c | free (r0);
0x00003cec mov r0, 1 | r0 = 1;
| label_13:
0x00003cf0 add sp, sp, 0x24 |
0x00003cf4 pop {r4, r5, r6, r7, r8, sb, sl, fp, pc} |
| }
0x00003cf8 ldr sb, [r6, 0x28] | sb = *((r6 + 0x28));
0x00003cfc ldr r7, [r6, 0x60] | r7 = *((r6 + 0x60));
0x00003d00 cmp sb, 0 |
| if (sb != 0) {
0x00003d04 bne 0x3db4 | goto label_18;
| }
0x00003d08 ldr r3, [sp, 0xc] | r3 = var_ch;
0x00003d0c ldr r1, [pc, 0x34c] | r1 = *(0x405c);
0x00003d10 add r7, r3, r7 | r7 = r3 + r7;
0x00003d14 ldr r3, [pc, 0x340] | r3 = *(0x4058);
0x00003d18 add r1, pc, r1 | r1 = pc + r1;
0x00003d1c str r3, [r7, 0x8c] | *((r7 + 0x8c)) = r3;
0x00003d20 add r0, r7, 0xaa | r0 = r7 + 0xaa;
0x00003d24 bl 0xeec | strcpy (r0, r1)
0x00003d28 mov r3, 0x40 | r3 = 0x40;
0x00003d2c strh r3, [r7, 0xa8] | *((r7 + 0xa8)) = r3;
0x00003d30 mov r2, 0x1e | r2 = 0x1e;
0x00003d34 add r1, r6, 8 | r1 = r6 + 8;
0x00003d38 add r0, r7, 0xc8 | r0 = r7 + 0xc8;
0x00003d3c bl 0xfa0 | strncpy (r0, r1, r2);
0x00003d40 strb sb, [r7, 0xe5] | *((r7 + 0xe5)) = sb;
| label_3:
0x00003d44 mov r3, r6 | r3 = r6;
0x00003d48 ldr r7, [r3, 0x54]! | r7 = *((r3 += 0x54));
0x00003d4c str r3, [sp, 0x14] | var_14h = r3;
| label_4:
0x00003d50 ldr r3, [sp, 0x14] | r3 = var_14h;
0x00003d54 cmp r7, r3 |
| if (r7 != r3) {
0x00003d58 bne 0x3dc8 | goto label_19;
| }
0x00003d5c ldr r7, [r6, 0x68] | r7 = *((r6 + 0x68));
0x00003d60 ldr r3, [sp, 0xc] | r3 = var_ch;
0x00003d64 ldr r1, [pc, 0x2f8] | r1 = *(0x4060);
0x00003d68 add r7, r3, r7 | r7 = r3 + r7;
0x00003d6c ldr r3, [pc, 0x2f4] | r3 = *(0x4064);
0x00003d70 add r1, pc, r1 | r1 = pc + r1;
0x00003d74 str r3, [r7, 0x8c] | *((r7 + 0x8c)) = r3;
0x00003d78 add r0, r7, 0xaa | r0 = r7 + 0xaa;
0x00003d7c bl 0xeec | strcpy (r0, r1)
0x00003d80 mov r3, 0x28 | r3 = 0x28;
0x00003d84 strh r3, [r7, 0xa8] | *((r7 + 0xa8)) = r3;
0x00003d88 ldr r3, [r6, 0x28] | r3 = *((r6 + 0x28));
0x00003d8c add r1, r6, 0x38 | r1 = r6 + 0x38;
0x00003d90 cmp r3, 0 |
| if (r3 == 0) {
0x00003d94 ldrne r3, [r6, 0x30] | r3 = *((r6 + 0x30));
| }
| if (r3 != 0) {
0x00003d98 mvneq r3, 4 | r3 = ~4;
| }
0x00003d9c str r3, [r7, 0xc8] | *((r7 + 0xc8)) = r3;
0x00003da0 mov r2, 0x10 | r2 = 0x10;
0x00003da4 add r0, r7, 0x98 | r0 = r7 + 0x98;
0x00003da8 bl 0xf28 | memcpy (r0, r1, r2);
0x00003dac ldr r6, [r6] | r6 = *(r6);
0x00003db0 b 0x3c20 |
| } while (1);
| label_18:
0x00003db4 ldr r3, [r6, 0x68] | r3 = *((r6 + 0x68));
0x00003db8 add sb, r4, sb, lsl 2 | sb = r4 + (sb << 2);
0x00003dbc str r7, [sb, 0x28] | *((sb + 0x28)) = r7;
0x00003dc0 str r3, [sb, 0x3c] | *((sb + 0x3c)) = r3;
0x00003dc4 b 0x3d44 | goto label_3;
| label_19:
0x00003dc8 ldr r3, [r7, 0x1c] | r3 = *((r7 + 0x1c));
0x00003dcc add r2, r7, 0x28 | r2 = r7 + 0x28;
0x00003dd0 cmp r3, 3 |
0x00003dd4 str r2, [sp, 0x1c] | var_1ch = r2;
| if (r3 != 3) {
0x00003dd8 bne 0x3e38 | goto label_20;
| }
0x00003ddc ldrh sb, [r7, 0xb4] | sb = *((r7 + 0xb4));
0x00003de0 mov r1, 0 | r1 = 0;
0x00003de4 add sb, r2, sb | sb = r2 + sb;
0x00003de8 add r3, sb, 2 | r3 = sb + 2;
0x00003dec mov r0, r3 | r0 = r3;
0x00003df0 mov r2, 0x1d | r2 = 0x1d;
0x00003df4 bl 0xfb8 | memset (r0, r1, r2);
0x00003df8 ldr r1, [sp, 0x18] | r1 = var_18h;
0x00003dfc bl 0xeec | strcpy (r0, r1)
0x00003e00 mov r3, 0 | r3 = 0;
0x00003e04 strb r3, [sb, 0x1f] | *((sb + 0x1f)) = r3;
0x00003e08 ldr r3, [r7, 0x20] | r3 = *((r7 + 0x20));
0x00003e0c ldr r3, [r3, 0x60] | r3 = *((r3 + 0x60));
0x00003e10 add r3, r3, 0xe8 | r3 += 0xe8;
0x00003e14 str r3, [sb, 0x20] | *((sb + 0x20)) = r3;
| do {
| label_5:
0x00003e18 ldr r0, [r7, 0x18] | r0 = *((r7 + 0x18));
0x00003e1c ldr r3, [sp, 0xc] | r3 = var_ch;
0x00003e20 ldr r2, [r7, 0x24] | r2 = *((r7 + 0x24));
0x00003e24 add r1, r7, 0x28 | r1 = r7 + 0x28;
0x00003e28 add r0, r3, r0 | r0 = r3 + r0;
0x00003e2c bl 0xf28 | memcpy (r0, r1, r2);
0x00003e30 ldr r7, [r7] | r7 = *(r7);
0x00003e34 b 0x3d50 | goto label_4;
| label_20:
0x00003e38 cmp r3, 2 |
0x00003e3c bne 0x3e18 |
| } while (r3 != 2);
0x00003e40 ldrh r3, [r7, 0xb4] | r3 = *((r7 + 0xb4));
0x00003e44 add r2, r7, 0x28 | r2 = r7 + 0x28;
0x00003e48 add r3, r2, r3 | r3 = r2 + r3;
0x00003e4c ldr r1, [r7, 0x18] | r1 = *((r7 + 0x18));
0x00003e50 ldr r2, [r7, 0x24] | r2 = *((r7 + 0x24));
0x00003e54 add r2, r2, r1 | r2 += r1;
0x00003e58 str r2, [r3, 0x20] | *((r3 + 0x20)) = r2;
0x00003e5c b 0x3e18 | goto label_5;
| label_17:
0x00003e60 ldr r3, [r6, 0x28] | r3 = *((r6 + 0x28));
0x00003e64 cmp r3, 0 |
| if (r3 == 0) {
0x00003e68 beq 0x3eac | goto label_7;
| }
0x00003e6c ldr r3, [r6, 0x48] | r3 = *((r6 + 0x48));
0x00003e70 cmp r3, 3 |
| if (r3 > 3) {
| /* switch table (4 cases) at 0x3e7c */
0x00003e74 addls pc, pc, r3, lsl 2 | pc += (r3 << 2);
| }
0x00003e78 b 0x3eac | goto label_7;
0x00003e7c b 0x3e8c | goto label_21;
0x00003e80 b 0x3ec4 | goto label_22;
0x00003e84 b 0x3ee8 | goto label_23;
0x00003e88 b 0x3f3c | goto label_24;
| label_21:
0x00003e8c ldr r3, [r6, 0x64] | r3 = *((r6 + 0x64));
0x00003e90 mov r0, 0 | r0 = 0;
0x00003e94 add r2, r5, r3, lsl 4 | r2 = r5 + (r3 << 4);
0x00003e98 add r3, r3, 3 | r3 += 3;
0x00003e9c mov r1, 0 | r1 = 0;
0x00003ea0 lsl r3, r3, 4 | r3 <<= 4;
0x00003ea4 strd r0, r1, [r2, 0x28] | __asm ("strd r0, r1, [r2, 0x28]");
0x00003ea8 strd r0, r1, [r5, r3] | __asm ("strd r0, r1, [r5, r3]");
| do {
| label_7:
0x00003eac mov r8, r6 | r8 = r6;
0x00003eb0 ldr r7, [r8, 0x54]! | r7 = *((r8 += 0x54));
| label_8:
0x00003eb4 cmp r7, r8 |
| if (r7 != r8) {
0x00003eb8 bne 0x3f58 | goto label_25;
| }
0x00003ebc ldr r6, [r6] | r6 = *(r6);
0x00003ec0 b 0x3ca8 | goto label_6;
| label_22:
0x00003ec4 ldr r2, [r6, 0x4c] | r2 = *((r6 + 0x4c));
0x00003ec8 ldr r3, [r4, 0x58] | r3 = *((r4 + 0x58));
0x00003ecc ldr ip, [r6, 0x64] | ip = *((r6 + 0x64));
0x00003ed0 add r3, r3, r2, lsl 4 | r3 += (r2 << 4);
0x00003ed4 ldm r3, {r0, r1, r2, r3} | r0 = *(r3);
| r1 = *((r3 + 4));
| r2 = *((r3 + 8));
| r3 = *((r3 + 12));
0x00003ed8 add ip, r5, ip, lsl 4 |
0x00003edc add ip, ip, 0x28 |
0x00003ee0 stm ip, {r0, r1, r2, r3} | *(ip) = r0;
| *((ip + 4)) = r1;
| *((ip + 8)) = r2;
| *((ip + 12)) = r3;
0x00003ee4 b 0x3eac |
| } while (1);
| label_23:
0x00003ee8 ldr r3, [r6, 0x4c] | r3 = *((r6 + 0x4c));
0x00003eec ldr r2, [r4, 0x58] | r2 = *((r4 + 0x58));
0x00003ef0 lsl r3, r3, 4 | r3 <<= 4;
0x00003ef4 ldrd r0, r1, [r2, r3] | __asm ("ldrd r0, r1, [r2, r3]");
0x00003ef8 ldr ip, [r6, 0x64] | ip = *((r6 + 0x64));
0x00003efc add lr, r2, r3 | lr = r2 + r3;
0x00003f00 ldrd r2, r3, [r6, 0x38] | __asm ("ldrd r2, r3, [r6, 0x38]");
0x00003f04 add r7, r5, ip, lsl 4 | r7 = r5 + (ip << 4);
0x00003f08 subs r0, r0, r2 | r0 -= r2;
0x00003f0c sbc r1, r1, r3 | __asm ("sbc r1, r1, r3");
0x00003f10 mov r8, r0 | r8 = r0;
0x00003f14 mov sb, r1 | sb = r1;
0x00003f18 strd r8, sb, [r7, 0x28] | __asm ("strd r8, sb, [r7, 0x28]");
0x00003f1c ldrd r0, r1, [lr, 8] | __asm ("ldrd r0, r1, [lr, 8]");
0x00003f20 ldrd r2, r3, [r6, 0x40] | __asm ("ldrd r2, r3, [r6, 0x40]");
0x00003f24 subs r0, r0, r2 | r0 -= r2;
0x00003f28 sbc r1, r1, r3 | __asm ("sbc r1, r1, r3");
0x00003f2c mov r8, r0 | r8 = r0;
0x00003f30 mov sb, r1 | sb = r1;
0x00003f34 strd r8, sb, [r7, 0x30] | __asm ("strd r8, sb, [r7, 0x30]");
0x00003f38 b 0x3eac | goto label_7;
| label_24:
0x00003f3c ldr r0, [r6, 0x64] | r0 = *((r6 + 0x64));
0x00003f40 mov r2, 0x10 | r2 = 0x10;
0x00003f44 add r0, r5, r0, lsl 4 | r0 = r5 + (r0 << 4);
0x00003f48 add r1, r6, 0x38 | r1 = r6 + 0x38;
0x00003f4c add r0, r0, 0x28 | r0 += 0x28;
0x00003f50 bl 0xf28 | memcpy (r0, r1, r2);
0x00003f54 b 0x3eac | goto label_7;
| label_25:
0x00003f58 ldr r3, [r7, 0xc] | r3 = *((r7 + 0xc));
0x00003f5c cmp r3, 3 |
| if (r3 > 3) {
| /* switch table (4 cases) at 0x3f68 */
0x00003f60 addls pc, pc, r3, lsl 2 | pc += (r3 << 2);
| }
0x00003f64 b 0x3f98 | goto label_9;
0x00003f68 b 0x3f78 | goto label_26;
0x00003f6c b 0x3fa0 | goto label_27;
0x00003f70 b 0x3fc4 | goto label_28;
0x00003f74 b 0x4018 | goto label_29;
| label_26:
0x00003f78 ldr r3, [r7, 0x14] | r3 = *((r7 + 0x14));
0x00003f7c mov r0, 0 | r0 = 0;
0x00003f80 add r2, r5, r3, lsl 4 | r2 = r5 + (r3 << 4);
0x00003f84 add r3, r3, 3 | r3 += 3;
0x00003f88 mov r1, 0 | r1 = 0;
0x00003f8c lsl r3, r3, 4 | r3 <<= 4;
0x00003f90 strd r0, r1, [r2, 0x28] | __asm ("strd r0, r1, [r2, 0x28]");
0x00003f94 strd r0, r1, [r5, r3] | __asm ("strd r0, r1, [r5, r3]");
| do {
| label_9:
0x00003f98 ldr r7, [r7] | r7 = *(r7);
0x00003f9c b 0x3eb4 | goto label_8;
| label_27:
0x00003fa0 ldr r2, [r7, 0x10] | r2 = *((r7 + 0x10));
0x00003fa4 ldr r3, [r4, 0x58] | r3 = *((r4 + 0x58));
0x00003fa8 ldr ip, [r7, 0x14] | ip = *((r7 + 0x14));
0x00003fac add r3, r3, r2, lsl 4 | r3 += (r2 << 4);
0x00003fb0 ldm r3, {r0, r1, r2, r3} | r0 = *(r3);
| r1 = *((r3 + 4));
| r2 = *((r3 + 8));
| r3 = *((r3 + 12));
0x00003fb4 add ip, r5, ip, lsl 4 |
0x00003fb8 add ip, ip, 0x28 |
0x00003fbc stm ip, {r0, r1, r2, r3} | *(ip) = r0;
| *((ip + 4)) = r1;
| *((ip + 8)) = r2;
| *((ip + 12)) = r3;
0x00003fc0 b 0x3f98 |
| } while (1);
| label_28:
0x00003fc4 ldr r3, [r7, 0x10] | r3 = *((r7 + 0x10));
0x00003fc8 ldr r2, [r4, 0x58] | r2 = *((r4 + 0x58));
0x00003fcc lsl r3, r3, 4 | r3 <<= 4;
0x00003fd0 ldrd r0, r1, [r2, r3] | __asm ("ldrd r0, r1, [r2, r3]");
0x00003fd4 ldr ip, [r7, 0x14] | ip = *((r7 + 0x14));
0x00003fd8 add lr, r2, r3 | lr = r2 + r3;
0x00003fdc ldrd r2, r3, [r7, 0xc0] | __asm ("ldrd r2, r3, [r7, 0xc0]");
0x00003fe0 add sb, r5, ip, lsl 4 | sb = r5 + (ip << 4);
0x00003fe4 subs r0, r0, r2 | r0 -= r2;
0x00003fe8 sbc r1, r1, r3 | __asm ("sbc r1, r1, r3");
0x00003fec mov r2, r0 | r2 = r0;
0x00003ff0 mov r3, r1 | r3 = r1;
0x00003ff4 strd r2, r3, [sb, 0x28] | __asm ("strd r2, r3, [sb, 0x28]");
0x00003ff8 ldrd r2, r3, [r7, 0xc8] | __asm ("ldrd r2, r3, [r7, 0xc8]");
0x00003ffc ldrd r0, r1, [lr, 8] | __asm ("ldrd r0, r1, [lr, 8]");
0x00004000 subs r0, r0, r2 | r0 -= r2;
0x00004004 sbc r1, r1, r3 | __asm ("sbc r1, r1, r3");
0x00004008 mov r2, r0 | r2 = r0;
0x0000400c mov r3, r1 | r3 = r1;
0x00004010 strd r2, r3, [sb, 0x30] | __asm ("strd r2, r3, [sb, 0x30]");
0x00004014 b 0x3f98 | goto label_9;
| label_29:
0x00004018 ldr r0, [r7, 0x14] | r0 = *((r7 + 0x14));
0x0000401c mov r2, 0x10 | r2 = 0x10;
0x00004020 add r0, r5, r0, lsl 4 | r0 = r5 + (r0 << 4);
0x00004024 add r1, r7, 0xc0 | r1 = r7 + 0xc0;
0x00004028 add r0, r0, 0x28 | r0 += 0x28;
0x0000402c bl 0xf28 | memcpy (r0, r1, r2);
0x00004030 b 0x3f98 | goto label_9;
| label_16:
0x00004034 mov r0, r5 | r0 = r5;
0x00004038 bl 0x103c | free (r0);
0x0000403c b 0x3bd0 | goto label_10;
| label_11:
0x00004040 mov r0, 1 | r0 = 1;
0x00004044 bx lr | return r0;
| }
; assembly | /* r2dec pseudo code output */
| /* /logs/firmware/unblob_extracted/firmware_extract/56048-12514271.gzip_extract/gzip.uncompressed_extract/5243916-15068666.gzip_extract/gzip.uncompressed_extract/usr/lib/libip6tc.so.0.1.0 @ 0x21a8 */
| #include <stdint.h>
|
; (fcn) sym.ip6tc_init () | void ip6tc_init (char * arg1) {
| int32_t var_0h;
| char * src;
| int32_t var_ch;
| int32_t var_10h;
| char * s2;
| int32_t var_64h;
| int32_t var_20h;
| int32_t var_24h;
| int32_t var_28h;
| char * dest;
| size_t size;
| int32_t var_80h;
| int32_t var_84h;
| r0 = arg1;
0x000021a8 ldr r3, [pc, 0x4b4] | r3 = *(0x2660);
0x000021ac push {r4, r5, r6, r7, r8, sb, sl, fp, lr} |
0x000021b0 ldr r7, [pc, 0x4b0] | r7 = *(0x2664);
0x000021b4 sub sp, sp, 0x84 |
0x000021b8 add r3, pc, r3 | r3 = pc + r3;
0x000021bc str r3, [sp, 0xc] | var_ch = r3;
0x000021c0 ldr r3, [pc, 0x4a4] | r3 = *(0x2668);
0x000021c4 add r7, pc, r7 | r7 = pc + r7;
0x000021c8 str r0, [sp, 8] | src = r0;
0x000021cc ldr r3, [r7, r3] | r3 = *(0x2664);
0x000021d0 str r3, [sp, 0x10] | var_10h = r3;
0x000021d4 ldr r3, [pc, 0x494] | r3 = *(0x266c);
0x000021d8 add r3, pc, r3 | r3 = pc + r3;
0x000021dc str r3, [sp, 0x14] | s2 = r3;
| label_1:
0x000021e0 ldr r3, [sp, 0xc] | r3 = var_ch;
0x000021e4 ldr r2, [sp, 0x10] | r2 = var_10h;
0x000021e8 ldr r0, [sp, 8] | r0 = src;
0x000021ec str r2, [r3] | *(r3) = r2;
0x000021f0 bl 0x100c | r0 = strlen (r0);
0x000021f4 cmp r0, 0x1f |
| if (r0 < 0x1f) {
0x000021f8 bls 0x2210 | goto label_12;
| }
0x000021fc bl 0xff4 | errno_location ();
0x00002200 mov r3, 0x16 | r3 = 0x16;
0x00002204 str r3, [r0] | *(r0) = r3;
| do {
| label_0:
0x00002208 mov r4, 0 | r4 = 0;
0x0000220c b 0x2468 | goto label_13;
| label_12:
0x00002210 mov r2, 0xff | r2 = 0xff;
0x00002214 mov r1, 3 | r1 = 3;
0x00002218 mov r0, 0xa | r0 = 0xa;
0x0000221c bl 0xf58 | r0 = socket (r0, r1, r2);
0x00002220 subs r5, r0, 0 | r5 = r0 - 0;
0x00002224 blt 0x2208 |
| } while (r5 < r0);
0x00002228 mov r2, 1 | r2 = 1;
0x0000222c mov r1, 2 | r1 = 2;
0x00002230 bl 0xf1c | r0 = fcntl64 ();
0x00002234 cmn r0, 1 |
| if (r0 == 1) {
0x00002238 bne 0x226c |
0x0000223c ldr r3, [pc, 0x430] | r3 = *(0x2670);
0x00002240 ldr r3, [r7, r3] | r3 = *((r7 + r3));
0x00002244 ldr r4, [r3] | r4 = *(0x2670);
0x00002248 bl 0xff4 | r0 = errno_location ();
0x0000224c ldr r0, [r0] | r0 = *(r0);
0x00002250 bl 0xf04 | strerror (r0);
0x00002254 ldr r1, [pc, 0x41c] | r1 = *(0x2674);
0x00002258 add r1, pc, r1 | r1 = pc + r1;
0x0000225c mov r2, r0 | r2 = r0;
0x00002260 mov r0, r4 | r0 = r4;
0x00002264 bl 0xf7c | r0 = fprintf (r0, r1, r2);
0x00002268 bl 0xf64 | abort ();
| }
0x0000226c add r6, sp, 0x2c | r6 += dest;
0x00002270 ldr r1, [sp, 8] | r1 = src;
0x00002274 mov sb, 0x54 | sb = 0x54;
0x00002278 mov r0, r6 | r0 = r6;
0x0000227c str sb, [sp, 0x20] | var_20h = sb;
0x00002280 bl 0xeec | strcpy (r0, r1)
0x00002284 add r3, sp, 0x20 | r3 += var_20h;
0x00002288 str r3, [sp] | *(sp) = r3;
0x0000228c mov r2, 0x40 | r2 = 0x40;
0x00002290 mov r3, r6 | r3 = r6;
0x00002294 mov r1, 0x29 | r1 = 0x29;
0x00002298 mov r0, r5 | r0 = r5;
0x0000229c bl 0xfe8 | r0 = getsockopt ();
0x000022a0 cmp r0, 0 |
0x000022a4 bge 0x22b4 |
| while (1) {
| label_2:
0x000022a8 mov r0, r5 | r0 = r5;
0x000022ac bl 0x1024 | close (r0);
0x000022b0 b 0x2208 | goto label_0;
0x000022b4 mov r0, 0x80 | r0 = 0x80;
0x000022b8 bl 0xf4c | r0 = malloc (r0);
0x000022bc subs r4, r0, 0 | r4 = r0 - 0;
| if (r4 != r0) {
0x000022c0 bne 0x22d4 | goto label_14;
| }
0x000022c4 bl 0xff4 | errno_location ();
0x000022c8 mov r3, 0xc | r3 = 0xc;
0x000022cc str r3, [r0] | *(r0) = r3;
0x000022d0 b 0x22a8 |
| }
| label_14:
0x000022d4 mov r2, 0x7c | r2 = 0x7c;
0x000022d8 mov r1, 0 | r1 = 0;
0x000022dc add fp, r4, 8 |
0x000022e0 add r8, r4, 0x28 | r8 = r4 + 0x28;
0x000022e4 bl 0xfb8 | memset (r0, r1, r2);
0x000022e8 mov r1, r6 | r1 = r6;
0x000022ec str fp, [r4, 8] | *((r4 + 8)) = fp;
0x000022f0 str fp, [r4, 0xc] | *((r4 + 0xc)) = fp;
0x000022f4 mov r0, r8 | r0 = r8;
0x000022f8 bl 0xeec | strcpy (r0, r1)
0x000022fc ldr r0, [sp, 0x7c] | r0 = size;
0x00002300 add r0, r0, 0x28 | r0 += 0x28;
0x00002304 bl 0xf4c | r0 = malloc (r0);
0x00002308 cmp r0, 0 |
0x0000230c mov sl, r0 | sl = r0;
0x00002310 str r0, [r4, 0x7c] | *((r4 + 0x7c)) = r0;
| if (r0 == 0) {
0x00002314 beq 0x2384 | goto label_15;
| }
0x00002318 mov r1, r6 | r1 = r6;
0x0000231c bl 0xeec | strcpy (r0, r1)
0x00002320 mov r2, sb | r2 = sb;
0x00002324 mov r1, r6 | r1 = r6;
0x00002328 str r5, [r4] | *(r4) = r5;
0x0000232c mov r0, r8 | r0 = r8;
0x00002330 bl 0xf28 | memcpy (r0, r1, r2);
0x00002334 ldr r3, [r4, 0x78] | r3 = *((r4 + 0x78));
0x00002338 add r2, sp, 0x80 | r2 += var_80h;
0x0000233c str r3, [sl, 0x20] | *((sl + 0x20)) = r3;
0x00002340 add r3, r3, 0x28 | r3 += 0x28;
0x00002344 str r3, [r2, -0x64]! | *((r2 -= 0x64)) = r3;
0x00002348 mov r1, 0x29 | r1 = 0x29;
0x0000234c str r2, [sp] | *(sp) = r2;
0x00002350 mov r3, sl | r3 = sl;
0x00002354 mov r2, 0x41 | r2 = 0x41;
0x00002358 mov r0, r5 | r0 = r5;
0x0000235c bl 0xfe8 | r0 = getsockopt ();
0x00002360 cmp r0, 0 |
| if (r0 >= 0) {
0x00002364 bge 0x2390 | goto label_16;
| }
| label_3:
0x00002368 mov r0, r4 | r0 = r4;
0x0000236c bl 0xf10 | fcn_00000f10 ();
0x00002370 bl 0xff4 | r0 = errno_location ();
0x00002374 ldr r3, [r0] | r3 = *(r0);
0x00002378 cmp r3, 0xb |
| if (r3 == 0xb) {
0x0000237c beq 0x21e0 | goto label_1;
| }
0x00002380 b 0x2208 | goto label_0;
| label_15:
0x00002384 mov r0, r4 | r0 = r4;
0x00002388 bl 0x103c | free (r0);
0x0000238c b 0x22a8 | goto label_2;
| label_16:
0x00002390 ldr sb, [pc, 0x2e4] | sb = *(0x0000267c);
0x00002394 mov r6, 0 | r6 = 0;
0x00002398 mov r3, 1 | r3 = 1;
0x0000239c add sb, pc, sb | sb = pc + sb;
0x000023a0 str r6, [sp, 0x24] | var_24h = r6;
0x000023a4 str r3, [r4, 0x24] | *((r4 + 0x24)) = r3;
| do {
0x000023a8 ldr r5, [r4, 0x7c] | r5 = *((r4 + 0x7c));
0x000023ac ldr r2, [r5, 0x20] | r2 = *((r5 + 0x20));
0x000023b0 cmp r6, r2 |
| if (r6 >= r2) {
0x000023b4 bhs 0x2440 | goto label_8;
| }
0x000023b8 add r5, r5, 0x28 | r5 += 0x28;
0x000023bc add r8, r5, r6 | r8 = r5 + r6;
0x000023c0 ldrh r3, [r8, 0x8e] | r3 = *((r8 + 0x8e));
0x000023c4 add r3, r3, r6 | r3 += r6;
0x000023c8 cmp r2, r3 |
| if (r2 != r3) {
0x000023cc bne 0x23fc | goto label_17;
| }
0x000023d0 ldr r1, [sp, 0x24] | r1 = var_24h;
0x000023d4 add r0, r4, 0x10 | r0 = r4 + 0x10;
0x000023d8 bl 0x1e14 | fcn_00001e14 (r0, r1);
0x000023dc mov r3, 0 | r3 = 0;
0x000023e0 str r3, [r4, 0x10] | *((r4 + 0x10)) = r3;
| label_4:
0x000023e4 ldr r3, [sp, 0x24] | r3 = var_24h;
0x000023e8 add r3, r3, 1 | r3++;
0x000023ec str r3, [sp, 0x24] | var_24h = r3;
0x000023f0 ldrh r3, [r8, 0x8e] | r3 = *((r8 + 0x8e));
0x000023f4 add r6, r6, r3 | r6 += r3;
0x000023f8 b 0x23a8 |
| } while (1);
| label_17:
0x000023fc ldrh sl, [r8, 0x8c] | sl = *((r8 + 0x8c));
0x00002400 ldr r1, [sp, 0x14] | r1 = s2;
0x00002404 add sl, r8, sl | sl = r8 + sl;
0x00002408 add r0, sl, 2 | r0 = sl + 2;
0x0000240c bl 0xfc4 | r0 = strcmp (r0, r1);
0x00002410 subs r1, r0, 0 | r1 = r0 - 0;
| if (r1 == r0) {
0x00002414 ldrne r1, [r4, 0x48] | r1 = *((r4 + 0x48));
| }
| if (r1 == r0) {
0x00002418 movne r3, 0 | r3 = 0;
| }
| if (r1 == r0) {
0x0000241c movne r0, 1 | r0 = 1;
| }
| if (r1 != r0) {
0x00002420 bne 0x2494 | goto label_6;
| }
0x00002424 add r0, sl, 0x20 | r0 = sl + 0x20;
0x00002428 bl 0x1668 | r0 = fcn_00001668 (r0, r1);
0x0000242c subs r1, r0, 0 | r1 = r0 - 0;
| if (r1 != r0) {
0x00002430 bne 0x2474 | goto label_18;
| }
| label_5:
0x00002434 bl 0xff4 | errno_location ();
0x00002438 mvn r3, 0xb | r3 = ~0xb;
| label_7:
0x0000243c str r3, [r0] | *(r0) = r3;
| label_8:
0x00002440 mov r0, r4 | r0 = r4;
0x00002444 bl 0x13b4 | r0 = fcn_000013b4 (r0);
0x00002448 cmp r0, 0 |
| if (r0 < 0) {
0x0000244c blt 0x2368 | goto label_3;
| }
0x00002450 mov r0, r4 | r0 = r4;
0x00002454 bl 0x11e4 | fcn_000011e4 (r0);
0x00002458 ldr r6, [r4, 8] | r6 = *((r4 + 8));
0x0000245c add sl, sp, 0x28 | sl += var_28h;
| label_9:
0x00002460 cmp fp, r6 |
| if (fp != r6) {
0x00002464 bne 0x25bc | goto label_19;
| }
| label_13:
0x00002468 mov r0, r4 | r0 = r4;
0x0000246c add sp, sp, 0x84 |
0x00002470 pop {r4, r5, r6, r7, r8, sb, sl, fp, pc} |
| label_18:
0x00002474 ldr r3, [r4, 0x18] | r3 = *((r4 + 0x18));
0x00002478 mov r2, r6 | r2 = r6;
0x0000247c add r3, r3, 1 | r3++;
0x00002480 str r3, [r4, 0x18] | *((r4 + 0x18)) = r3;
0x00002484 mov r0, r4 | r0 = r4;
0x00002488 add r3, sp, 0x24 | r3 += var_24h;
0x0000248c bl 0x211c | fcn_0000211c (r0, r1);
0x00002490 b 0x23e4 | goto label_4;
| label_6:
0x00002494 ands r2, r1, r0, lsl r3 | r2 = r1 & (r0 << r3);
0x00002498 add sl, r3, 1 | sl = r3 + 1;
| if (r2 == r1) {
0x0000249c beq 0x24e0 | goto label_20;
| }
0x000024a0 add r2, r4, r3, lsl 2 | r2 = r4 + (r3 << 2);
0x000024a4 ldr r2, [r2, 0x4c] | r2 = *((r2 + 0x4c));
0x000024a8 add r2, r5, r2 | r2 = r5 + r2;
0x000024ac cmp r8, r2 |
| if (r8 != r2) {
0x000024b0 bne 0x24e0 | goto label_20;
| }
0x000024b4 mov r1, sl | r1 = sl;
0x000024b8 ldr r0, [sb, r3, lsl 2] | offset_0 = r3 << 2;
| r0 = *((sb + offset_0));
0x000024bc bl 0x1668 | r0 = fcn_00001668 (r0, r1);
0x000024c0 subs r1, r0, 0 | r1 = r0 - 0;
| if (r1 == r0) {
0x000024c4 beq 0x2434 | goto label_5;
| }
0x000024c8 str sl, [r1, 0x28] | *((r1 + 0x28)) = sl;
0x000024cc add r3, sp, 0x24 | r3 += var_24h;
0x000024d0 mov r2, r6 | r2 = r6;
0x000024d4 mov r0, r4 | r0 = r4;
0x000024d8 bl 0x211c | fcn_0000211c (r0, r1);
0x000024dc b 0x24ec | goto label_21;
| label_20:
0x000024e0 cmp sl, 5 |
0x000024e4 mov r3, sl | r3 = sl;
| if (sl != 5) {
0x000024e8 bne 0x2494 | goto label_6;
| }
| label_21:
0x000024ec ldrh r1, [r8, 0x8e] | r1 = *((r8 + 0x8e));
0x000024f0 ldr r0, [r4, 0x10] | r0 = *((r4 + 0x10));
0x000024f4 bl 0x137c | r0 = fcn_0000137c (r0, r1);
0x000024f8 subs r5, r0, 0 | r5 = r0 - 0;
| if (r5 == r0) {
0x000024fc bne 0x250c |
0x00002500 bl 0xff4 | errno_location ();
0x00002504 mov r3, 0xc | r3 = 0xc;
0x00002508 b 0x243c | goto label_7;
| }
0x0000250c ldr sl, [sp, 0x24] | sl = var_24h;
0x00002510 ldrh r2, [r8, 0x8e] | r2 = *((r8 + 0x8e));
0x00002514 mov r1, r8 | r1 = r8;
0x00002518 str sl, [r5, 0x14] | *((r5 + 0x14)) = sl;
0x0000251c str r6, [r5, 0x18] | *((r5 + 0x18)) = r6;
0x00002520 add r0, r5, 0x28 | r0 = r5 + 0x28;
0x00002524 bl 0xf28 | memcpy (r0, r1, r2);
0x00002528 ldrh r0, [r8, 0x8c] | r0 = *((r8 + 0x8c));
0x0000252c mov r3, 1 | r3 = 1;
0x00002530 add r2, r8, r0 | r2 = r8 + r0;
0x00002534 str r3, [r5, 0xc] | *((r5 + 0xc)) = r3;
0x00002538 str sl, [r5, 0x10] | *((r5 + 0x10)) = sl;
0x0000253c ldrb r1, [r2, 2] | r1 = *((r2 + 2));
0x00002540 cmp r1, 0 |
| if (r1 == 0) {
0x00002544 bne 0x2590 |
0x00002548 ldrh r3, [r8, r0] | r3 = *((r8 + r0));
0x0000254c cmp r3, 0x28 |
| if (r3 != 0x28) {
0x00002550 beq 0x256c |
0x00002554 bl 0xff4 | errno_location ();
0x00002558 mov r3, 0x16 | r3 = 0x16;
0x0000255c str r3, [r0] | *(r0) = r3;
0x00002560 mov r0, r5 | r0 = r5;
0x00002564 bl 0x103c | free (r0);
0x00002568 b 0x2440 | goto label_8;
| }
0x0000256c ldr r2, [r2, 0x20] | r2 = *((r2 + 0x20));
0x00002570 cmp r2, 0 |
| if (r2 >= 0) {
0x00002574 strlt r1, [r5, 0x1c] | *((r5 + 0x1c)) = r1;
| }
| if (r2 < 0) {
0x00002578 blt 0x2594 | goto label_22;
| }
0x0000257c ldrh r3, [r8, 0x8e] | r3 = *((r8 + 0x8e));
0x00002580 add r3, r3, r6 | r3 += r6;
0x00002584 cmp r2, r3 |
| if (r2 != r3) {
0x00002588 moveq r3, 2 | r3 = 2;
| }
| if (r2 != r3) {
0x0000258c movne r3, 3 | r3 = 3;
| goto label_23;
| }
| }
| label_23:
0x00002590 str r3, [r5, 0x1c] | *((r5 + 0x1c)) = r3;
| label_22:
0x00002594 ldr r3, [r4, 0x10] | r3 = *((r4 + 0x10));
0x00002598 ldr r2, [r3, 0x58] | r2 = *((r3 + 0x58));
0x0000259c add r1, r3, 0x54 | r1 = r3 + 0x54;
0x000025a0 str r5, [r3, 0x58] | *((r3 + 0x58)) = r5;
0x000025a4 stm r5, {r1, r2} | *(r5) = r1;
| *((r5 + 4)) = r2;
0x000025a8 str r5, [r2] | *(r2) = r5;
0x000025ac ldr r2, [r3, 0x50] | r2 = *((r3 + 0x50));
0x000025b0 add r2, r2, 1 | r2++;
0x000025b4 str r2, [r3, 0x50] | *((r3 + 0x50)) = r2;
0x000025b8 b 0x23e4 | goto label_4;
| label_19:
0x000025bc mov r8, r6 | r8 = r6;
0x000025c0 ldr r5, [r8, 0x54]! | r5 = *((r8 += 0x54));
| label_11:
0x000025c4 cmp r5, r8 |
| if (r5 == r8) {
0x000025c8 ldreq r6, [r6] | r6 = *(r6);
| goto label_24;
| }
| if (r5 == r8) {
| label_24:
0x000025cc beq 0x2460 | goto label_9;
| }
0x000025d0 ldr r3, [r5, 0x1c] | r3 = *((r5 + 0x1c));
0x000025d4 cmp r3, 3 |
| if (r3 != 3) {
0x000025d8 bne 0x265c | goto label_25;
| }
0x000025dc ldrh r3, [r5, 0xb4] | r3 = *((r5 + 0xb4));
0x000025e0 ldr r0, [r4, 8] | r0 = *((r4 + 8));
0x000025e4 add r3, r5, r3 | r3 = r5 + r3;
0x000025e8 cmp fp, r0 |
0x000025ec ldr sb, [r3, 0x48] | sb = *((r3 + 0x48));
| if (fp == r0) {
0x000025f0 beq 0x2368 | goto label_3;
| }
0x000025f4 ldr r3, [r4, 0x24] | r3 = *((r4 + 0x24));
0x000025f8 cmp r3, 0 |
| if (r3 != 0) {
0x000025fc beq 0x261c |
0x00002600 mov r3, 1 | r3 = 1;
0x00002604 str r3, [sp] | *(sp) = r3;
0x00002608 mov r2, sl | r2 = sl;
0x0000260c mov r3, r4 | r3 = r4;
0x00002610 mov r1, sb | r1 = sb;
0x00002614 mov r0, 0 | r0 = 0;
0x00002618 bl 0x1544 | fcn_00001544 (r0, r1, r2);
| }
0x0000261c ldr r2, [r0, 4] | r2 = *((r0 + 4));
0x00002620 ldr r3, [r2] | r3 = *(r2);
| label_10:
0x00002624 cmp r2, r3 |
| if (r2 == r3) {
0x00002628 beq 0x2368 | goto label_3;
| }
0x0000262c ldr r1, [r3, 0x60] | r1 = *((r3 + 0x60));
0x00002630 cmp sb, r1 |
| if (sb > r1) {
0x00002634 blo 0x2644 |
0x00002638 ldr r1, [r3, 0x68] | r1 = *((r3 + 0x68));
0x0000263c cmp sb, r1 |
| if (sb < r1) {
0x00002640 bls 0x264c | goto label_26;
| }
| }
0x00002644 ldr r3, [r3] | r3 = *(r3);
0x00002648 b 0x2624 | goto label_10;
| label_26:
0x0000264c ldr r2, [r3, 0x2c] | r2 = *((r3 + 0x2c));
0x00002650 str r3, [r5, 0x20] | *((r5 + 0x20)) = r3;
0x00002654 add r2, r2, 1 | r2++;
0x00002658 str r2, [r3, 0x2c] | *((r3 + 0x2c)) = r2;
| label_25:
0x0000265c ldr r5, [r5] | r5 = *(r5);
0x00002660 b 0x25c4 | goto label_11;
| }
[*] Function strcpy used 11 times libip6tc.so.0.1.0