Александр СмирновРуководитель группы разработки, iOS Почтаalex.smirnov@corp.mail.ru@__smirnov__
REVERSE ENGINEERING@__smirnov__
О ЧЕМ ПОЙДЕТ РЕЧЬ• Зачем ?• Какие есть подходы ?• Инструментарий• Mach-O binary• Decrypting apps,ASLR,THUMB2/ARM• Asm, Pro...
BLAH BLAH BLAH@__smirnov__
ЗАЧЕМ ЭТО НУЖНО ?• Это весело• Анализ конкурирующих продуктов• Совместимость с проприетарнымпрограммным обеспечением• Ауди...
МЕТОДЫ АНАЛИЗАSystem Level Code LevelNetwork traffic sniffing Disassembling/DecompilingАнализ I/O активности DebuggingОбщий ...
TOOLSETotool/otx дизассемблерgdb/lldbclass-dumpполучаем информацию об objcклассах из mach-oMachOViewудобное представление ...
MACH-O BINARY@__smirnov__
MACH-O HEADER0xCAFEBABE0xFEEDFACF0xFEEDFACE32bit 64bit FAT@__smirnov__
SEGMENTS AND SECTIONSLoad command 1cmd LC_SEGMENTcmdsize 532segname __TEXTvmaddr 0x00001000vmsize 0x00027000fileoff 0files...
__OBJC SEGMENTclass-dumpby Steve Nygard__message_refs __instance_vars__cls_refs __inst_meth__symbols __cls_meth__module_in...
CLASS-DUMP@interface Alfred1PwdPreferences : NSObject <AlfredPreferencePane>{Alfred1PwdPreferencesViewController *viewCont...
ШИФРОВАНИЕ ПРИЛОЖЕНИЙThis file is encryptedcryptid: 0x00000001, cryptoff: 0x00002000, cryptsize: 0x001e2000@__smirnov__
ВНИМАНИЕ@__smirnov__
DECRYPT APPSTORE BINARYLoad command 12cmd LC_ENCRYPTION_INFOcmdsize 20cryptoff 8192cryptsize 1974272cryptid 1STEP 1 - otoo...
ASLRUser Space ASLR представлен в iOS 4.30x1000 becomes 0x54000Address Space Layout Randomization — случайное изменение ра...
DECRYPT APPSTORE BINARYSTEP 2 - gdb(gdb) info mach-regionsRegion from 0x54000 to 0x238000 (r-x, max r-x; copy, private, no...
DECRYPT APPSTORE BINARYSTEP 2.5 - gdbSectionsectname __textsegname __TEXTaddr 0x00003d38size 0x00170520offset 11576(gdb) x...
THUMB MODEARM MODE THUMB2 MODE32bit long instructions 16 to 32bit long instructions0x56d38 0x56d39LSB bit10101101101001110...
DECRYPT APPSTORE BINARYSTEP 2.5 - gdbcryptoff TARGET__TEXT0x00x0 0x54000__TEXT+cryptoff0x54000+8192__TEXT+cryptoff+cryptsi...
DECRYPT APPSTORE BINARYSTEP 3 - patcharchitecture 0cputype 12cpusubtype 9capabilities 0x0offset 4096size 2494896align 2^12...
ЧТО ТЕПЕРЬ?push {r4, r7, lr}add r7, sp, #4sub sp, #8mov r4, r0movw r0, 0x99dcmovt r0, 0x21movw r2, 0xf216movt r2, 0x21add ...
ПОНИМАНИЕ ПРИДИ@__smirnov__
I386Prologuepushl	  	  	  %ebpmovl	  	  	  	  %esp,%ebpsubl	  	  	  	  $0x28,%espApplication Binary Interfaceсохраняем sta...
EIP RELATIVE ADDRESSING0000183d calll	  	  	  0x0000184200001842 popl	  	  	  	  %ebx••• •••0000185c movl	  	  	  	  0x000...
OBJC_MSGSENDid objc_msgSend(id theReceiver, SEL theSelector, ...)80% вызовов@__smirnov__
ARMV7 AND OTX((0x99a2 & 0xffff) | (0x21<<16)) + (0x3d96 + 4) & ~1methnames[selrefs[0x21d73c]] = “setWelcomeVC:”00003d8c mo...
ВСЕ ЕЩЕ ВНИМАТЕЛЬНЫ ?@__smirnov__
SELECTOR__objc_selrefs__objc_selrefsmem offset value0x21D738 0x1756CE0x21D73C 0x1756D60x21D740 0x1756E4••• •••__objc_methn...
DYLDblx 0x1e4bac__TEXT, __symbolstub1__TEXT, __symbolstub1__TEXT, __symbolstub1001e4ba8 ldr pc,	  [pc,	  #1728]001e4bac ld...
ЗАКОНЧИМ ТЕМ ОТКУДА НАЧАТЬ• Отслеживание ввода данных• Места использования данных• Известные методы• Class-dump• Известные...
@__smirnov__
Smirnov reverse-engineering-techforum
Upcoming SlideShare
Loading in …5
×

Smirnov reverse-engineering-techforum

668 views
593 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
668
On SlideShare
0
From Embeds
0
Number of Embeds
214
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Smirnov reverse-engineering-techforum

  1. 1. Александр СмирновРуководитель группы разработки, iOS Почтаalex.smirnov@corp.mail.ru@__smirnov__
  2. 2. REVERSE ENGINEERING@__smirnov__
  3. 3. О ЧЕМ ПОЙДЕТ РЕЧЬ• Зачем ?• Какие есть подходы ?• Инструментарий• Mach-O binary• Decrypting apps,ASLR,THUMB2/ARM• Asm, Prologue, EIP addressing, Msgs, DYLD• Откуда начинать анализ@__smirnov__
  4. 4. BLAH BLAH BLAH@__smirnov__
  5. 5. ЗАЧЕМ ЭТО НУЖНО ?• Это весело• Анализ конкурирующих продуктов• Совместимость с проприетарнымпрограммным обеспечением• Аудит безопасностиЭто весело!@__smirnov__
  6. 6. МЕТОДЫ АНАЛИЗАSystem Level Code LevelNetwork traffic sniffing Disassembling/DecompilingАнализ I/O активности DebuggingОбщий анализ системных вызовов ObjC Runtime@__smirnov__
  7. 7. TOOLSETotool/otx дизассемблерgdb/lldbclass-dumpполучаем информацию об objcклассах из mach-oMachOViewудобное представление mach-oзаголовков, сегментов, секцийlipo манипулирование fat файламиhexdump/0xEDcycriptвоздействуем на приложение вruntimepython/ruby/perl@__smirnov__
  8. 8. MACH-O BINARY@__smirnov__
  9. 9. MACH-O HEADER0xCAFEBABE0xFEEDFACF0xFEEDFACE32bit 64bit FAT@__smirnov__
  10. 10. SEGMENTS AND SECTIONSLoad command 1cmd LC_SEGMENTcmdsize 532segname __TEXTvmaddr 0x00001000vmsize 0x00027000fileoff 0filesize 159744maxprot 0x00000007initprot 0x00000005nsects 7flags 0x0Sectionsectname __textsegname __TEXTaddr 0x00002848size 0x0001b86coffset 6216align 2^2 (4)reloff 0nreloc 0flags 0x80000400reserved1 0reserved2 0@__smirnov__
  11. 11. __OBJC SEGMENTclass-dumpby Steve Nygard__message_refs __instance_vars__cls_refs __inst_meth__symbols __cls_meth__module_info __cat_cls_meth__class __protocol_ext__meta_class __cat_inst_meth@__smirnov__
  12. 12. CLASS-DUMP@interface Alfred1PwdPreferences : NSObject <AlfredPreferencePane>{Alfred1PwdPreferencesViewController *viewController;}- (unsigned long long)sortPriority; // IMP=0x0000000100089e9f- (BOOL)isPowerpack; // IMP=0x0000000100089e94- (id)paneGroup; // IMP=0x0000000100089e87- (id)paneView; // IMP=0x0000000100089dfb- (id)paneIcon; // IMP=0x0000000100089d49- (id)paneName; // IMP=0x0000000100089d3c- (id)paneUID; // IMP=0x0000000100089d2f- (void)dealloc; // IMP=0x0000000100089ce5@end@__smirnov__
  13. 13. ШИФРОВАНИЕ ПРИЛОЖЕНИЙThis file is encryptedcryptid: 0x00000001, cryptoff: 0x00002000, cryptsize: 0x001e2000@__smirnov__
  14. 14. ВНИМАНИЕ@__smirnov__
  15. 15. DECRYPT APPSTORE BINARYLoad command 12cmd LC_ENCRYPTION_INFOcmdsize 20cryptoff 8192cryptsize 1974272cryptid 1STEP 1 - otoolсмещениеразмерзашифровано@__smirnov__
  16. 16. ASLRUser Space ASLR представлен в iOS 4.30x1000 becomes 0x54000Address Space Layout Randomization — случайное изменение расположенияв адресном пространстве процесса важных структур, а именно: образаисполняемого файла, подгружаемых библиотек, кучи и стека.KASLR представлен в iOS 6.0@__smirnov__
  17. 17. DECRYPT APPSTORE BINARYSTEP 2 - gdb(gdb) info mach-regionsRegion from 0x54000 to 0x238000 (r-x, max r-x; copy, private, not-reserved) (2 sub-regions)... from 0x238000 to 0x292000 (rw-, max rw-; copy, private, not-reserved) (2 sub-regions)...(gdb) x/4x 0x540000x54000: 0xfeedface 0x0000000c 0x00000009 0x000000020x1000 переехало в 0x54000@__smirnov__
  18. 18. DECRYPT APPSTORE BINARYSTEP 2.5 - gdbSectionsectname __textsegname __TEXTaddr 0x00003d38size 0x00170520offset 11576(gdb) x/10i (0x54000+11576)|10x56d39: push {r4, r7, lr}0x56d3b: add r7, sp, #40x56d3d: sub sp, #80x56d3f: mov r4, r00x56d41: movw r0, #39388 ; 0x99dc0x56d45: movt r0, #33 ; 0x21(0x54000+11576)|1@__smirnov__
  19. 19. THUMB MODEARM MODE THUMB2 MODE32bit long instructions 16 to 32bit long instructions0x56d38 0x56d39LSB bit1010110110100111000 1010110110100111001@__smirnov__
  20. 20. DECRYPT APPSTORE BINARYSTEP 2.5 - gdbcryptoff TARGET__TEXT0x00x0 0x54000__TEXT+cryptoff0x54000+8192__TEXT+cryptoff+cryptsize0x54000+8192+1974272@__smirnov__
  21. 21. DECRYPT APPSTORE BINARYSTEP 3 - patcharchitecture 0cputype 12cpusubtype 9capabilities 0x0offset 4096size 2494896align 2^12 (4096)fatheadermach headerarch0arch0 contentmach headerarch1arch0 content0x0 0x1000architecture 1cputype 12cpusubtype 11capabilities 0x0offset 2502656size 2490624align 2^12 (4096)0x2630004096 2490624arch_offset + cryptoffset@__smirnov__
  22. 22. ЧТО ТЕПЕРЬ?push {r4, r7, lr}add r7, sp, #4sub sp, #8mov r4, r0movw r0, 0x99dcmovt r0, 0x21movw r2, 0xf216movt r2, 0x21add r0, pcadd r2, pcldr r1, [r0, #0]ldr r0, [r2, #0]blx 0x1e4bacmovw r1, 0x99camov r2, r4movt r1, 0x21add r1, pcldr r1, [r1, #0]blx 0x1e4bacARMv7pushl %ebpmovl %esp,%ebpsubl $0x28,%espmovl %edi,0xfc(%ebp)movl 0x08(%ebp),%edimovl %ebx,0xf4(%ebp)movl %esi,0xf8(%ebp)calll 0x00001842popl %ebxmovb $__mh_bundle_header,0x69(%edi)movl 0x18(%ebp),%eaxtestl %eax,%eaxje 0x00001923movl 0x18(%ebp),%eaxmovl %edi,(%esp)movl %eax,0x08(%esp)movl 0x00009d6a(%ebx),%eaxmovl %eax,0x04(%esp)calll 0x0000c10di386pushq %rbpmovq %rsp,%rbpmovq %r12,0xf0(%rbp)movq %r13,0xf8(%rbp)movq %rdi,%r12movq %rbx,0xe8(%rbp)subq $0x30,%rspmovq 0x0000be4a(%rip),%raxtestq %r8,%r8movq %rdx,0xd8(%rbp)movl %ecx,0xd4(%rbp)movq %r8,%r13movb $__mh_bundle_header,(%rdi,%rax)je 0x00000cd5movq %r8,%rdxleaq 0x0000aaa9(%rip),%rsicall *0x0000aaa3(%rip)testq %rax,%raxjne 0x00000c53x86_64@__smirnov__
  23. 23. ПОНИМАНИЕ ПРИДИ@__smirnov__
  24. 24. I386Prologuepushl      %ebpmovl        %esp,%ebpsubl        $0x28,%espApplication Binary Interfaceсохраняем stack frameновый stack frameместо на стеке@__smirnov__
  25. 25. EIP RELATIVE ADDRESSING0000183d calll      0x0000184200001842 popl        %ebx••• •••0000185c movl        0x00009d6a(%ebx),%eax0x9d6a + 0x1842 = 0xb5acoffset eip addressтрюк для получениязначения eipeax = *(0x9d6a+ebx)@__smirnov__
  26. 26. OBJC_MSGSENDid objc_msgSend(id theReceiver, SEL theSelector, ...)80% вызовов@__smirnov__
  27. 27. ARMV7 AND OTX((0x99a2 & 0xffff) | (0x21<<16)) + (0x3d96 + 4) & ~1methnames[selrefs[0x21d73c]] = “setWelcomeVC:”00003d8c movw        r0,  0x99a200003d90 movs        r2,  #000003d92 movt        r0,  0x2100003d96 add          r0,  pc00003d98 ldr          r1,  [r0,  #0]00003d9a mov          r0,  r400003d9c blx          0x1e4bacмладшие 16 bit1 аргумент = nilстаршие 16 bit+ Program Counterr1 = *addressуказатель на объект в r0вызов objc_msgSend@__smirnov__
  28. 28. ВСЕ ЕЩЕ ВНИМАТЕЛЬНЫ ?@__smirnov__
  29. 29. SELECTOR__objc_selrefs__objc_selrefsmem offset value0x21D738 0x1756CE0x21D73C 0x1756D60x21D740 0x1756E4••• •••__objc_methname__objc_methnamemem offset 0x1756B0defaultCenterremoveObserver:releasesetWelcomeVC:deallocallocmainScreenboundsinitWithFrame:autoreleasesetWindow:setupInitialLoadingWindowsetAppId:setDaysUntilPrompt:setUsesUntilPrompt:setSignificantEventsUntilPrompt:setTimeBefodefaultCenterremoveObserver:releasesetWelcomeVC:deallocallocmainScreenboundsinitWithFrame:autoreleasesetWindow:setupInitialLoadingWindowsetAppId:setDaysUntilPrompt:setUsesUntilPrompt:setSignificantEventsUntilPrompt:setTimeBefomethnames[selrefs[0x21d73c]] = “setWelcomeVC:”arch_offset + sect_file_start + ( target_addr - sect_mem_start )@__smirnov__
  30. 30. DYLDblx 0x1e4bac__TEXT, __symbolstub1__TEXT, __symbolstub1__TEXT, __symbolstub1001e4ba8 ldr pc,  [pc,  #1728]001e4bac ldr pc,  [pc,  #1728]001e4bb0 ldr pc,  [pc,  #1728]111100100101110101100 ARM MODE__DATA, __lazysymbol__DATA, __lazysymbol001e5270 001749cc001e5274 001749d8001e5278 001749e40x1e4bac + 8 + 1728 = 0x1e5274 _stub_helper _objc_msgSend1 2@__smirnov__
  31. 31. ЗАКОНЧИМ ТЕМ ОТКУДА НАЧАТЬ• Отслеживание ввода данных• Места использования данных• Известные методы• Class-dump• Известные константы• Используемые библиотеки@__smirnov__
  32. 32. @__smirnov__

×