Your SlideShare is downloading. ×
  • Like
Smirnov reverse-engineering-techforum
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Smirnov reverse-engineering-techforum

  • 434 views
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
434
On SlideShare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
5
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Александр СмирновРуководитель группы разработки, iOS Почтаalex.smirnov@corp.mail.ru@__smirnov__
  • 2. REVERSE ENGINEERING@__smirnov__
  • 3. О ЧЕМ ПОЙДЕТ РЕЧЬ• Зачем ?• Какие есть подходы ?• Инструментарий• Mach-O binary• Decrypting apps,ASLR,THUMB2/ARM• Asm, Prologue, EIP addressing, Msgs, DYLD• Откуда начинать анализ@__smirnov__
  • 4. BLAH BLAH BLAH@__smirnov__
  • 5. ЗАЧЕМ ЭТО НУЖНО ?• Это весело• Анализ конкурирующих продуктов• Совместимость с проприетарнымпрограммным обеспечением• Аудит безопасностиЭто весело!@__smirnov__
  • 6. МЕТОДЫ АНАЛИЗАSystem Level Code LevelNetwork traffic sniffing Disassembling/DecompilingАнализ I/O активности DebuggingОбщий анализ системных вызовов ObjC Runtime@__smirnov__
  • 7. TOOLSETotool/otx дизассемблерgdb/lldbclass-dumpполучаем информацию об objcклассах из mach-oMachOViewудобное представление mach-oзаголовков, сегментов, секцийlipo манипулирование fat файламиhexdump/0xEDcycriptвоздействуем на приложение вruntimepython/ruby/perl@__smirnov__
  • 8. MACH-O BINARY@__smirnov__
  • 9. MACH-O HEADER0xCAFEBABE0xFEEDFACF0xFEEDFACE32bit 64bit FAT@__smirnov__
  • 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. __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. 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. ШИФРОВАНИЕ ПРИЛОЖЕНИЙThis file is encryptedcryptid: 0x00000001, cryptoff: 0x00002000, cryptsize: 0x001e2000@__smirnov__
  • 14. ВНИМАНИЕ@__smirnov__
  • 15. DECRYPT APPSTORE BINARYLoad command 12cmd LC_ENCRYPTION_INFOcmdsize 20cryptoff 8192cryptsize 1974272cryptid 1STEP 1 - otoolсмещениеразмерзашифровано@__smirnov__
  • 16. ASLRUser Space ASLR представлен в iOS 4.30x1000 becomes 0x54000Address Space Layout Randomization — случайное изменение расположенияв адресном пространстве процесса важных структур, а именно: образаисполняемого файла, подгружаемых библиотек, кучи и стека.KASLR представлен в iOS 6.0@__smirnov__
  • 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. 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. THUMB MODEARM MODE THUMB2 MODE32bit long instructions 16 to 32bit long instructions0x56d38 0x56d39LSB bit1010110110100111000 1010110110100111001@__smirnov__
  • 20. DECRYPT APPSTORE BINARYSTEP 2.5 - gdbcryptoff TARGET__TEXT0x00x0 0x54000__TEXT+cryptoff0x54000+8192__TEXT+cryptoff+cryptsize0x54000+8192+1974272@__smirnov__
  • 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. ЧТО ТЕПЕРЬ?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. ПОНИМАНИЕ ПРИДИ@__smirnov__
  • 24. I386Prologuepushl      %ebpmovl        %esp,%ebpsubl        $0x28,%espApplication Binary Interfaceсохраняем stack frameновый stack frameместо на стеке@__smirnov__
  • 25. EIP RELATIVE ADDRESSING0000183d calll      0x0000184200001842 popl        %ebx••• •••0000185c movl        0x00009d6a(%ebx),%eax0x9d6a + 0x1842 = 0xb5acoffset eip addressтрюк для получениязначения eipeax = *(0x9d6a+ebx)@__smirnov__
  • 26. OBJC_MSGSENDid objc_msgSend(id theReceiver, SEL theSelector, ...)80% вызовов@__smirnov__
  • 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. ВСЕ ЕЩЕ ВНИМАТЕЛЬНЫ ?@__smirnov__
  • 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. 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. ЗАКОНЧИМ ТЕМ ОТКУДА НАЧАТЬ• Отслеживание ввода данных• Места использования данных• Известные методы• Class-dump• Известные константы• Используемые библиотеки@__smirnov__
  • 32. @__smirnov__