-
Notifications
You must be signed in to change notification settings - Fork 0
/
camp2023-57032-eng-Demystify_Mach-O_opus.srt
2164 lines (1623 loc) · 49.9 KB
/
camp2023-57032-eng-Demystify_Mach-O_opus.srt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1
00:00:00,000 --> 00:00:10,000
[MUSIC]
2
00:00:10,000 --> 00:00:20,000
[MUSIC]
3
00:00:20,000 --> 00:00:32,760
>> Good morning.
4
00:00:32,760 --> 00:00:38,240
Welcome back on the Millivay stage for the second talk on day three.
5
00:00:39,240 --> 00:00:42,960
We welcome here our speaker,
6
00:00:42,960 --> 00:00:47,600
Gary Ginn and he will talk about demystifying Mach-O.
7
00:00:47,600 --> 00:00:52,520
Please give him a warm welcome and enjoy the talk.
8
00:00:52,520 --> 00:00:56,440
>> Howdy. Everyone can hear me?
9
00:00:56,440 --> 00:00:59,240
Cool. Let's start with who I am.
10
00:00:59,240 --> 00:01:00,800
I am Gary Ginn. I work on
11
00:01:00,800 --> 00:01:04,640
an iOS cybersecurity framework over in states.
12
00:01:04,640 --> 00:01:07,680
This isn't too important though.
13
00:01:07,680 --> 00:01:09,680
Let's talk about what we're going to talk about.
14
00:01:09,680 --> 00:01:11,800
So first, we're going to look at what is Mach-O,
15
00:01:11,800 --> 00:01:14,120
and why you should maybe look at it if you want to.
16
00:01:14,120 --> 00:01:16,120
Then we're going to go into the deep dive into
17
00:01:16,120 --> 00:01:18,680
the file format and the specification for it,
18
00:01:18,680 --> 00:01:21,240
and then in with a little code example about how you
19
00:01:21,240 --> 00:01:24,560
could parse a Mach-O file to get some information from it.
20
00:01:24,560 --> 00:01:29,560
So first, Mach-O is the executable file format for Darwin systems,
21
00:01:29,560 --> 00:01:34,160
think iOS, Mac OS, TV OS, all of those systems.
22
00:01:34,160 --> 00:01:37,840
It's very similar to ELF if you've ever used that for Linux,
23
00:01:37,840 --> 00:01:39,560
but it's a bit different.
24
00:01:39,560 --> 00:01:42,040
It's an architecture independent file format,
25
00:01:42,040 --> 00:01:45,320
and essentially any iOS app or
26
00:01:45,320 --> 00:01:50,120
Mac OS app that you create or want to reverse engineer or look at,
27
00:01:50,120 --> 00:01:52,360
will end up as this file format,
28
00:01:52,360 --> 00:01:57,440
generally speaking on the device or on your machine.
29
00:01:57,440 --> 00:02:00,880
So there's a few reasons why you might want to look at these files.
30
00:02:00,880 --> 00:02:03,000
First is if you want to read executables at runtime,
31
00:02:03,000 --> 00:02:05,280
such as doing metaprogramming on your own code,
32
00:02:05,280 --> 00:02:08,120
or if you want to do integrity checks in your own code,
33
00:02:08,120 --> 00:02:10,880
or maybe you want to do something like Frida and
34
00:02:10,880 --> 00:02:12,920
install trampolines on other people's code,
35
00:02:12,920 --> 00:02:16,400
and that requires being able to parse through these files.
36
00:02:16,400 --> 00:02:21,080
Custom build tooling, so if you want to inject data into
37
00:02:21,080 --> 00:02:26,440
your executables in specific parts of the segments,
38
00:02:26,440 --> 00:02:27,840
so that you can have the loader
39
00:02:27,840 --> 00:02:30,120
automatically map data really quickly for you,
40
00:02:30,120 --> 00:02:31,800
or you can have special hashes for
41
00:02:31,800 --> 00:02:34,120
integrity checks inside your executable files.
42
00:02:34,120 --> 00:02:36,200
Any disassembly or reverse engineering,
43
00:02:36,200 --> 00:02:37,680
you're going to have to look at these things.
44
00:02:37,680 --> 00:02:40,040
Like for example, you want to see what Apple code looks like.
45
00:02:40,040 --> 00:02:42,360
A really good way to do that is to load one of
46
00:02:42,360 --> 00:02:44,640
these files by linking the dial-up into memory,
47
00:02:44,640 --> 00:02:48,280
and then just dumping this executable file and disassembling it yourself,
48
00:02:48,280 --> 00:02:51,000
so you can see what's under the hood for
49
00:02:51,000 --> 00:02:54,840
these types of system libraries that Apple usually hides pretty well.
50
00:02:54,840 --> 00:02:57,600
So yeah, those are various reasons why you
51
00:02:57,600 --> 00:03:00,000
might want to look at these files and how you would get to them.
52
00:03:00,000 --> 00:03:02,600
So it's a binary format,
53
00:03:02,600 --> 00:03:05,240
so as we go through we're going to fill in just this block of bytes to
54
00:03:05,240 --> 00:03:06,920
show what the structure of the file looks like,
55
00:03:06,920 --> 00:03:09,320
and how you might get to various parts of it.
56
00:03:09,320 --> 00:03:12,800
So first, we have to talk about what are called fat binaries.
57
00:03:12,800 --> 00:03:16,760
So fat binaries are essentially a way to contain
58
00:03:16,760 --> 00:03:20,680
multiple executables of different architectures in the same file.
59
00:03:20,680 --> 00:03:23,640
So essentially you have like a program,
60
00:03:23,640 --> 00:03:27,280
and you want it to have x86 and arm64 instructions on it,
61
00:03:27,280 --> 00:03:31,720
so you can run it or maybe 32-bit and 64-bit applications on the same space.
62
00:03:31,720 --> 00:03:34,400
You just put them right next to each other.
63
00:03:34,400 --> 00:03:39,600
Once it's loaded, it only actually loads the architecture for the current machine,
64
00:03:39,600 --> 00:03:42,280
so the loader will know not to pick up the entire file,
65
00:03:42,280 --> 00:03:45,000
but only the one for the current machine you're on.
66
00:03:45,000 --> 00:03:49,680
You can have a fat binary that is only one architecture,
67
00:03:49,680 --> 00:03:54,200
but the existence of the fat header is very optional.
68
00:03:54,200 --> 00:03:58,360
It's not required, but it is possible for it to be there,
69
00:03:58,360 --> 00:03:59,960
even if there's only one architecture.
70
00:03:59,960 --> 00:04:03,520
It is important to note that these are kind of going away.
71
00:04:03,520 --> 00:04:05,320
Fat binaries were used for a very long time.
72
00:04:05,320 --> 00:04:10,360
You still use them on applications you find on the internet for Mac,
73
00:04:10,360 --> 00:04:14,280
but most iOS applications do not use fat binaries anymore
74
00:04:14,280 --> 00:04:19,640
because there was a conflict in the iOS 16 arm64 simulator
75
00:04:19,640 --> 00:04:21,880
that made it so that they couldn't,
76
00:04:21,880 --> 00:04:23,280
essentially there was a naming conflict.
77
00:04:23,280 --> 00:04:25,840
So they had to reintroduce Xe frameworks,
78
00:04:25,840 --> 00:04:27,680
which are essentially a better version of this.
79
00:04:27,680 --> 00:04:29,440
But yeah, this is a way that you can have one file
80
00:04:29,440 --> 00:04:33,240
represent multiple architectures and not have to worry about
81
00:04:33,240 --> 00:04:37,360
giving people the x86 or the arm64 version.
82
00:04:37,360 --> 00:04:42,240
So a fat binary starts with a fat header.
83
00:04:42,240 --> 00:04:43,640
You can define these definitions.
84
00:04:43,640 --> 00:04:45,640
I'll list the headers as we go along.
85
00:04:45,640 --> 00:04:50,120
They're all in the system headers for iOS and macOS and all that.
86
00:04:50,120 --> 00:04:52,480
If the file is a fat binary, it'll start with a fat header,
87
00:04:52,480 --> 00:04:56,000
and you check that by looking at the magic number there.
88
00:04:56,000 --> 00:04:58,280
It gives you both fat magic and fat SIGAM,
89
00:04:58,280 --> 00:05:00,800
so you can determine the Indian-ness of the data
90
00:05:00,800 --> 00:05:02,120
that you're about to look at.
91
00:05:02,120 --> 00:05:03,680
That's very important for the fat header
92
00:05:03,680 --> 00:05:07,000
because it may be produced on a machine completely different.
93
00:05:07,000 --> 00:05:09,200
Like for example, you could be reading this on iOS,
94
00:05:09,200 --> 00:05:14,680
but it was produced on an x86, 64 Intel machine like a Mac.
95
00:05:14,680 --> 00:05:17,040
And so you use that to determine India,
96
00:05:17,040 --> 00:05:19,360
so you can actually read the header correctly.
97
00:05:19,360 --> 00:05:23,280
It then tells you the type of the header,
98
00:05:23,280 --> 00:05:25,920
tells you how many architectures there are.
99
00:05:25,920 --> 00:05:28,960
Each architecture tells you the CPU type and subtype
100
00:05:28,960 --> 00:05:32,520
that it belongs to, as well as the offset into the file
101
00:05:32,520 --> 00:05:34,440
that architecture belongs.
102
00:05:34,440 --> 00:05:37,440
And then it also tells you the size and the alignment.
103
00:05:37,440 --> 00:05:39,720
The size will always be an integer multiple
104
00:05:39,720 --> 00:05:42,880
of the underlying page size of that architecture, right?
105
00:05:42,880 --> 00:05:47,120
So I think for arm64, that's 512 bytes, or yeah, I think so.
106
00:05:48,920 --> 00:05:53,760
Yeah, and then of course, it's a 64-bit variant.
107
00:05:53,760 --> 00:05:57,080
There's also APIs you can use in machine.h
108
00:05:57,080 --> 00:06:00,800
to determine which CPU type belongs on either your machine
109
00:06:00,800 --> 00:06:04,320
or if you want to try and grade-- it's the same thing
110
00:06:04,320 --> 00:06:06,040
that all operating system uses to choose
111
00:06:06,040 --> 00:06:09,000
which architecture to load, but it'll grade slices
112
00:06:09,000 --> 00:06:10,480
and then determine which one to load.
113
00:06:10,480 --> 00:06:12,680
You can dab those available in machine.h.
114
00:06:12,680 --> 00:06:17,520
So if you're opening a framework up on disk
115
00:06:17,520 --> 00:06:19,160
and you want to check which one to use,
116
00:06:19,160 --> 00:06:22,200
you can use those to make sure you're loading the correct one,
117
00:06:22,200 --> 00:06:25,480
or at least looking at the correct one.
118
00:06:25,480 --> 00:06:27,080
You can use lipo and oTool.
119
00:06:27,080 --> 00:06:28,760
These are two little command line utilities
120
00:06:28,760 --> 00:06:30,680
that come in the box.
121
00:06:30,680 --> 00:06:34,720
And you can use them to kind of see fat headers.
122
00:06:34,720 --> 00:06:39,200
And also lipo lets you inject or remove various slices
123
00:06:39,200 --> 00:06:42,680
into a universal or fat binary.
124
00:06:42,680 --> 00:06:45,040
You can see here, we can see the header and all the type
125
00:06:45,040 --> 00:06:46,040
of stuff within it.
126
00:06:47,040 --> 00:06:50,720
So yeah, so this is the structure at this point.
127
00:06:50,720 --> 00:06:53,640
We have a fat header, two fat architectures.
128
00:06:53,640 --> 00:06:56,320
You could say this is 32-bit, 64-bit.
129
00:06:56,320 --> 00:06:58,880
And then we have two Mach-O objects,
130
00:06:58,880 --> 00:07:01,680
which define executables at the same time.
131
00:07:01,680 --> 00:07:03,280
Theoretically, these are two programs,
132
00:07:03,280 --> 00:07:07,440
just different architectures-- same program, two architectures.
133
00:07:07,440 --> 00:07:11,240
So a Mach-O object is then kind of the way
134
00:07:11,240 --> 00:07:15,040
that if you are familiar with how segmentation originally
135
00:07:15,040 --> 00:07:18,320
worked in memory for operating systems,
136
00:07:18,320 --> 00:07:21,120
this influences how this works here.
137
00:07:21,120 --> 00:07:23,000
The object is split into segments,
138
00:07:23,000 --> 00:07:24,880
which are effectively memory ranges that
139
00:07:24,880 --> 00:07:28,520
will exist in virtual memory when your program is running.
140
00:07:28,520 --> 00:07:30,960
Each of those have their own memory protections and a space
141
00:07:30,960 --> 00:07:34,160
that the loader will then map into your process's
142
00:07:34,160 --> 00:07:36,360
virtual memory space.
143
00:07:36,360 --> 00:07:38,120
They all begin with the header, and they're
144
00:07:38,120 --> 00:07:39,680
followed by a list of load commands.
145
00:07:39,680 --> 00:07:42,040
Load commands define everything else about the file.
146
00:07:42,040 --> 00:07:43,600
So once you read the load commands,
147
00:07:43,600 --> 00:07:44,840
you know where everything is.
148
00:07:44,840 --> 00:07:50,560
Each segment can have sections inside of it
149
00:07:50,560 --> 00:07:51,840
so that it can have a little more
150
00:07:51,840 --> 00:07:53,880
information on where things are.
151
00:07:53,880 --> 00:07:57,520
And we'll go through the definition of a lot of these
152
00:07:57,520 --> 00:07:58,200
going through.
153
00:07:58,200 --> 00:08:00,120
We're not going to look at every segment in every section,
154
00:08:00,120 --> 00:08:03,280
because technically, you can make your own segments
155
00:08:03,280 --> 00:08:04,280
and your own sections.
156
00:08:04,280 --> 00:08:07,360
There's also just a lot of them.
157
00:08:07,360 --> 00:08:10,960
You can use O-Tool to look through these on various files
158
00:08:10,960 --> 00:08:13,120
that you already have.
159
00:08:13,120 --> 00:08:14,160
And yeah.
160
00:08:14,160 --> 00:08:17,480
So if we look at some common segments--
161
00:08:17,480 --> 00:08:20,000
so these probably should be familiar.
162
00:08:20,000 --> 00:08:23,600
Page 0 is a null pointer trap.
163
00:08:23,600 --> 00:08:28,560
On Mac, I know different OS is handled a little differently.
164
00:08:28,560 --> 00:08:31,440
But on Darwin, they actually don't map page 0.
165
00:08:31,440 --> 00:08:34,680
They just claim it to have no protections at all,
166
00:08:34,680 --> 00:08:37,000
which that gives you your nice behavior,
167
00:08:37,000 --> 00:08:40,160
where if you try to do reference a null pointer,
168
00:08:40,160 --> 00:08:44,000
it crashes instead of just doing whatever.
169
00:08:44,000 --> 00:08:46,080
And so there might be a change to this.
170
00:08:46,080 --> 00:08:47,720
I remember reading somewhere that they were looking at
171
00:08:47,720 --> 00:08:49,200
actually mapping it.
172
00:08:49,200 --> 00:08:51,600
Not like allocating memory for it, just mapping it,
173
00:08:51,600 --> 00:08:53,960
because apparently there's a null pointer exploit,
174
00:08:53,960 --> 00:08:57,000
because of the fact that it's not actually mapped.
175
00:08:57,000 --> 00:08:59,920
And for 64-bit applications, this
176
00:08:59,920 --> 00:09:02,760
doesn't just map the first page of the process space.
177
00:09:02,760 --> 00:09:05,960
It also maps all of 32-bit application space.
178
00:09:05,960 --> 00:09:09,400
So on 64-bit apps on Darwin, you cannot dereference
179
00:09:09,400 --> 00:09:10,920
a 32-bit pointer.
180
00:09:10,920 --> 00:09:14,120
And it also means you can't load a 32-bit library
181
00:09:14,120 --> 00:09:15,200
into 64-bit space.
182
00:09:15,200 --> 00:09:18,800
So that's a neat little thing they did there.
183
00:09:18,800 --> 00:09:21,480
The text segment is usually the first segment.
184
00:09:21,480 --> 00:09:24,040
It is the first segment, and it always contains the mock
185
00:09:24,040 --> 00:09:24,640
header.
186
00:09:24,640 --> 00:09:27,400
The reason it does that is so that when you're code signing
187
00:09:27,400 --> 00:09:31,640
your stuff, the code signing only looks at the text segment.
188
00:09:31,640 --> 00:09:34,200
So whenever you have signed executables from the iOS app
189
00:09:34,200 --> 00:09:36,680
store or whatever, it's just looking at that first text
190
00:09:36,680 --> 00:09:36,960
segment.
191
00:09:36,960 --> 00:09:39,760
That's the only thing executable that gets code signed.
192
00:09:39,760 --> 00:09:43,520
That also means that if you have data
193
00:09:43,520 --> 00:09:46,840
that you want to be code signed and have integrity protection
194
00:09:46,840 --> 00:09:50,680
on it from Apple systems, you can put it in the text segment.
195
00:09:50,680 --> 00:09:54,400
You can either be a C string, or you can actually just
196
00:09:54,400 --> 00:09:56,000
explicitly tell the compiler, hey,
197
00:09:56,000 --> 00:09:58,560
put this in the text segment.
198
00:09:58,560 --> 00:09:59,640
Watch out, though.
199
00:09:59,640 --> 00:10:01,400
It means it will also be executable.
200
00:10:01,400 --> 00:10:03,240
So I don't know.
201
00:10:03,240 --> 00:10:05,760
Take your risk there.
202
00:10:05,760 --> 00:10:09,560
Data, that's where all your common data, immutable state
203
00:10:09,560 --> 00:10:11,480
will be.
204
00:10:11,480 --> 00:10:16,920
Data const is a bit interesting.
205
00:10:16,920 --> 00:10:19,240
So yeah, the way these protections work is left
206
00:10:19,240 --> 00:10:20,440
is the initial protection.
207
00:10:20,440 --> 00:10:22,280
So you can see on text, it's read execute,
208
00:10:22,280 --> 00:10:24,280
and then right is max protections.
209
00:10:24,280 --> 00:10:26,520
So that's what you can theoretically
210
00:10:26,520 --> 00:10:28,720
upgrade the segment to.
211
00:10:28,720 --> 00:10:32,720
So on Mac, you can make your text segment writable.
212
00:10:32,720 --> 00:10:34,160
Data const is a bit weird.
213
00:10:34,160 --> 00:10:36,640
So data const was a section that was added,
214
00:10:36,640 --> 00:10:41,480
because originally, there was no const data on Darwin
215
00:10:41,480 --> 00:10:43,280
or any Mac system like that.
216
00:10:43,280 --> 00:10:45,640
They just had a section in data that
217
00:10:45,640 --> 00:10:49,200
was assumed const for the global offset table.
218
00:10:49,200 --> 00:10:51,600
That isn't great, because you can just go in and--
219
00:10:51,600 --> 00:10:54,480
for example, an attacker can go in and change the global offset
220
00:10:54,480 --> 00:10:57,520
table, and then suddenly all your calls to any system
221
00:10:57,520 --> 00:11:00,760
functions can be easily detoured.
222
00:11:00,760 --> 00:11:03,480
They kind of fix this by adding data const,
223
00:11:03,480 --> 00:11:05,840
which is also not const.
224
00:11:05,840 --> 00:11:10,560
But instead, what happens is it starts out as read/write.
225
00:11:10,560 --> 00:11:14,720
Then dyld, after it's done dynamic linking,
226
00:11:14,720 --> 00:11:16,320
will make it read-only.
227
00:11:16,320 --> 00:11:18,720
But you can always just go back and make it writable again,
228
00:11:18,720 --> 00:11:22,200
because it has max protections, and dyld is in user space.
229
00:11:22,200 --> 00:11:24,320
So it's not const.
230
00:11:24,320 --> 00:11:27,760
But it's by default, though, const.
231
00:11:27,760 --> 00:11:30,160
However, there is a change happening here.
232
00:11:30,160 --> 00:11:32,680
In iOS 17, they are releasing--
233
00:11:32,680 --> 00:11:35,240
which I should be releasing in like a month or two--
234
00:11:35,240 --> 00:11:38,240
they added this SG read-only flag.
235
00:11:38,240 --> 00:11:44,040
So this flag, when added to a mock header,
236
00:11:44,040 --> 00:11:47,680
it will have the kernel make it actually read-only
237
00:11:47,680 --> 00:11:50,440
after dyld is done.
238
00:11:50,440 --> 00:11:52,880
If you don't want that behavior for your executable,
239
00:11:52,880 --> 00:11:54,560
you can remove the flag.
240
00:11:54,560 --> 00:11:56,360
But that's something you notice.
241
00:11:56,360 --> 00:11:59,600
Or maybe if you're trying to hook another executable,
242
00:11:59,600 --> 00:12:02,440
look for that flag, because it might break all your hooks.
243
00:12:02,440 --> 00:12:10,760
But it will actually be const, or closer to const, in iOS 17.
244
00:12:10,760 --> 00:12:14,360
And then there you have things like your global offset table,
245
00:12:14,360 --> 00:12:17,720
your Objective-C class list, and const data, that kind of stuff.
246
00:12:17,720 --> 00:12:20,640
And then link edit is at the end of most executables.
247
00:12:20,640 --> 00:12:22,720
And it's just linker data.
248
00:12:22,720 --> 00:12:26,400
It's where dyld will get its operation codes,
249
00:12:26,400 --> 00:12:28,600
because dyld has its own special opcodes that
250
00:12:28,600 --> 00:12:32,600
are used to define how to update the various dynamic linking