[*] Binary protection state of libxtables.so.12.2.0
Partial RELRO No Canary found NX disabled DSO No RPATH No RUNPATH No Symbols
[*] Function strcpy tear down of libxtables.so.12.2.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/libxtables.so.12.2.0 @ 0x4028 */
| #include <stdint.h>
|
; (fcn) sym.xtables_compatible_revision () | void xtables_compatible_revision (int32_t arg1, int32_t arg2) {
| int32_t var_0h;
| int32_t var_ch;
| char * dest;
| int32_t var_2dh;
| int32_t var_34h;
| r0 = arg1;
| r1 = arg2;
0x00004028 push {r4, r5, r6, r7, r8, sb, lr} |
0x0000402c ldr r5, [pc, 0x1b0] | r5 = *(0x41e0);
0x00004030 sub sp, sp, 0x34 |
0x00004034 mov r3, 0x1e | r3 = 0x1e;
0x00004038 str r3, [sp, 0xc] | var_ch = r3;
0x0000403c ldr r3, [pc, 0x1a4] | r3 = *(0x41e4);
0x00004040 add r5, pc, r5 | r5 = pc + r5;
0x00004044 ldr r7, [r5, r3] | r7 = *(0x41e0);
0x00004048 mov r8, r0 | r8 = r0;
0x0000404c ldr r3, [r7] | r3 = *(0x41e0);
0x00004050 mov r6, r1 | r6 = r1;
0x00004054 mov sb, r2 | sb = r2;
0x00004058 mov r1, 3 | r1 = 3;
0x0000405c mov r2, 0xff | r2 = 0xff;
0x00004060 ldrb r0, [r3, 0xc] | r0 = *((r3 + 0xc));
0x00004064 bl 0x2328 | r0 = socket (r0, r1, r2);
0x00004068 subs r4, r0, 0 | r4 = r0 - 0;
| if (r4 >= r0) {
0x0000406c bge 0x40e4 | goto label_2;
| }
0x00004070 bl 0x25a4 | r0 = errno_location ();
0x00004074 ldr r4, [r0] | r4 = *(r0);
0x00004078 cmp r4, 1 |
| if (r4 == 1) {
0x0000407c bne 0x40b4 |
0x00004080 cmp r6, 0 |
| if (r6 != 0) {
0x00004084 beq 0x40a8 |
0x00004088 ldr r3, [pc, 0x15c] | r3 = *(0x41e8);
0x0000408c ldr r1, [pc, 0x15c] | r1 = *(0x41ec);
0x00004090 ldr r0, [r5, r3] | r0 = *((r5 + r3));
0x00004094 mov r2, r8 | r2 = r8;
0x00004098 mov r3, r6 | r3 = r6;
0x0000409c add r1, pc, r1 | r1 = pc + r1;
0x000040a0 ldr r0, [r0] | r0 = *(r0);
0x000040a4 bl 0x23e8 | fprintf (r0, r1, r2, r3);
| }
| label_0:
0x000040a8 mov r0, r4 | r0 = r4;
0x000040ac add sp, sp, 0x34 |
0x000040b0 pop {r4, r5, r6, r7, r8, sb, pc} |
| }
0x000040b4 ldr r3, [pc, 0x130] | r3 = *(0x41e8);
0x000040b8 mov r0, r4 | r0 = r4;
0x000040bc ldr r3, [r5, r3] | r3 = *((r5 + r3));
0x000040c0 ldr r5, [r3] | r5 = *(0x41e8);
0x000040c4 bl 0x2214 | strerror (r0);
0x000040c8 ldr r1, [pc, 0x124] | r1 = *(0x41f0);
0x000040cc add r1, pc, r1 | r1 = pc + r1;
0x000040d0 mov r2, r0 | r2 = r0;
0x000040d4 mov r0, r5 | r0 = r5;
| do {
0x000040d8 bl 0x23e8 | fprintf (r0, r1, r2);
0x000040dc mov r0, 1 | r0 = 1;
0x000040e0 bl 0x25b0 | exit (r0);
| label_2:
0x000040e4 mov r2, 1 | r2 = 1;
0x000040e8 mov r1, 2 | r1 = 2;
0x000040ec bl 0x2298 | r0 = fcntl64 ();
0x000040f0 cmn r0, 1 |
| if (r0 != 1) {
0x000040f4 bne 0x4124 | goto label_3;
| }
0x000040f8 ldr r3, [pc, 0xec] | r3 = *(0x41e8);
0x000040fc ldr r3, [r5, r3] | r3 = *((r5 + r3));
0x00004100 ldr r4, [r3] | r4 = *(0x41e8);
0x00004104 bl 0x25a4 | r0 = errno_location ();
0x00004108 ldr r0, [r0] | r0 = *(r0);
0x0000410c bl 0x2214 | strerror (r0);
0x00004110 ldr r1, [pc, 0xe0] | r1 = *(0x41f4);
0x00004114 add r1, pc, r1 | r1 = pc + r1;
0x00004118 mov r2, r0 | r2 = r0;
| label_1:
0x0000411c mov r0, r4 | r0 = r4;
0x00004120 b 0x40d8 |
| } while (1);
| label_3:
0x00004124 ldr r3, [pc, 0xd0] | r3 = *(0x41f8);
0x00004128 mov r1, 1 | r1 = 1;
0x0000412c ldr r3, [r5, r3] | r3 = *((r5 + r3));
0x00004130 ldr r0, [r3] | r0 = *(0x41f8);
0x00004134 bl 0x24c0 | fcn_000024c0 ();
0x00004138 add r3, sp, 0x10 | r3 += dest;
0x0000413c mov r1, r8 | r1 = r8;
0x00004140 mov r0, r3 | r0 = r3;
0x00004144 bl 0x21c0 | strcpy (r0, r1)
0x00004148 ldr r2, [r7] | r2 = *(r7);
0x0000414c strb r6, [sp, 0x2d] | var_2dh = r6;
0x00004150 ldrb r1, [r2, 0xd] | r1 = *((r2 + 0xd));
0x00004154 add r2, sp, 0xc | r2 += var_ch;
0x00004158 str r2, [sp] | *(sp) = r2;
0x0000415c mov r2, sb | r2 = sb;
0x00004160 mov r3, r0 | r3 = r0;
0x00004164 mov r0, r4 | r0 = r4;
0x00004168 bl 0x2568 | r0 = getsockopt ();
0x0000416c cmp r0, 0 |
| if (r0 < 0) {
0x00004170 bge 0x41d4 |
0x00004174 bl 0x25a4 | r0 = errno_location ();
0x00004178 ldr r0, [r0] | r0 = *(r0);
0x0000417c cmp r0, 0x5d |
0x00004180 cmpne r0, 2 | __asm ("cmpne r0, 2");
| if (r0 == 0x5d) {
0x00004184 bne 0x4198 |
0x00004188 mov r0, r4 | r0 = r4;
0x0000418c bl 0x264c | close (r0);
0x00004190 mov r4, 0 | r4 = 0;
0x00004194 b 0x40a8 | goto label_0;
| }
0x00004198 cmp r0, 0x5c |
| if (r0 == 0x5c) {
0x0000419c bne 0x41b4 |
0x000041a0 mov r0, r4 | r0 = r4;
0x000041a4 bl 0x264c | close (r0);
0x000041a8 clz r4, r6 | r4 &= r6;
0x000041ac lsr r4, r4, 5 | r4 >>= 5;
0x000041b0 b 0x40a8 | goto label_0;
| }
0x000041b4 ldr r3, [pc, 0x30] | r3 = *(0x41e8);
0x000041b8 ldr r3, [r5, r3] | r3 = *((r5 + r3));
0x000041bc ldr r4, [r3] | r4 = *(0x41e8);
0x000041c0 bl 0x2214 | strerror (r0);
0x000041c4 ldr r1, [pc, 0x34] | r1 = *(0x41fc);
0x000041c8 add r1, pc, r1 | r1 = pc + r1;
0x000041cc mov r2, r0 | r2 = r0;
0x000041d0 b 0x411c | goto label_1;
| }
0x000041d4 mov r0, r4 | r0 = r4;
0x000041d8 bl 0x264c | close (r0);
0x000041dc mov r4, 1 | r4 = 1;
0x000041e0 b 0x40a8 | goto label_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/libxtables.so.12.2.0 @ 0x51f0 */
| #include <stdint.h>
|
; (fcn) sym.xtables_ip6mask_to_numeric () | void xtables_ip6mask_to_numeric (int32_t arg1) {
| r0 = arg1;
0x000051f0 push {r4, r5, r6, lr} |
0x000051f4 mov r5, r0 | r5 = r0;
0x000051f8 bl 0x2208 | r0 = fcn_00002208 ();
0x000051fc cmn r0, 1 |
| if (r0 != 1) {
0x00005200 bne 0x5240 | goto label_0;
| }
0x00005204 ldr r4, [pc, 0x70] |
0x00005208 ldr r1, [pc, 0x70] | r1 = *(0x527c);
0x0000520c add r4, pc, r4 | r4 = pc + r4;
0x00005210 add r4, r4, 0x870 | r4 = 0x5ae8;
0x00005214 add r4, r4, 4 | r4 += 4;
0x00005218 add r1, pc, r1 | r1 = pc + r1;
0x0000521c mov r0, r4 | r0 = r4;
0x00005220 bl 0x21c0 | strcpy (r0, r1)
0x00005224 mov r0, r5 | r0 = r5;
0x00005228 bl 0x231c | r0 = fcn_0000231c ();
0x0000522c mov r1, r0 | r1 = r0;
0x00005230 mov r0, r4 | r0 = r4;
0x00005234 bl 0x23f4 | strcat (r0, r1);
| do {
0x00005238 mov r0, r4 | r0 = r4;
0x0000523c pop {r4, r5, r6, pc} |
| label_0:
0x00005240 cmp r0, 0x80 |
0x00005244 mov r2, r0 | r2 = r0;
| if (r0 == 0x80) {
0x00005248 beq 0x5270 | goto label_1;
| }
0x0000524c ldr r4, [pc, 0x30] |
0x00005250 ldr r1, [pc, 0x30] | r1 = *(0x5284);
0x00005254 add r4, pc, r4 | r4 = pc + r4;
0x00005258 add r4, r4, 0x870 | r4 = 0x5af0;
0x0000525c add r4, r4, 4 | r4 += 4;
0x00005260 add r1, pc, r1 | r1 = pc + r1;
0x00005264 mov r0, r4 | r0 = r4;
0x00005268 bl 0x2538 | sprintf (r0, r1, r2);
0x0000526c b 0x5238 |
| } while (1);
| label_1:
0x00005270 ldr r0, [pc, 0x14] | r0 = *(0x5288);
0x00005274 add r0, pc, r0 | r0 = pc + r0;
0x00005278 pop {r4, r5, r6, pc} |
| }
; 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/libxtables.so.12.2.0 @ 0x5808 */
| #include <stdint.h>
|
; (fcn) sym.xtables_ip6parse_any () | void xtables_ip6parse_any (int32_t arg2, char * src) {
| char * dest;
| void * s2;
| int32_t var_4h;
| int32_t var_8h;
| int32_t var_ch;
| int32_t var_ffh;
| int32_t var_100h;
| r1 = arg2;
| r0 = src;
0x00005808 push {r4, r5, r6, r7, r8, sb, sl, lr} |
0x0000580c sub sp, sp, 0x100 |
0x00005810 mov r4, sp | r4 = sp;
0x00005814 mov r7, r2 | r7 = r2;
0x00005818 mov r8, r1 | r8 = r1;
0x0000581c mov r2, 0xff | r2 = 0xff;
0x00005820 mov r1, r0 | r1 = r0;
0x00005824 mov r0, r4 | r0 = r4;
0x00005828 mov r6, r3 | r6 = r3;
0x0000582c mov r5, 0 | r5 = 0;
0x00005830 bl 0x2448 | strncpy (r0, r1, r2);
0x00005834 mov r1, 0x2f | r1 = 0x2f;
0x00005838 mov r0, r4 | r0 = r4;
0x0000583c strb r5, [sp, 0xff] | var_ffh = r5;
0x00005840 bl 0x23ac | strrchr (r0, r1);
0x00005844 subs r3, r0, 0 | r3 -= dest;
| if (r3 == dest) {
0x00005848 movne r0, r3 | r0 = r3;
| }
| if (r3 == dest) {
0x0000584c strbne r5, [r0], 1 | *(r0) = r5;
| r0++;
| }
0x00005850 bl 0x52c8 | fcn_000052c8 (r0);
0x00005854 mov r2, 0x10 | r2 = 0x10;
0x00005858 mov r1, r0 | r1 = r0;
0x0000585c mov r0, r7 | r0 = r7;
0x00005860 bl 0x22a4 | memcpy (r0, r1, r2);
0x00005864 ldr r1, [pc, 0x10c] |
0x00005868 mov r2, 0x10 | r2 = 0x10;
0x0000586c add r1, pc, r1 | r1 = pc + r1;
0x00005870 add r1, r1, 0x8d0 | r1 = 0x6244;
0x00005874 add r1, r1, 8 | r1 += 8;
0x00005878 mov r0, r7 | r0 = r7;
0x0000587c bl 0x2484 | r0 = memcmp (r0, r1, r2);
0x00005880 cmp r0, 0 |
| if (r0 == 0) {
0x00005884 bne 0x5898 |
0x00005888 ldr r1, [pc, 0xec] | r1 = *(0x5978);
0x0000588c mov r0, r4 | r0 = r4;
0x00005890 add r1, pc, r1 | r1 = pc + r1;
0x00005894 bl 0x21c0 | strcpy (r0, r1)
| }
0x00005898 mov r0, r4 | r0 = r4;
0x0000589c mov r1, r6 | r1 = r6;
0x000058a0 bl 0x541c | fcn_0000541c (r0, r1);
0x000058a4 ldr sb, [r6] | sb = *(r6);
0x000058a8 mov r4, 0 | r4 = 0;
0x000058ac str r0, [r8] | *(r8) = r0;
0x000058b0 mov r5, r0 | r5 = r0;
0x000058b4 mov r8, r4 | r8 = r4;
| label_0:
0x000058b8 cmp r8, sb |
| if (r8 == sb) {
0x000058bc bne 0x58c8 |
0x000058c0 add sp, sp, 0x100 |
0x000058c4 pop {r4, r5, r6, r7, r8, sb, sl, pc} |
| }
0x000058c8 add r0, r5, r4, lsl 4 | r0 = r5 + (r4 << 4);
0x000058cc sub r3, r0, 4 | r3 = r0 - 4;
0x000058d0 sub r1, r7, 4 | r1 = r7 - 4;
0x000058d4 add ip, r0, 0xc |
| do {
0x000058d8 ldr r2, [r3, 4]! | r2 = dest;
0x000058dc ldr lr, [r1, 4]! |
0x000058e0 cmp r3, ip |
0x000058e4 and r2, r2, lr | r2 &= lr;
0x000058e8 str r2, [r3] | *(r3) = r2;
0x000058ec bne 0x58d8 |
| } while (r3 != ip);
0x000058f0 add ip, r4, 1 |
0x000058f4 add r2, r5, r4, lsl 4 | r2 = r5 + (r4 << 4);
0x000058f8 mov r3, 0 | r3 = 0;
| do {
0x000058fc cmp r4, r3 |
| if (r4 != r3) {
0x00005900 beq 0x5964 |
0x00005904 ldr lr, [r5, r3, lsl 4] |
0x00005908 ldr r1, [r2] | r1 = *(r2);
0x0000590c cmp lr, r1 |
| if (lr != r1) {
0x00005910 bne 0x5970 | goto label_1;
| }
0x00005914 add r1, r5, r3, lsl 4 | r1 = r5 + (r3 << 4);
0x00005918 ldr sl, [r1, 4] | sl = var_4h;
0x0000591c ldr lr, [r2, 4] | lr = var_4h;
0x00005920 cmp sl, lr |
| if (sl != lr) {
0x00005924 bne 0x5970 | goto label_1;
| }
0x00005928 ldr sl, [r1, 8] | sl = var_8h;
0x0000592c ldr lr, [r2, 8] | lr = var_8h;
0x00005930 cmp sl, lr |
| if (sl != lr) {
0x00005934 bne 0x5970 | goto label_1;
| }
0x00005938 ldr lr, [r1, 0xc] | lr = var_ch;
0x0000593c ldr r1, [r2, 0xc] | r1 = var_ch;
0x00005940 cmp lr, r1 |
| if (lr != r1) {
0x00005944 bne 0x5970 | goto label_1;
| }
0x00005948 ldr r1, [r6] | r1 = *(r6);
0x0000594c mov r2, 4 | r2 = 4;
0x00005950 sub r1, r1, 1 | r1--;
0x00005954 str r1, [r6] | *(r6) = r1;
0x00005958 add r1, r5, r1, lsl r2 | r1 = r5 + (r1 << r2);
0x0000595c bl 0x22a4 | memcpy (r0, r1, r2);
0x00005960 mov ip, r4 |
| }
0x00005964 add r8, r8, 1 | r8++;
0x00005968 mov r4, ip | r4 = ip;
0x0000596c b 0x58b8 | goto label_0;
| label_1:
0x00005970 add r3, r3, 1 | r3++;
0x00005974 b 0x58fc |
| } while (1);
| }
; 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/libxtables.so.12.2.0 @ 0x551c */
| #include <stdint.h>
|
; (fcn) sym.xtables_ip6parse_multiple () | void xtables_ip6parse_multiple (int32_t arg_1h, int32_t arg1, int32_t arg2) {
| void * var_4h;
| int32_t var_8h;
| int32_t var_ch;
| int32_t var_14h;
| char * dest;
| void * s2;
| int32_t var_118h;
| int32_t var_11ch;
| r0 = arg1;
| r1 = arg2;
0x0000551c push {r4, r5, r6, r7, r8, sb, sl, fp, lr} |
0x00005520 ldr sl, [pc, 0x2c8] | sl = *(0x000057f0);
0x00005524 sub sp, sp, 0x11c |
0x00005528 mov r5, r0 | r5 = r0;
0x0000552c mov r8, r1 | r8 = r1;
0x00005530 mov r7, r2 | r7 = r2;
0x00005534 mov r6, 1 | r6 = 1;
0x00005538 add sl, pc, sl | sl = pc + sl;
0x0000553c str r3, [sp, 8] | var_8h = r3;
| do {
0x00005540 mov r1, 0x2c | r1 = 0x2c;
0x00005544 bl 0x2628 | r0 = strchr (r0, r1);
0x00005548 subs r4, r0, 0 | r4 = r0 - 0;
| if (r4 == r0) {
0x0000554c bne 0x5598 |
0x00005550 lsl sb, r6, 4 | sb = r6 << 4;
0x00005554 mov r0, sb | r0 = sb;
0x00005558 bl 0x2400 | fcn_00002400 ();
0x0000555c str r0, [r8] | *(r8) = r0;
0x00005560 mov r0, sb | r0 = sb;
0x00005564 bl 0x2400 | fcn_00002400 ();
0x00005568 ldr r3, [pc, 0x284] |
0x0000556c add r3, pc, r3 | r3 = pc + r3;
0x00005570 add r3, r3, 0x8c0 | r3 = 0x60b0;
0x00005574 add r3, r3, 8 | r3 += 8;
0x00005578 str r3, [sp, 4] | var_4h = r3;
0x0000557c str r0, [r7] | *(r7) = r0;
| label_0:
0x00005580 cmp r4, r6 |
| if (r4 >= r6) {
0x00005584 bhs 0x5794 | goto label_4;
| }
0x00005588 ldr r3, [pc, 0x268] | r3 = *(0x57f4);
0x0000558c ldr r3, [sl, r3] | r3 = *((sl + r3));
0x00005590 ldr r2, [r3] | r2 = *(0x57f4);
0x00005594 b 0x55a8 | goto label_5;
| }
0x00005598 add r6, r6, 1 | r6++;
0x0000559c add r0, r4, 1 | r0 = r4 + 1;
0x000055a0 b 0x5540 |
| } while (1);
| do {
0x000055a4 mov r5, r1 | r5 = r1;
| label_5:
0x000055a8 ldrb r3, [r5] | r3 = *(r5);
0x000055ac add r1, r5, 1 | r1 = r5 + 1;
0x000055b0 lsl r3, r3, 1 | r3 <<= 1;
0x000055b4 ldrh r3, [r2, r3] | r3 = *((r2 + r3));
0x000055b8 tst r3, 0x20 |
0x000055bc bne 0x55a4 |
| } while ((r3 & 0x20) != 0);
0x000055c0 mov r1, 0x2c | r1 = 0x2c;
0x000055c4 mov r0, r5 | r0 = r5;
0x000055c8 bl 0x2628 | r0 = strchr (r0, r1);
0x000055cc subs fp, r0, 0 |
| if (fp == r0) {
0x000055d0 subne r3, fp, r5 | r3 = fp - r5;
| }
| if (fp == r0) {
0x000055d4 bne 0x55e4 |
0x000055d8 mov r0, r5 | r0 = r5;
0x000055dc bl 0x2610 | r0 = strlen (r0);
0x000055e0 mov r3, r0 | r3 = r0;
| }
0x000055e4 cmp r3, 0xff |
| if (r3 >= 0xff) {
0x000055e8 bls 0x560c |
0x000055ec ldr r3, [pc, 0x208] |
0x000055f0 ldr r1, [pc, 0x208] | r1 = *(0x57fc);
0x000055f4 ldr r3, [sl, r3] | r3 = *((sl + r3));
0x000055f8 add r1, pc, r1 | r1 = pc + r1;
0x000055fc ldr r3, [r3] |
0x00005600 mov r0, 2 | r0 = 2;
0x00005604 ldr r3, [r3, 0x14] | r3 = *(0x580c);
0x00005608 blx r3 | uint32_t (*r3)(uint32_t, uint32_t, uint32_t) (r0, r1, r3);
| }
0x0000560c add sb, sp, 0x18 | sb += dest;
0x00005610 mov r2, r3 | r2 = r3;
0x00005614 mov r1, r5 | r1 = r5;
0x00005618 mov r0, sb | r0 = sb;
0x0000561c str r3, [sp, 0xc] | var_ch = r3;
0x00005620 bl 0x2448 | strncpy (r0, r1, r2);
0x00005624 ldr r3, [sp, 0xc] | r3 = var_ch;
0x00005628 add r2, sp, 0x118 | r2 += var_118h;
0x0000562c add r3, r2, r3 | r3 = r2 + r3;
0x00005630 mov r5, 0 | r5 = 0;
0x00005634 mov r1, 0x2f | r1 = 0x2f;
0x00005638 mov r0, sb | r0 = sb;
0x0000563c strb r5, [r3, -0x100] | dest = r5;
0x00005640 bl 0x23ac | strrchr (r0, r1);
0x00005644 subs r3, r0, 0 | r3 -= dest;
| if (r3 == dest) {
0x00005648 movne r0, r3 | r0 = r3;
| }
| if (r3 == dest) {
0x0000564c strbne r5, [r0], 1 | *(r0) = r5;
| r0++;
| }
0x00005650 bl 0x52c8 | fcn_000052c8 (r0);
0x00005654 ldr r3, [r7] | r3 = *(r7);
0x00005658 lsl r5, r4, 4 | r5 = r4 << 4;
0x0000565c mov r2, 0x10 | r2 = 0x10;
0x00005660 mov r1, r0 | r1 = r0;
0x00005664 add r0, r3, r5 | r0 = r3 + r5;
0x00005668 bl 0x22a4 | memcpy (r0, r1, r2);
0x0000566c ldr r0, [r7] | r0 = *(r7);
0x00005670 mov r2, 0x10 | r2 = 0x10;
0x00005674 ldr r1, [sp, 4] | r1 = var_4h;
0x00005678 add r0, r0, r5 | r0 += r5;
0x0000567c bl 0x2484 | r0 = memcmp (r0, r1, r2);
0x00005680 cmp r0, 0 |
| if (r0 == 0) {
0x00005684 bne 0x5698 |
0x00005688 ldr r1, [pc, 0x174] | r1 = *(0x5800);
0x0000568c mov r0, sb | r0 = sb;
0x00005690 add r1, pc, r1 | r1 = pc + r1;
0x00005694 bl 0x21c0 | strcpy (r0, r1)
| }
0x00005698 mov r0, sb | r0 = sb;
0x0000569c add r1, sp, 0x14 | r1 += var_14h;
0x000056a0 bl 0x541c | fcn_0000541c (r0, r1);
0x000056a4 ldr r3, [sp, 0x14] | r3 = var_14h;
0x000056a8 cmp r3, 1 |
0x000056ac mov sb, r0 | sb = r0;
| if (r3 < 1) {
0x000056b0 bls 0x577c | goto label_6;
| }
0x000056b4 sub r3, r3, 1 | r3--;
0x000056b8 add r6, r6, r3 | r6 += r3;
0x000056bc lsl r3, r6, 4 | r3 = r6 << 4;
0x000056c0 mov r1, r3 | r1 = r3;
0x000056c4 ldr r0, [r8] | r0 = *(r8);
0x000056c8 str r3, [sp, 0xc] | var_ch = r3;
0x000056cc bl 0x25ec | fcn_000025ec ();
0x000056d0 ldr r3, [sp, 0xc] | r3 = var_ch;
0x000056d4 mov r1, r3 | r1 = r3;
0x000056d8 str r0, [r8] | *(r8) = r0;
0x000056dc ldr r0, [r7] | r0 = *(r7);
0x000056e0 bl 0x25ec | fcn_000025ec ();
0x000056e4 mov r3, 0 | r3 = 0;
0x000056e8 str r0, [r7] | *(r7) = r0;
| do {
0x000056ec ldr r2, [sp, 0x14] | r2 = var_14h;
0x000056f0 cmp r2, r3 |
| if (r2 <= r3) {
0x000056f4 bhi 0x572c |
0x000056f8 mov r3, 1 | r3 = 1;
| label_1:
0x000056fc ldr r2, [sp, 0x14] | r2 = var_14h;
0x00005700 cmp r2, r3 |
| if (r2 > r3) {
0x00005704 bhi 0x5754 | goto label_7;
| }
0x00005708 sub r4, r4, 1 | r4--;
0x0000570c add r4, r2, r4 | r4 = r2 + r4;
| label_2:
0x00005710 mov r0, sb | r0 = sb;
0x00005714 bl 0x2688 | free (r0);
0x00005718 cmp fp, 0 |
| if (fp == 0) {
0x0000571c beq 0x5794 | goto label_4;
| }
0x00005720 add r5, fp, 1 | r5 += arg_1h;
0x00005724 add r4, r4, 1 | r4++;
0x00005728 b 0x5580 | goto label_0;
| }
0x0000572c ldr r0, [r8] | r0 = *(r8);
0x00005730 add ip, r4, r3 |
0x00005734 add r1, sb, r3, lsl 4 | r1 = sb + (r3 << 4);
0x00005738 mov r2, 0x10 | r2 = 0x10;
0x0000573c add r0, r0, ip, lsl 4 | r0 += (ip << 4);
0x00005740 str r3, [sp, 0xc] | var_ch = r3;
0x00005744 bl 0x22a4 | memcpy (r0, r1, r2);
0x00005748 ldr r3, [sp, 0xc] | r3 = var_ch;
0x0000574c add r3, r3, 1 | r3++;
0x00005750 b 0x56ec |
| } while (1);
| label_7:
0x00005754 ldr r0, [r7] | r0 = *(r7);
0x00005758 add ip, r4, r3 |
0x0000575c add r1, r0, r5 | r1 = r0 + r5;
0x00005760 mov r2, 0x10 | r2 = 0x10;
0x00005764 add r0, r0, ip, lsl 4 | r0 += (ip << 4);
0x00005768 str r3, [sp, 0xc] | var_ch = r3;
0x0000576c bl 0x22a4 | memcpy (r0, r1, r2);
0x00005770 ldr r3, [sp, 0xc] | r3 = var_ch;
0x00005774 add r3, r3, 1 | r3++;
0x00005778 b 0x56fc | goto label_1;
| label_6:
0x0000577c ldr r0, [r8] | r0 = *(r8);
0x00005780 mov r2, 0x10 | r2 = 0x10;
0x00005784 mov r1, sb | r1 = sb;
0x00005788 add r0, r0, r5 | r0 += r5;
0x0000578c bl 0x22a4 | memcpy (r0, r1, r2);
0x00005790 b 0x5710 | goto label_2;
| label_4:
0x00005794 ldr r3, [sp, 8] | r3 = var_8h;
0x00005798 mov r1, 0 | r1 = 0;
0x0000579c str r6, [r3] | *(r3) = r6;
| label_3:
0x000057a0 cmp r1, r6 |
| if (r1 == r6) {
0x000057a4 bne 0x57b0 |
0x000057a8 add sp, sp, 0x11c |
0x000057ac pop {r4, r5, r6, r7, r8, sb, sl, fp, pc} |
| }
0x000057b0 ldr r3, [r8] | r3 = *(r8);
0x000057b4 ldr ip, [r7] | ip = *(r7);
0x000057b8 lsl r2, r1, 4 | r2 = r1 << 4;
0x000057bc add r3, r3, r2 | r3 += r2;
0x000057c0 sub r2, r2, 4 | r2 -= 4;
0x000057c4 sub r0, r3, 4 | r0 = r3 - 4;
0x000057c8 add r2, ip, r2 | r2 = ip + r2;
0x000057cc add r3, r3, 0xc | r3 += 0xc;
| do {
0x000057d0 ldr ip, [r0, 4]! | ip = *((r0 += 4));
0x000057d4 ldr lr, [r2, 4]! |
0x000057d8 cmp r3, r0 |
0x000057dc and ip, ip, lr |
0x000057e0 str ip, [r0] | *(r0) = ip;
0x000057e4 bne 0x57d0 |
| } while (r3 != r0);
0x000057e8 add r1, r1, 1 | r1++;
0x000057ec b 0x57a0 | goto label_3;
| }
; 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/libxtables.so.12.2.0 @ 0x4fa0 */
| #include <stdint.h>
|
; (fcn) sym.xtables_ipparse_any () | void xtables_ipparse_any (int32_t arg2, char * src) {
| char * dest;
| int32_t var_0h_2;
| int32_t var_ffh;
| int32_t var_104h;
| r1 = arg2;
| r0 = src;
0x00004fa0 push {r4, r5, r6, r7, r8, sb, lr} |
0x00004fa4 sub sp, sp, 0x104 |
0x00004fa8 mov r5, sp | r5 = sp;
0x00004fac mov r4, r1 | r4 = r1;
0x00004fb0 mov r7, r2 | r7 = r2;
0x00004fb4 mov r1, r0 | r1 = r0;
0x00004fb8 mov r2, 0xff | r2 = 0xff;
0x00004fbc mov r0, r5 | r0 = r5;
0x00004fc0 mov r6, r3 | r6 = r3;
0x00004fc4 mov r8, 0 | r8 = 0;
0x00004fc8 bl 0x2448 | strncpy (r0, r1, r2);
0x00004fcc mov r1, 0x2f | r1 = 0x2f;
0x00004fd0 mov r0, r5 | r0 = r5;
0x00004fd4 strb r8, [sp, 0xff] | var_ffh = r8;
0x00004fd8 bl 0x23ac | r0 = strrchr (r0, r1);
0x00004fdc cmp r0, 0 |
| if (r0 == 0) {
0x00004fe0 beq 0x5048 | goto label_1;
| }
0x00004fe4 strb r8, [r0], 1 | *(r0) = r8;
| r0++;
0x00004fe8 bl 0x4be4 | r0 = fcn_00004be4 (r0);
0x00004fec mov r1, r0 | r1 = r0;
| do {
0x00004ff0 mov r2, 4 | r2 = 4;
0x00004ff4 mov r0, r7 | r0 = r7;
0x00004ff8 bl 0x22a4 | memcpy (r0, r1, r2);
0x00004ffc ldr r3, [r7] | r3 = *(r7);
0x00005000 cmp r3, 0 |
| if (r3 == 0) {
0x00005004 bne 0x5018 |
0x00005008 ldr r1, [pc, 0xb4] | r1 = *(0x50c0);
0x0000500c mov r0, r5 | r0 = r5;
0x00005010 add r1, pc, r1 | r1 = pc + r1;
0x00005014 bl 0x21c0 | strcpy (r0, r1)
| }
0x00005018 mov r0, r5 | r0 = r5;
0x0000501c mov r1, r6 | r1 = r6;
0x00005020 bl 0x4aa0 | fcn_00004aa0 (r0, r1);
0x00005024 ldr sb, [r6] | sb = *(r6);
0x00005028 str r0, [r4] | *(r4) = r0;
0x0000502c mov r4, 0 | r4 = 0;
0x00005030 mov r5, r0 | r5 = r0;
0x00005034 mov r8, r4 | r8 = r4;
| label_0:
0x00005038 cmp r8, sb |
| if (r8 != sb) {
0x0000503c bne 0x5064 | goto label_2;
| }
0x00005040 add sp, sp, 0x104 |
0x00005044 pop {r4, r5, r6, r7, r8, sb, pc} |
| label_1:
0x00005048 ldr r1, [pc, 0x78] |
0x0000504c mvn r3, 0 | r3 = ~0;
0x00005050 add r1, pc, r1 | r1 = pc + r1;
0x00005054 str r3, [r1, 0x43c] | *((r1 + 0x43c)) = r3;
0x00005058 add r1, r1, 0x430 |
0x0000505c add r1, r1, 0xc | r1 = 0x5500;
0x00005060 b 0x4ff0 |
| } while (1);
| label_2:
0x00005064 ldr r2, [r7] | r2 = *(r7);
0x00005068 ldr r3, [r5, r4, lsl 2] | offset_0 = r4 << 2;
| r3 = *((r5 + offset_0));
0x0000506c add r0, r5, r4, lsl 2 | r0 = r5 + (r4 << 2);
0x00005070 and r3, r3, r2 | r3 &= r2;
0x00005074 str r3, [r5, r4, lsl 2] | offset_1 = r4 << 2;
| *((r5 + offset_1)) = r3;
0x00005078 mov r2, r0 | r2 = r0;
0x0000507c mov r3, 0 | r3 = 0;
| do {
0x00005080 cmp r4, r3 |
| if (r4 != r3) {
0x00005084 addeq r4, r4, 1 | r4++;
| }
| if (r4 != r3) {
0x00005088 beq 0x50b4 |
0x0000508c ldr ip, [r5, r3, lsl 2] | offset_2 = r3 << 2;
| ip = *((r5 + offset_2));
0x00005090 ldr r1, [r2] | r1 = *(r2);
0x00005094 cmp ip, r1 |
| if (ip != r1) {
0x00005098 bne 0x50bc | goto label_3;
| }
0x0000509c ldr r1, [r6] | r1 = *(r6);
0x000050a0 mov r2, 4 | r2 = 4;
0x000050a4 sub r1, r1, 1 | r1--;
0x000050a8 str r1, [r6] | *(r6) = r1;
0x000050ac add r1, r5, r1, lsl 2 | r1 = r5 + (r1 << 2);
0x000050b0 bl 0x22a4 | memcpy (r0, r1, r2);
| }
0x000050b4 add r8, r8, 1 | r8++;
0x000050b8 b 0x5038 | goto label_0;
| label_3:
0x000050bc add r3, r3, 1 | r3++;
0x000050c0 b 0x5080 |
| } while (1);
| }
; 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/libxtables.so.12.2.0 @ 0x4cc8 */
| #include <stdint.h>
|
; (fcn) sym.xtables_ipparse_multiple () | void xtables_ipparse_multiple (int32_t arg_0h, int32_t arg1, int32_t arg2) {
| int32_t var_0h;
| int32_t var_4h;
| int32_t var_8h;
| int32_t var_ch;
| int32_t var_14h;
| char * dest;
| int32_t var_0h_2;
| int32_t var_118h;
| int32_t var_11ch;
| r0 = arg1;
| r1 = arg2;
0x00004cc8 push {r4, r5, r6, r7, r8, sb, sl, fp, lr} |
0x00004ccc ldr fp, [pc, 0x2b4] | fp = *(0x00004f88);
0x00004cd0 sub sp, sp, 0x11c |
0x00004cd4 mov r7, r0 | r7 = r0;
0x00004cd8 mov sb, r1 | sb = r1;
0x00004cdc mov r6, r2 | r6 = r2;
0x00004ce0 mov r5, 1 | r5 = 1;
0x00004ce4 add fp, pc, fp |
0x00004ce8 str r3, [sp, 8] | var_8h = r3;
| do {
0x00004cec mov r1, 0x2c | r1 = 0x2c;
0x00004cf0 bl 0x2628 | r0 = strchr (r0, r1);
0x00004cf4 subs r4, r0, 0 | r4 = r0 - 0;
| if (r4 == r0) {
0x00004cf8 bne 0x4d48 |
0x00004cfc lsl r8, r5, 2 | r8 = r5 << 2;
0x00004d00 mov r0, r8 | r0 = r8;
0x00004d04 bl 0x2400 | fcn_00002400 ();
0x00004d08 str r0, [sb] | *(sb) = r0;
0x00004d0c mov r0, r8 | r0 = r8;
0x00004d10 bl 0x2400 | fcn_00002400 ();
0x00004d14 ldr r3, [pc, 0x270] |
0x00004d18 add r3, pc, r3 | r3 = pc + r3;
0x00004d1c str r3, [sp, 4] | var_4h = r3;
0x00004d20 add r3, r3, 0x430 |
0x00004d24 add r3, r3, 0xc | r3 = 0x53c4;
0x00004d28 str r3, [sp] | *(sp) = r3;
0x00004d2c str r0, [r6] | *(r6) = r0;
| label_0:
0x00004d30 cmp r4, r5 |
| if (r4 >= r5) {
0x00004d34 bhs 0x4f4c | goto label_4;
| }
0x00004d38 ldr r3, [pc, 0x250] | r3 = *(0x4f8c);
0x00004d3c ldr r3, [fp, r3] | r3 = *((fp + r3));
0x00004d40 ldr r2, [r3] | r2 = *(0x4f8c);
0x00004d44 b 0x4d58 | goto label_5;
| }
0x00004d48 add r5, r5, 1 | r5++;
0x00004d4c add r0, r4, 1 | r0 = r4 + 1;
0x00004d50 b 0x4cec |
| } while (1);
| do {
0x00004d54 mov r7, r1 | r7 = r1;
| label_5:
0x00004d58 ldrb r3, [r7] | r3 = *(r7);
0x00004d5c add r1, r7, 1 | r1 = r7 + 1;
0x00004d60 lsl r3, r3, 1 | r3 <<= 1;
0x00004d64 ldrh r3, [r2, r3] | r3 = *((r2 + r3));
0x00004d68 tst r3, 0x20 |
0x00004d6c bne 0x4d54 |
| } while ((r3 & 0x20) != 0);
0x00004d70 mov r1, 0x2c | r1 = 0x2c;
0x00004d74 mov r0, r7 | r0 = r7;
0x00004d78 bl 0x2628 | r0 = strchr (r0, r1);
0x00004d7c subs r8, r0, 0 | r8 = r0 - 0;
| if (r8 == r0) {
0x00004d80 subne r3, r8, r7 | r3 = r8 - r7;
| }
| if (r8 == r0) {
0x00004d84 bne 0x4d94 |
0x00004d88 mov r0, r7 | r0 = r7;
0x00004d8c bl 0x2610 | r0 = strlen (r0);
0x00004d90 mov r3, r0 | r3 = r0;
| }
0x00004d94 cmp r3, 0xff |
| if (r3 >= 0xff) {
0x00004d98 bls 0x4dbc |
0x00004d9c ldr r3, [pc, 0x1f0] |
0x00004da0 ldr r1, [pc, 0x1f0] | r1 = *(0x4f94);
0x00004da4 ldr r3, [fp, r3] | r3 = *((fp + r3));
0x00004da8 add r1, pc, r1 | r1 = pc + r1;
0x00004dac ldr r3, [r3] |
0x00004db0 mov r0, 2 | r0 = 2;
0x00004db4 ldr r3, [r3, 0x14] | r3 = *(0x4fa4);
0x00004db8 blx r3 | uint32_t (*r3)(uint32_t, uint32_t, uint32_t) (r0, r1, r3);
| }
0x00004dbc add sl, sp, 0x18 | sl += dest;
0x00004dc0 mov r2, r3 | r2 = r3;
0x00004dc4 mov r1, r7 | r1 = r7;
0x00004dc8 mov r0, sl | r0 = sl;
0x00004dcc str r3, [sp, 0xc] | var_ch = r3;
0x00004dd0 bl 0x2448 | strncpy (r0, r1, r2);
0x00004dd4 ldr r3, [sp, 0xc] | r3 = var_ch;
0x00004dd8 add r2, sp, 0x118 | r2 += var_118h;
0x00004ddc add r3, r2, r3 | r3 = r2 + r3;
0x00004de0 mov r7, 0 | r7 = 0;
0x00004de4 mov r1, 0x2f | r1 = 0x2f;
0x00004de8 mov r0, sl | r0 = sl;
0x00004dec strb r7, [r3, -0x100] | dest = r7;
0x00004df0 bl 0x23ac | r0 = strrchr (r0, r1);
0x00004df4 cmp r0, 0 |
| if (r0 == 0) {
0x00004df8 beq 0x4ed0 | goto label_6;
| }
0x00004dfc strb r7, [r0], 1 | *(r0) = r7;
| r0++;
0x00004e00 bl 0x4be4 | r0 = fcn_00004be4 (r0);
0x00004e04 mov r1, r0 | r1 = r0;
| do {
0x00004e08 ldr r0, [r6] | r0 = *(r6);
0x00004e0c lsl r7, r4, 2 | r7 = r4 << 2;
0x00004e10 mov r2, 4 | r2 = 4;
0x00004e14 add r0, r0, r7 | r0 += r7;
0x00004e18 bl 0x22a4 | memcpy (r0, r1, r2);
0x00004e1c ldr r3, [r6] | r3 = *(r6);
0x00004e20 ldr r3, [r3, r4, lsl 2] | offset_0 = r4 << 2;
| r3 = *((r3 + offset_0));
0x00004e24 cmp r3, 0 |
| if (r3 == 0) {
0x00004e28 bne 0x4e3c |
0x00004e2c ldr r1, [pc, 0x168] | r1 = *(0x4f98);
0x00004e30 mov r0, sl | r0 = sl;
0x00004e34 add r1, pc, r1 | r1 = pc + r1;
0x00004e38 bl 0x21c0 | strcpy (r0, r1)
| }
0x00004e3c mov r0, sl | r0 = sl;
0x00004e40 add r1, sp, 0x14 | r1 += var_14h;
0x00004e44 bl 0x4aa0 | fcn_00004aa0 (r0, r1);
0x00004e48 ldr r3, [sp, 0x14] | r3 = var_14h;
0x00004e4c cmp r3, 1 |
0x00004e50 mov sl, r0 | sl = r0;
| if (r3 < 1) {
0x00004e54 bls 0x4f34 | goto label_7;
| }
0x00004e58 sub r3, r3, 1 | r3--;
0x00004e5c add r5, r5, r3 | r5 += r3;
0x00004e60 lsl r3, r5, 2 | r3 = r5 << 2;
0x00004e64 mov r1, r3 | r1 = r3;
0x00004e68 ldr r0, [sb] | r0 = *(sb);
0x00004e6c str r3, [sp, 0xc] | var_ch = r3;
0x00004e70 bl 0x25ec | fcn_000025ec ();
0x00004e74 ldr r3, [sp, 0xc] | r3 = var_ch;
0x00004e78 mov r1, r3 | r1 = r3;
0x00004e7c str r0, [sb] | *(sb) = r0;
0x00004e80 ldr r0, [r6] | r0 = *(r6);
0x00004e84 bl 0x25ec | fcn_000025ec ();
0x00004e88 mov r3, 0 | r3 = 0;
0x00004e8c str r0, [r6] | *(r6) = r0;
| label_1:
0x00004e90 ldr r2, [sp, 0x14] | r2 = var_14h;
0x00004e94 cmp r2, r3 |
| if (r2 > r3) {
0x00004e98 bhi 0x4ee4 | goto label_8;
| }
0x00004e9c mov r3, 1 | r3 = 1;
| label_2:
0x00004ea0 ldr r2, [sp, 0x14] | r2 = var_14h;
0x00004ea4 cmp r2, r3 |
| if (r2 > r3) {
0x00004ea8 bhi 0x4f0c | goto label_9;
| }
0x00004eac sub r4, r4, 1 | r4--;
0x00004eb0 add r4, r2, r4 | r4 = r2 + r4;
| label_3:
0x00004eb4 mov r0, sl | r0 = sl;
0x00004eb8 bl 0x2688 | free (r0);
0x00004ebc cmp r8, 0 |
| if (r8 == 0) {
0x00004ec0 beq 0x4f4c | goto label_4;
| }
0x00004ec4 add r7, r8, 1 | r7 = r8 + 1;
0x00004ec8 add r4, r4, 1 | r4++;
0x00004ecc b 0x4d30 | goto label_0;
| label_6:
0x00004ed0 ldr r2, [sp, 4] | r2 = var_4h;
0x00004ed4 mvn r3, 0 | r3 = ~0;
0x00004ed8 str r3, [r2, 0x43c] | *((r2 + 0x43c)) = r3;
0x00004edc ldr r1, [sp] | r1 = *(sp);
0x00004ee0 b 0x4e08 |
| } while (1);
| label_8:
0x00004ee4 ldr r0, [sb] | r0 = *(sb);
0x00004ee8 add ip, r4, r3 |
0x00004eec add r1, sl, r3, lsl 2 | r1 = sl + (r3 << 2);
0x00004ef0 mov r2, 4 | r2 = 4;
0x00004ef4 add r0, r0, ip, lsl 2 | r0 += (ip << 2);
0x00004ef8 str r3, [sp, 0xc] | var_ch = r3;
0x00004efc bl 0x22a4 | memcpy (r0, r1, r2);
0x00004f00 ldr r3, [sp, 0xc] | r3 = var_ch;
0x00004f04 add r3, r3, 1 | r3++;
0x00004f08 b 0x4e90 | goto label_1;
| label_9:
0x00004f0c ldr r0, [r6] | r0 = *(r6);
0x00004f10 add ip, r4, r3 |
0x00004f14 add r1, r0, r7 | r1 = r0 + r7;
0x00004f18 mov r2, 4 | r2 = 4;
0x00004f1c add r0, r0, ip, lsl 2 | r0 += (ip << 2);
0x00004f20 str r3, [sp, 0xc] | var_ch = r3;
0x00004f24 bl 0x22a4 | memcpy (r0, r1, r2);
0x00004f28 ldr r3, [sp, 0xc] | r3 = var_ch;
0x00004f2c add r3, r3, 1 | r3++;
0x00004f30 b 0x4ea0 | goto label_2;
| label_7:
0x00004f34 ldr r0, [sb] | r0 = *(sb);
0x00004f38 mov r2, 4 | r2 = 4;
0x00004f3c mov r1, sl | r1 = sl;
0x00004f40 add r0, r0, r7 | r0 += r7;
0x00004f44 bl 0x22a4 | memcpy (r0, r1, r2);
0x00004f48 b 0x4eb4 | goto label_3;
| label_4:
0x00004f4c ldr r3, [sp, 8] | r3 = var_8h;
0x00004f50 str r5, [r3] | *(r3) = r5;
0x00004f54 mov r3, 0 | r3 = 0;
| do {
0x00004f58 cmp r3, r5 |
| if (r3 == r5) {
0x00004f5c bne 0x4f68 |
0x00004f60 add sp, sp, 0x11c |
0x00004f64 pop {r4, r5, r6, r7, r8, sb, sl, fp, pc} |
| }
0x00004f68 ldr r1, [sb] | r1 = *(sb);
0x00004f6c ldr r0, [r6] | r0 = *(r6);
0x00004f70 ldr r2, [r1, r3, lsl 2] | offset_1 = r3 << 2;
| r2 = *((r1 + offset_1));
0x00004f74 ldr r0, [r0, r3, lsl 2] | offset_2 = r3 << 2;
| r0 = *((r0 + offset_2));
0x00004f78 and r2, r2, r0 | r2 &= r0;
0x00004f7c str r2, [r1, r3, lsl 2] | offset_3 = r3 << 2;
| *((r1 + offset_3)) = r2;
0x00004f80 add r3, r3, 1 | r3++;
0x00004f84 b 0x4f58 |
| } while (1);
| }
[*] Function strcpy used 7 times libxtables.so.12.2.0