裸体 [原创]细品sec2023安卓赛题-Android安全-看雪-安全社区|安全招聘|kanxue.com

发布日期:2024-11-04 07:59    点击次数:118

裸体 [原创]细品sec2023安卓赛题-Android安全-看雪-安全社区|安全招聘|kanxue.com

在本年三月份的时候,我参加了腾讯游戏安全时期竞赛,到目下差未几快昔日半年了,那时作念这说念安卓预赛题目时裸体,亦然卡在开头就毫无条理了,此后看到看雪上的三位大佬|_|sher师父,juice4fun师父和fallw1nd师父都共享了他们作念这说念题目时的解题经由,亦然让我重拾了作念出这说念安卓预赛题的信心,因为需要分神在学习和其他事情上,是以从三月份到七月份亦然陆不绝续复现了五个月,一齐上走走停停

终于在八月份,我难能宝贵的取得了整整一个月的充裕时辰,这也让我不错好好去钻研这说念对我来说难度极大的安卓题目了,解题的经由中基本上把我能猜想的安卓逆向器具用了个遍,每当我在解题的经由中遭受瓶颈时,我总会把这三位大佬的writeup掀开来反复不雅摩接洽念念考为什么要这么作念,若何作念后果会更好

直到注册机写完之后纵不雅通盘解题经由,简直是学到了许多

il2CppDumper是分析unity游戏的基础,能有好的开头全靠站在巨东说念主的肩膀上

运行时解密so文献,让我初次尝试去手工诱骗dump下来的so

libsec2023.so中的反调试让我学会使用在安卓手机中断下硬件断点的器具rwProcMem33,也脱手第一次编译安卓内核,阅历了两三个不眠之夜

第一目击到CSEL-BR和CSET-BR结构的花指示让我毫无条理,也让我脱手念念考frida-stalker与unicorn的区别所在,最终我选拔使用frida-stalker扶植分析,IDApython批量去花的步调,后果很好

BlackObfuscator污染让我想起了被ollvm的结果流平坦化垄断的懦弱,一筹莫展之际,这个月最新的器具Jeb5.1居然能好意思满去除BlackObfuscator污染,委果让我惊喜不已

在探索vm的经由,我也迟缓的摸索出了vm题型的解题步调,有时改日遭受vm我也能洋洋洒洒了

绪论写的有点长了,也算是我在这半年关于这说念安卓题的感悟吧哈哈,固然是安卓方位预赛题,然而对我通盘安卓逆向的学习经由意旨卓绝,这篇著述我也写的尽可能的翔实,前后的念念维也尽量幸免跨越,每一步的操作基本上都是有据可依的,为之后也一样想要复现这说念题筹算一又友尽极少菲薄之力

题目不错在腾讯游戏安全竞赛官网下载 下载连系

看雪这里也上传了一份到附件里了

我在github内部也存了一份上去 下载连系

最初咱们通过jadx反编译mouse_pre.aligned.signed.apk,通过检验AndroidManifest.xml不错知说念下列缺点信息

解压该apk,通过检验lib文献夹内的内容,咱们发现了libil2cpp.so

image-20230407124030376

咱们使用Il2CppDumper尝试解密global-metadata.dat,然而却失败了

image-20230407124010267

看了一下global-metadata.dat是莫得加密的

image-20230407160715829

接下来咱们用ida反编译libil2cpp.so,发现被加密了

image-20230407142822706

接下来我准备用frida来把解密后的libil2cpp.so从内存中dump下来

然而当我用frida将代码注入进去后,apk辅导hack detect,然后就退出了

之后我毋庸frida注入这个apk,然而后台依旧运行着frida-server,apk依然弹出hack detect后退出

通过这极少我大要不错判断它的检测样子有这两种可能

咱们一个一个去考据一下

最初咱们把后台运行的frida-server称呼改成fs试试

修改完后依旧弹出hack detect

那咱们再去试一试修改frida-server的端口

端口修改之后用frida注入也不弹窗了

目下咱们不错用frida把解密后的libil2cpp.sodump下来,剧本如下

在使用frida运行剧本之前需要小心去作念一下端口转发

随后进行frida注入

image-20230407160451904

径直把dump下来的libil2cpp.so放到Il2CppDumper中,告捷获取秀丽

image-20230407230411862

关于dump下来的so文献,总共的段(segment)和节(section)的偏移都是在编造空间中的偏移(即映射到进度空间的编造地址偏移),但静态分析器具分析so时所使用的偏移仍然为在实质文献中的偏移(即联系于文献开头的字节偏移量),装假的偏移导致静态分析器具如IDA等无法分析dump下来的so

是以咱们需要将segment和section在实质文献中的偏移替换为在编造空间中的偏移,这些偏移由program header table和secion header table内的成员指出

咱们将libil2cpp.so和libil2cpp.so_0x712a997000_0x13cc000.so一并拖入010 editor中,两个文献互相对比进行诱骗

在010editor中复制一个成员的值到另一个成员中,只需要在软件界面的Template Results中单击想要复制的值按下Ctrl+Shift+C,然后单击需要替换的值,按下Ctrl+Shift+V即可完成替换

段(segment) 的位置和大小由轨范头表(Program Header Table)中的这四个成员决定

在libil2cpp.so_0x712a997000_0x13cc000.so中咱们将program_header_table中每一个element的p_vaddr_VIRTUAL_ADDRESS的值复制到p_offset_FROM_FILE_BEGIN,p_memsz_SEGMENT_RAM_LENGTH的值复制到p_filesz_SEGMENT_FILE_LENGTH

节头表(secion header table)的位置在终末一个段(segment)之后,咱们不错从ELF文献的Execution View直不雅看出图片形容

由下图所示,libil2cpp.so_0x712a997000_0x13cc000.so中section_header_table在实质文献中的偏移为0x11AB778,咱们需要将其修改为在编造空间中的偏移,这个值为0x13CB778,计较经由如下,此场所触及计较的成员的值是在program_header_table的终末一个element,即program_table_entry64_program_table_element[10]

Section Header Table和Program Header Table并不是一定要位于文献开头和收尾的,其位置由ELF Header指出

决定section_header_table肇始地址的成员为elf_header->e_shoff_SECTION_HEADER_OFFSET_IN_FILE,位置如下图所示,在修改完成后,按下F5重新运行模板ELF.bt图片形容

在咱们修正 节头表(secion header table) 的偏移后,节头表所在的区域是莫得内容的,如下图所示,是以需要从libil2cpp.so中复制节(section)的内容到dump下来的so中图片形容

咱们在libil2cpp.so点击struct section_header_table并按下Ctrl+Shift+C,然后回到libil2cpp.so_0x712a997000_0x13cc000.so中,选中section_header_table然后按下Ctrl+Shift+V,按下F5重新运行模板ELF.bt图片形容

不错发现修补了节(section)的内容之后,section的称呼依旧是乱码

这是什么原因呢?

ELF文献中的每个section都是著名字的,比如.data、.text、.rodata,每个名字都是一个字符串,既然是字符串就需要一个字符串池来保存,而这个字符串池亦然一个section,或者说准备一个section用来珍惜一个字符串池,这个字符串池保存了其他section以及它我方的名字。这个颠倒的section叫作念.shstrtab,总共section的头部是连气儿存放在一说念的,雷合并个数组,e_shstrndx变量是.shstrtab在这个数组中的下标。

最初咱们要明白section的称呼是如何通过索引找到的,在libil2cpp.so_0x712a997000_0x13cc000.so中,找到elf_header->e_shtrndx_STRING_TABLE_INDEX,这个的值为26(0x1A),泄漏了section_header_table->section_table_element[26]存储了总共section的称呼图片形容section_header_table->section_table_element[26]中s_offset的值决定了section的称呼将从1199370h去索引

图片形容

咱们不错在dump前后的libil2cpp.so都跳转到这个地址去望望,在010editor中进行地址跳转只需右键该值选拔Goto Address即可图片形容section的所著称呼都在这个地方图片形容之后咱们要将section的符堪称呼从底本的so复制到dump下来的so内部,位置即是咱们之前分析出来的section_table_element[26]中s_offset所指向的物理内存地址,即选中libil2cpp.so从0x1199370h到0x1199470h按下Ctrl+Shift+C,然后将光标转移到libil2cpp.so_0x712a997000_0x13cc000.so的119A370h处,按下Ctrl+Shift+V

节(section) 的位置和大小由节头表(secion_header_table)中这两个成员决定

修正 节(section) 的偏移有两条章程

修正完成后,按下F5重新运行模板ELF.bt,不错发现section的称呼一经还原,同期也有了dynamic_symbol_table

图片形容

然后,咱们将libil2cpp.so_0x712a997000_0x13cc000.so拖入IDA中进行分析,待分析完成后,点击如图所示的选项重新定位基址为0x712a997000,这么不错分析出更多的秀丽

image-20230505144017295

之后,咱们点击File->Script file...运行il2cppdumper中的ida_with_struct_py3.py,需要小心的这个剧本需要运行两次,第一次选拔script.json,第二次选拔il2cpp.h

惩处之后的后果如下

image-20230506180743547

接下来需要知说念这个OK按钮调用的函数

screenshot

咱们不错使用这个器具frida-il2cppDumper,用法就径直用frida注入_agent.js就不错了

当咱们参加该apk之后,下列函数被调用

咱们去看一下终末调用的这个函数oO0oOo0,参加IDA去进行分析,很显然是生成TOKEN的地方

image-20230506185306047

当咱们点击小键盘上的OK按钮后,下列函数被调用,由于调用的函数太多,我这里只是从初次调用的函数脱手,截取了部分输出四肢示例

SmallKeyboard类被调用了许屡次,咱们不错去dump.cs内部搜索一下,此处界说了KeyType不同的值对应的含义,那么这个EnterKey即是OK按钮了

image-20230507183715015

回到IDA,咱们再去搜索一下SmallKeyboard,找到SmallKeyboard__iI1Ii(SmallKeyboard_o *this, SmallKeyboard_iII1i_o *info, const MethodInfo *method)这个函数,这是与KeyType关联的函数,不言而喻,咱们需要重心分析的是KeyType == 2的情况

image-20230808172326007

关于这行代码,我的算计是v13存储了我输入的值,咱们不错使用frida去hookSystem_Convert__ToUInt64_486054767044的复返值来考据咱们的猜想

image-20230808172408181

当我输入123456,并点击OK按钮后,frida的回显如下,不错印证咱们的算计是正确的,v13是咱们输入的数字

image-20230507190652325

v13四肢参数传入了SmallKeyboard__iI1Ii_486050613936内,那么这应该即是咱们要寻找的加密逻辑

经过两个B跳转后,咱们来到了这里

image-20230809155725055

这段汇编很专诚念念,咱们去分析一下,off_712BD51FF0存储的是导入函数g_sec2023_p_array的地址,而g_sec2023_p_array的函数界说在libsec2023.so中,BR指示是无条目寄存器跳转,那么这四行arm汇编的意旨即是调用g_sec2023_p_array偏移0x48处的函数

来到libsec2023.so咱们即可找到相对应的导出函数sub_31164

image-20230809160214205

那么不言而喻,缺点的逻辑就在libsec2023.so中的sub_31164了

对libsec2023.so的sub_31164hook一下

然而当我注入将这段frida代码注入到libsec2023.so后,轨范在瞬息的蔓延后解析hack detect后退出了

咱们不错使用frida Stalker来检验这个so调用函数的经由

为了使用上的浅近,我写了一个IDA插件来杀青底下的经由,插件地址:https://github.com/oacia/stalker_trace_so,这应该算是我第一次造轮子吧:)

最初使用如下idaPython剧本打印出libsec2023.so的总共函数的地址和称呼

将上头IDApython所打印出的内容填入底下frida代码的变量func_addr和func_name中

掀开apk后frida输出如下

这里需要用到的器具是rwprocmem33,具体的编译和使用不错在我写的另一篇著述进行阅读,这里不在过多赘述

运行底下的frida代码获取libsec2023.so的基址

image-20230817132059046

运用底下的高唱获取进度的PID

将得到的参数填入rwprocmem33中

最初对咱们最感意思的libil2cpp.so调用的libsec2023.so的导出函数sub_35404下硬件断点望望,毕竟之前咱们用frida去hook这个函数失败了嘛,硬件断点下的位置不错通过基址(base)+偏移(func offset)得到

结果如下

image-20230817132705290

只是下了五秒的硬件断点,相易地址的射中次数参加达到了百万次

咱们再对不同的地址打下硬件断点望望,发现均唯有一个射中地址,况兼射中次数都达到百万次

与基址相减得到偏移为0x37704

image-20230817133029502

参加ida检验sub_37704函数,代码很短,按下交叉援用也莫得输出

image-20230817025119017

这该若何办呢?

还铭刻上头咱们曾用frida-stalker打印出了libsec2023.so函数的调用链嘛,咱们从sub_37704朝上回溯望望

sub_37704是被sub_376CC调用的,sub_376CC中的这个BR跳转应该是调用了sub_37704

image-20230817030756246

再看调用sub_376CC的函数sub_371AC,在这个函数中,咱们发现了一条风趣的指示,CSEL

image-20230817133504656

熟习arm指示集的一又友敬佩知说念,CSEL是arm中的分支结构指示,而BR跳转的位置由X8决定,是以这段汇编便不错改变便轨范结果流

CSEL X8, X8, X9, EQ中,EQ暗示Equal,即止境条目,其值由最近的CMP的比拟后得出的值决定,举例斯处判断的条目即是CMP W0, W8

用c话语来暗示即是

而X8和X9收支0x10,X8的修改便导致了结果流的改变

为了不让结果流转向装假的分支导致frida注入后强制退出,咱们不错对此处的汇编进行patch,将CSEL X8, X8, X9, EQ改为CSEL X8, X8, X8, EQ,行将汇编08 01 89 9A修改为08 01 88 9A

image-20230817154739431

然而要若何让apk运行咱们patch事后的libsec2023.so呢?

有以下的三种念念路不错参考

前两种步调经过尝试均以失败告终,那么目下只剩下终末一种步调了,即是在libsec2023.so加载之后动态patch,而这运用frida不错说几乎即是不费吹灰之力,运用Memory.writeByteArray就不错作念到

运行rpc.exports.anti_sec2023()的时机是在掀开apk之后

之后再次尝试对sub_31164附加钩子

这一次,钩子告捷附加上去了!

image-20230817170036802

sub_31164最初调用了sub_3B8CC,那咱们就就去分析一下sub_3B8CC

image-20230818141550105

往下看终末一滑汇编是是BR X8,咱们望望BR暗示的意思是什么

BR: 跳转到某寄存器(的值)指向的地址(无复返), 不会改变 lr (x30) 寄存器的值。

寄存器跳转的存在严重的阻挡了咱们的逆向分析,那咱们试试能不可略微修改一下

咱们不错使用frida-stalker来跟踪寄存器的值(都备不是因为我用不来unicorn才用frida的(简直)

滥觞我是径直准备patch内存中的指示的,代码也写的差未几了(目下被审视了),没猜想这寄存器跳转会有两种情况,没主义改成B跳转,否则进度会崩溃掉,是以就打印出跳转的地址手工分析咯

运行代码后,轨范输出如下

咱们不妨以地址0x3ba70四肢分析的示例,这里咱们发现0x3ba70会跳转的地址有两种情况,鉴识是0x3ba34和0x3ba74

等等,0x3ba74??这不即是0x3ba70之后要扩充的指示吗?

那结果不言而喻了,这BR寄存器跳转的前身敬佩即是条目跳转,BGE,BLE这类的指示

接下来即是在IDA内部诱骗结果流咯,咱们诱骗一下0x3ba00这个第一个BR跳转的地方,别的地方的念念想都是一样的

image-20230819014827349

参加到off_72C40,加上W11得到正确的跳转,写了个疏忽的python剧本输出hex浅近径直复制进去

这个地方诱骗完是这么的,不错看到*(off_72C40+0)和*(off_72C40+0x28)的地方值一经被我加上去了

image-20230819020109133

接下来即是改是汇编了,ADD指示咱们敬佩是不需要了,因为一经被咱们加上去了,是以接下来不绝往下走看的是这条CSEL X10, XZR, X9, CC指示

image-20230819020355254

各个条目码的含义如下

那么这里BR分支跳转的意思就不错暗示为

是以这里改成BGE,然后把不需要的指示NOP掉,一处地方就诱骗好啦

image-20230819022733118

还要小心的是,除了CSEL-BR结构以外,还有CSET-BR结构

image-20230825005445886

CSET: 比拟指示,幽闲条目,则并置 1,否则置 0 ,如:

和CSEL-BR结构的诱骗念念路是相似的,关于上图(0x3B95C处)的CSET-BR结构,咱们仅需存眷这几行指示

其中的LDR X8, [X21,W23,UXTW#3]的含义不错用C话语这么暗示X8 = *(X21 + (W23 << 3)),UXTW#3行将操作数左移三位的意思

这么一个一个诱骗昔日,难免也太坚苦了,那索性就写个idapython剧本一键去除CSEL-BR和CSET-BR结构来目田双手吧哈哈

第一个加密函数sub_3B9D4取出数据的每一位进行加密,其中出现的HIBYTE , BYTE2, BYTE1,LOBYTE 含义如下,假定稀有据a1=0x12345678,则

咱们不错使用frida去hooksub_3B9D4传入的值以及复返值,不雅察加密前后的变化,假定我此处在小键盘输入的数字是999999999999,hex(999999999999)=0xe8d4a50fff

image-20230829154207172

于是第一个算法如下

色拍拍欧美视频在线看

在对输入的值进行首轮加密之后,又再次对输入值经过bswap32函数加密

image-20230829160716908

这个函数对应的arm汇编为

那咱们去arm手册望望REV指示的界说好了

REV

Byte-Reverse Word reverses the byte order in a 32-bit register.

Operation

看Operation很明晰的知说念这即是回转字节,比如

是以此处bswap32(v6),是对v6进行字节翻转,而v6 = HIDWORD(a1),故在进行第一个加密函数sub_3B9D4之后,将最初对输入的高32位进行加密惩处,这在咱们后续hook第二个加密函数sub_3A924之后,也不错体现出来这极少

咱们最初hook一下sub_3A924让前后分析的逻辑连贯起来

在经过第一轮加密后,咱们得到了密文cc ca 94 6d e3 d5 39 39,而在此处,第一次调用sub_3A924的输入为6d 94 ca cc,第二次调用sub_3A924的输入为39 39 d5 e3,恰巧对应了上文提到的翻转字节惩处

image-20230830024642669

咱们参加该函数后,发现如v11+1408LL,v11 + 1664LL等等的fastcall函数调用,一般这种体式的函数调用在安卓逆向中遭受的话,那简略率即是JNIEnv *

image-20230829154859854

在此题中,咱们只需要对v11按下Y切换类型,然后输入JNIEnv *,就会更动成JNIEnv *的结构体函数指针如图

image-20230830000329982

在这里出现了jni函数GetStaticMethodID,咱们hook一下这个函数不雅察调用了什么步调

在输出中,咱们发现GetStaticMethodID调用了名为encrypt的步调

image-20230830000805212

然而咱们在apk中却并未发现该步调

image-20230830000915933

那么由此就不错推断出这个步调是由dex动态加载的

咱们不错使用frida-dexdump来把内存中的dex给dump下来,要小心frida的端口一经被咱们修改为了1234,是以这里也要加上-H参数

image-20230830001101633

将总共dex dump下来之后,接下来的要津即是把这些dex一个一个拖进jadx内部反编译,去望望哪一个dex包含encrypt步调

image-20230830001653193

这个结果流一眼看上去即是加了污染的,据FallW1nd师父说是BlackObfuscator污染,本来准备去手工分析的,然而想起前几天刚下载了Jeb5.1,就想望望新器具的后果若何

当我用Jeb5.1反编译这个dex之后,这BlackObfuscator污染若何就径直去除了????

好家伙这Jeb5.1居然能自动去除结果流平坦化,crazy!

image-20230830022051922

那么这第二个加密的逻辑相配的清醒,算法如下

image-20230830033519965

咱们不错hook一下等二次加密前后输入的变化

image-20230830064031273

咱们在sub_31164中去hook终末的br x2跳转来不雅察之后跳转到了哪一个函数中

image-20230830065454042

可见在libsec2023.so中经过两次加密之后,apk回到了libil2cpp.so中

image-20230830065541513

偏移0x138d64加上底本so的基址后,定位到了这个地方

image-20230830070108643

B跳转昔日发现并不是一个函数,而是FUNCTION CHUNK

image-20230830070631442

那先修改一下.init_proc的End address

image-20230830070942449

然后回到之前chunk function的位置,按下P让IDA分析出函数,就不错看伪代码不绝分析了

这个类的称呼被o,O,0给污染了,导致难以分辨类和变量,是以需要为这些类和变量进行重定名

image-20230830091801333

在望望其他函数,这终末的v6 + v8 + (v6 | ~v8) + (v8 ^ v6) - (v6 & ~v8) + 1看起来是MBA抒发式

image-20230830091847819

在github找个器具GAMBA简化一下,有些抒发式要分开简化后果才好,这里4294967296=0x100000000一经溢出32位了,是以4294967296+v8=v8

image-20230830101119023

重定名函数之后,很显然发现这个加密算法应该和VM指示研究

image-20230830102759333

咱们回到类的驱动化函数ctor完成之后,下一个要调用的函数OO0OoOOo_Oo0__oOOoO0o0

image-20230830105402607

参加该函数,又是经典的while(1)轮回,那么在这个轮回内部,必定会出现eip和opcode,这两个鉴识对应着this->fields.oOOO0Oo0和U16_arr,咱们重定名之

image-20230830105501678

之后,咱们以add函数为例分析其他全局变量的含义,这里对应的vm指示应该为add uS_arr[bbb], uS_arr[bbb], uS_arr[bbb+1]

image-20230830102726283

到这里可能会有东说念主纠结uS_arr究竟代表寄存器照旧代表栈呢?咱们回到驱动化函数中,发现变量bbb所赋的初值为-1,那么由此不错笃定,uS_arr代表的是栈,而bbb则暗示esp

image-20230830110257781

至此为止,vm所需的缺点变量咱们均一经分析明晰了

image-20230830110454534

接下来就不错分析vm编造机了,关于vm类题型,咱们只需要找到vm指示中的加减乘除位运算的位置和输入输出是若干就够了,别的指示比如push,pop,mov,opcode是若干,opcode是如何被vm读取等等这些问题都不需要筹商,因为在vm中,总共的vm指示的最终筹算都是为了对输入的值进行操作,咱们知说念了这些加密运算,那么逆运算当然是信手拈来

是以在这里,咱们不错用frida去hook一下运算研究的指示

输出以及分析如下

由此可见,这个vm其实相配的疏忽

这个算法一看就知说念是xtea,那么需要知说念的就唯有v24这个密钥了

image-20230831064228955

用frida把密钥hook下来

image-20230831065121629

再把xtea加密之后的值也趁便hook下来

image-20230831070953192

那么这部分的算法如下

至此为止,总共加密算法分析罢了

在总共的加密完成后,这里的result即是咱们的token,加密的低32位和token比拟,高32位和0比拟

image-20230831072058487

ELF文献神气的详解

[原创]2023腾讯游戏安全竞赛预赛题解(安卓)

[原创]2023腾讯游戏安全大赛-安卓赛说念预赛wp

[原创] 腾讯游戏安全时期竞赛2023 安卓客户端预赛WriteUp

ARMv8(aarch64)指示集特色

[培训]内核驱动高等班裸体,冲击BAT一流互联网大厂职责,每周日13:00-18:00直播讲课

上传的附件: 安卓客户端安全-预赛题目_2.zip.001 (8.00MB,31次下载) 安卓客户端安全-预赛题目_2.zip.002 (8.00MB,26次下载) 安卓客户端安全-预赛题目_2.zip.003 (8.00MB,23次下载) 安卓客户端安全-预赛题目_2.zip.004 (372.64kb,23次下载)