首页
社区
课程
招聘
[原创]IPAD 破文一篇
发表于: 2011-8-14 00:20 30640

[原创]IPAD 破文一篇

2011-8-14 00:20
30640
前言:
        一个偶然的机会,得到一台IPAD2,若只当个娱乐玩具,还是挺很不错的。在苹果封闭的体系保护中,不去苹果那儿注册,安装自己开发软件是相当的困难,尤其在没有MAC笔记本的情况下,安装IPAD的开发环境相当艰苦,我到现在还没安装成功过(要是你成功安装过,欢迎教我一下),呵呵。前不久,jailbreakme利用PDF漏洞实现了越狱,可以安装各种软件和开发工具了,哈哈,可以在没有XCode开发环境下,从另一个方面深入地了解一下其内部系统了。
        言归正传,在APP中找了款免费的SSH软件,体验了一下,整体感觉还是不错的,只是使用时会有150次按键的限制,有点不爽,这便激发我来解决这一点。特别说明,本文仅以学习研究为目的。

准备:
一台越狱后的IPAD2,GCC编译工具,GDB调试工具,Open SSH服务,当然还有我们的目标软件zaTelnet。
一台电脑,装有Putty系列工具,IDA6.1工具。
保证电脑和IPAD的网络畅通。

分析:
以zaTelnet3.0.6为例

通过SSH连接在IPAD找到zaTelnet所在目录
/private/var/mobile/Applications/DFFD7B8E-D0F6-422C-86C3-5F27FDE8FA1A
将主程序zaTelnet拉下来看看


一地鸡毛,像加了壳似的。静态分析是没法做了,只能通过动态调试的来看看。

上GDB工具,使用ATTACH命令,进入ZaTelnet进程的领空。

再使用info sharedlibrary命令,查看加载的模块信息

发现进程占用的空间 为 0x1000 ~ 0x5b000
再使用dump zaTelnetPatch_dump 0x1000 0x5b000命令,将内存DUMP到zaTelnetPatch_dump文件中。
再上IDA来分析下zaTelnetPatch_dump文件。


貌似是解过密的原始代码了。
通过提示特征信息,快速定位。



相关的处理
__text:00032CB8                 PUSH            {R4-R7,LR}
__text:00032CBA                 ADD             R7, SP, #0xC
__text:00032CBC                 PUSH.W          {R8,R10,R11}
__text:00032CC0                 VPUSH           {D8-D15}
__text:00032CC4                 SUB             SP, SP, #0x74
__text:00032CC6                 LDR.W           R3, =(off_44154 - 0x32CD2)
__text:00032CCA                 STR             R0, [SP,#0x28]
__text:00032CCC                 ADD             R0, SP, #0x40
__text:00032CCE                 ADD             R3, PC
__text:00032CD0                 STR             R2, [SP,#0x24]
__text:00032CD2                 LDR             R3, [R3]
__text:00032CD4                 STR             R7, [SP,#0x60]
__text:00032CD6                 STR.W           SP, [SP,#0x68]
__text:00032CDA                 STR             R3, [SP,#0x58]
__text:00032CDC                 LDR.W           R3, =(unk_42C94 - 0x32CE4)
__text:00032CE0                 ADD             R3, PC
__text:00032CE2                 STR             R3, [SP,#0x5C]
__text:00032CE4                 LDR.W           R3, =(loc_32F02 - 0x32CEC)
__text:00032CE8                 ADD             R3, PC
__text:00032CEA                 ORR.W           R3, R3, #1
__text:00032CEE                 STR             R3, [SP,#0x64]
__text:00032CF0                 BLX             sub_43F80
__text:00032CF4                 LDR.W           R0, =(unk_4DE58 - 0x32D04)
__text:00032CF8                 LDR.W           R1, =(off_4DDF0 - 0x32D06)
__text:00032CFC                 MOV.W           R2, #0xFFFFFFFF
__text:00032D00                 ADD             R0, PC
__text:00032D02                 ADD             R1, PC
__text:00032D04                 LDR             R0, [R0]
__text:00032D06                 LDR             R1, [R1]
__text:00032D08                 STR             R2, [SP,#0x44]
__text:00032D0A                 BLX             sub_43FE4
__text:00032D0E                 TST.W           R0, #0xFF
__text:00032D12                 BEQ.W           loc_32E7E
__text:00032D16                 LDR.W           R2, =(unk_4CB98 - 0x32D22)
__text:00032D1A                 LDR             R3, [SP,#0x28]
__text:00032D1C                 LDR             R4, [SP,#0x28]
__text:00032D1E                 ADD             R2, PC
__text:00032D20                 LDR             R1, [R2]
__text:00032D22                 STR             R3, [SP,#0x2C]
__text:00032D24                 LDR             R3, [R3,R1]
__text:00032D26                 SUBS            R3, #1       按一次计数器减1
__text:00032D28                 STR             R3, [R4,R1]
__text:00032D2A                 LDR             R3, [R2]
__text:00032D2C                 LDR             R3, [R4,R3]
__text:00032D2E                 CMP             R3, #0
在GDB中,使用 00032D26命令,内存修改代码
(gdb) set {unsigned char} 0x00032D26 = 0x00
(gdb) x/i 0x00032D26
0x32d26:        subs    r3, #0
(gdb)
继续运行程序
(gdb) c
Continuing.
见证奇迹的时刻到了。你就会发现,按任何一个按键之后,右上角的计数不再减少了。至此完成的破解。当然实际使用时,总不能架一个GDB吧,总需要自动Patch吧。

补丁:
    进程执行时会检查 /Library/MobileSubstrate/DynamicLibraries/ 目录中 扩展名plist的文件中的描述来决定是否动态同名的扩展名为dylib的文件。用这个方法就可以实现在zaTelnet执行自动加载我们的Patch动态库。
附上Patch内存的核心代码,大部分都是从网上抄来的,呵呵。

static void patch_mem(void *p, unsigned char data)
{
    int page = getpagesize();
    uintptr_t address = (uintptr_t)(p);
    uintptr_t base = address / page * page;
    mach_port_t self = mach_task_self();
    kern_return_t error;

    if ((page - (uintptr_t)(p) - base) < 12)
        page *= 2;
        
    if (error = vm_protect(self, base, page, FALSE, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_COPY))
    {
        // fprintf(stderr, "vm_protect():%d\n", error);
        return;
    }
    *(unsigned char*) p = data;
    // __clear_cache((char *)(p), (char *)(p + 1));

    if (error = vm_protect(self, base, page, FALSE, VM_PROT_READ | VM_PROT_EXECUTE))
    {
        // fprintf(stderr, "vm_protect():%d\n", error);
        return;
    }
}

static mach_msg_type_number_t read_mem(void *p, char *data, mach_msg_type_number_t size)
{
    int page = getpagesize();
    vm_address_t address = (vm_address_t)(p);
    mach_port_t self = mach_task_self();
    pointer_t buf;
    kern_return_t error;

    if (error = vm_read(self, address, size, &buf, &size))
    {   
        //fprintf(stderr, "vm_read():%d\n", error);
        return 0;
    }
    memcpy(data, (void*)buf, (int)size);
    return size;
}

int _X_HIDDEN patcher_(unsigned char* pFun, unsigned char* pIns)
{
    unsigned char *p;
    char buf[16];
    p = pFun;
    if (read_mem(p, buf, sizeof(buf)) == sizeof(buf))
    {
        if (0 == memcmp(buf, "\xF0\xB5\x03\xAF\x2D\xE9\x00\x0D\x2D\xED\x10\x8B", 12))
        {
            p = pIns;
            if (p[0] == '\x01' && p[1] == '\x3b')
            {
                // 修改内存属性
                // p[0] = '\0';  
                patch_mem(p, '\0'); // 停止减少按键计数
                return 1;
            }
        }
    }
    return 0;
}

最后:
    就不贴执行文件了,重点是分析过程,初次接触苹果系统,水平有限,不足之处,欢迎各位指教。

最后来一张效果图


[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (59)
雪    币: 9
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我靠,国内是有牛人啊,就为什么没有然研究一下ios的越狱和解锁呢,一到这时候只能期待国外的几个组织。。。为什么呢
2011-8-14 00:47
0
雪    币: 9
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看雪果然什么人都有,能不能研究一下iphone的基带。。。能成功的话送一套苹果的设备。iphone,ipad,macbook pro
2011-8-14 00:48
0
雪    币: 1912
活跃值: (896)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
4
呵呵,收藏了
2011-8-14 02:19
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好厉害,支持!!
2011-8-14 05:32
0
雪    币: 437
活跃值: (110)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
我也很喜欢苹果系统
2011-8-14 06:46
0
雪    币: 384
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
临时用户好牛X
2011-8-14 10:40
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
GHDFGHFG
2011-8-14 11:46
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
牛人就是多啊,看看先
2011-8-14 12:16
0
雪    币: 51
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
如果我没猜错的话,这次机会就是某公司举行比赛的那次机会。

这个是破解后的文件,下载后扩展名改为ipa,用91助手安装好就能用。 zaTelnet-v3.0.6-H_cracked.zip
上传的附件:
2011-8-14 13:21
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看上去也是*nix系列系统?
2011-8-14 13:56
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
先留个记号。。。
2011-8-14 14:34
0
雪    币: 47
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我知道苹果是BSD和linux的结合产品
在这里居然看到windows以外的东西  挺新奇的
支持原创,支持作者,加油哦
2011-8-14 15:00
0
雪    币: 166
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
我勒个去去,好强大
2011-8-14 16:44
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我的ipad给我拿来当游戏机了……
2011-8-14 20:40
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
果真如此的话 楼主肯定属于牛人了
2011-8-14 23:48
0
雪    币: 87
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
支持。。好文章
2011-8-14 23:59
0
雪    币: 1683
活跃值: (674)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
支持~~
2011-8-15 06:18
0
雪    币: 822
活跃值: (380)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
19
学习了,顶一个
2011-8-15 11:10
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
20
如何架设环境、多个系统怎么联系等等都不知道
安卓、IPAD新鲜玩意,我落伍了
2011-8-15 14:19
0
雪    币: 230
活跃值: (149)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
呵呵,不错。很有新鲜感啊~~一直打算越了家里的iPad2......
2011-8-15 14:50
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
真是太牛了!!!中国就是人才特多~~
IPAD我也只是纯粹当游戏机玩的,哎。。。
2011-8-15 16:06
0
雪    币: 131
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
牛人多啊,我也是临时用户,为什么跟别人差这么多,先看看学习学习
2011-8-15 16:23
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
装的arm交叉编译工具链吧,还有gdb支持arm程序的调试么?估计楼主也是linux上的高手吧?
2011-8-15 18:16
0
雪    币: 7
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
楼主真n,ida真强大。
2011-8-15 21:39
0
游客
登录 | 注册 方可回帖
返回
//