废除应用程序的ASLR特性

2019-12-05 06:11:43 来源: 盘锦信息港

ASLR (Address Space Layout Randomization),即地址空间随机布局。大部分主流的操作系统都已实现了ASLR,以防范对已知地址进行恶意攻击。iOS从4.3开始支持ASLR,Android从4.0也支持了ASLR机制。

ASLR的存在,给iOS系统越狱造成了很大的困难,某些不完美越狱方案就是因为攻破不了或者绕不开ASLR,所以每次重新启动后地址再度随机偏移,需要重新进行越狱操作。与此同时,ASLR也给应用层攻击带来了一些困难,不同进程会造成不同的地址空间偏移,而且在运行时才可确定其偏移量,不易锁定攻击地址。

Mach-O文件的文件头会记录二进制的属性标识,有个flag叫做PIE (Position Independent Enable)。开启了PIE的二进制文件,在执行时会产生ASLR。

我们可以使用otool工具,来查看任意应用程序二进制文件的属性,以支付宝为例:

otool-hvPortal

有PIE标识,表示该程序在启动时会产生随机地址布局。

removePIE是个去掉PIE flag的工具。

坏消息是,年久失修,它不支持iOS7。

好消息是,我们还有2个变通方法可以走。

利用Theos编译removePIE 改编一个Mac版的MyRemovePIE非越狱开发者可能不熟悉Theos,低学习成本的做法是第二种,那么让我们来改编一个Mac版的MyRemovePIE吧。

创建一个Command Line Tool工程,

然后复制下面代码到main.c中

#includestdio.h #includestdlib.h #includestring.h #includestdint.h #includemach-o/loader.h voidhexify(unsignedcharchar*data,uint32_tsize){ while(size--) printf(%02x,*data++);} voidfcopy(FILEFILE*f1,FILEFILE*f2){ charbuffer[BUFSIZ]; size_tn; while((n=fread(buffer,sizeof(char),sizeof(buffer),f1))0){ if(fwrite(buffer,sizeof(char),n,f2)!=n) printf(Errorcopyingbackup);} } intmain(intargc,charchar*argv[]){ structmach_headercurrentHeader; int32_tmagic=0; FILEFILE*fp;//editedfilepointer FILEFILE*fw;//backupfilepointer charfwName[80]; charfwPrefix[4]=.bak;//k if(argc1){ printf(Pleaseenterthefilenamebinary:intheformatremovePIEfilename); returnEXIT_FAILURE;} if((fp=fopen(argv[1],rb+))==NULL){ printf(Error,unabletoopenfilen); returnEXIT_FAILURE;} //kfilename strlcpy(fwName,argv[1],strlen(argv[1])+1); strlcat(fwName,fwPrefix,strlen(fwPrefix)+1); if((fw=fopen(fwName,wb))==NULL){ returnEXIT_FAILURE;} if((fread(magic,sizeof(int32_t),1,fp))==(int)NULL) {printf(Errorreadingmagicconstantinfilen); returnEXIT_FAILURE;} printf(magic:%x,magic); if(magic==0xbebafeca){//littleendian printf(loadingheadern); fseek(fp,0,SEEK_SET); if((fread(tHeader,sizeof(currentHeader),1,fp))==(int)NULL) { printf(ErrorreadingMACH-Oheader); returnEXIT_FAILURE; } fseek(fp,0,SEEK_SET);//setfpbackto0togetfullcopy printf(nbackingupapplicationbinary...n); fcopy(fp,fw); fclose(fw); printf(nbinarybackedupto:t%sn,fwName); printf(nmach_header:t); hexify((unsignedcharchar*)tHeader,sizeof(currentHeader)); printf(noriginalflags:t); hexify((unsignedcharchar*)ags,sizeof(ags)); printf(nDisablingASLR/PIE...n); ags=~MH_PIE; printf(newflags:t); hexify((unsignedcharchar*)ags,sizeof(ags)); fseek(fp,0,SEEK_SET); if((fwrite(tHeader,sizeof(char),28,fp))==(int)NULL) { printf(Errorwritingtoapplicationfile%sn,fwName); } printf(nASLRhasbeendisabledfor%sn,argv[1]); //exitandclosememory //free(mach_header); fclose(fp); returnEXIT_SUCCESS; } elseif(magic==MH_CIGAM)//bigendian { printf(fileisbig-endian,notaniOSbinary); returnEXIT_FAILURE; } else { printf(FileisnotaMACH_Obinary); returnEXIT_FAILURE; } //exit returnEXIT_FAILURE; }编译后生成可执行文件MyRemovePIE.

利用我们编译生成的MyRemovePIE来处理应用程序:

./MyRemovePIEPortal

这样以后支付宝Portal再被启动执行就不会具有ASLR特性了

如何验证一下结果呢?

把处理过的Portal二进制拷贝回iPhone,启动支付宝钱包应用,然后gdb该进程,利用info sh命令查看偏移:

偏移量为0,嗯,这下就好了。一些手动处理的过程可以升级为自动了~

情感日志
法甲
网游资讯
本文标签: