题目描述:简单安卓脱壳
(安卓题跑到逆向里还有没有人管了_手动狗头.jpg)
夜神模拟器(版本:6.6.0.5 Android5.1.1)
+
Android studio3.5.2
遇到两个问题的解决方法:
在Android Studio中下载Android SDK的两种方式(Android Studio3.0、windows)
导入新工程时,解决"Migrate Project to Gradle"的方法
+
Android5.1.1xposed框架
+
ApkShelling
+
JEB(或jadx)
宏观思路:
安卓脱壳,脱完壳得到dex文件,JEB打开dex,找关键函数onclick,得到flag。
从https://github.com/OakChen/ApkShelling上下载ApkShelling压缩包,解压得到文件夹。
Android Studio打开上面这个文件夹(Android Studio需提前安装好并且配置好,Android Studio一打开上面这个文件夹会自动编译,下载Gradle编译),
在XposedEntry.java中的targetPackages数组添加需要脱壳的包名
本题在50行
private static final String[] targetPackages =
new String[]{"com.example.how_debug", "com.sfysoft.shellingtest2"};
xposed框架激活app后,打开how_debug,随便操作一会,在/data/data/packageName下产生dex文件
把dex文件都复制到电脑上,用JEB反编译(产生4个dex,我是在第四个找到onclick函数)
flag{borring_things}
IDA+x64dbg
输入字符串,错误就闪退。
ida打开,f5不好使,发现有红色区域,但一开始查壳时无壳,所以想到其中有某种软件保护技术。
看汇编了解逻辑,Graph view模式下更好理清逻辑,发现两个关建函数。
call __Z5wrongPc ; wrong(char *)
lea eax, [ebp+var_96]
mov [esp], eax ; char *
call __Z3omgPc
根据两个函数写出脚本,得到假flag(意料之中)
temp=[0x66,0x6b,0x63,0x64,0x7f,0x61,0x67,
0x64,0x3b,0x56,0x6b,0x61,0x7b,0x26,
0x3b,0x50,0x63,0x5f,0x4d,0x5a,0x71,
0xc,0x37,0x66]
for i in range(24):
if i&1:
temp[i]+=i
else:
temp[i]^=i
print(''.join(map(chr,temp)))
# flag{fak3_alw35_sp_me!!}
要么地方没找对,要么是代码在变化,接着往下看,下面也有两个函数,而且有往回调循环的感觉,这里推测是smc。
SMC(self-Modifying Code)
自修改代码,程序在执行某段代码的过程中会对程序的代码进行修改,只有在修改后的代码才是可汇编,可执行的。在程序未对该段代码进行修改之前,在静态分析状态下,均是不可读的字节码。
函数里也爆红,所以动调x64dbg启动。
现在是IDA和x64dbg同时打开这个文件,IDA看各函数的起始位置,x64dbg动调看结果,分析汇编得算法(算法通常简单 异或是真香_(:з」∠)_),前面已知输入是24位。
动态输入24个字符,单步步进,发现循环,就是在赋值输入,找到假flag的两函数,下断。
接着往下走,中找到关键函数00401500(自解密函数)
输入和hahahaha_do_you_find_me?,结果和已知数组比较。
temp=[0x0E,0x0D,0x09,0x06,0x13,0x05,0x58,0x56,0x3E,0x06,0x0C,0x3C,0x1F,0x57,0x14,0x6B,0x57,0x59,0x0D]
temp1="hahahaha_do_you_find_me?"
flag=""
for i in range(19):
flag+=chr(temp[i]^ ord(temp1[i]))
print(flag)
#flag{d07abccf8a410c
位数不够,下面还有函数,肯定有关系,接着往下跟,
又发现五个字符,下面的操作是左移位右移位,没出现数组,所以是和某固定数运算,推测异或。利用最后一个字符 ‘}’
b='%tp&:'
c=[0 for i in range(5)]
for i in range(5):
c[i]=71^ord(b[i])
print(''.join(map(chr,c)))
#b37a}
flag{d07abccf8a410cb37a}
题目提示:跟着信号一直走
IDA+X64dbg
vm逆向,while+switch结构,不涉及栈的操作,所以相对简单(比虎符的强)。
CX-330师傅的angr(膜ing)
import angr
p = angr.Project('./signal.exe')
state = p.factory.entry_state()
sm = p.factory.simulation_manager(state)
def good(state):
return b"good" in state.posix.dumps(1)
def bad(state):
return b"what" in state.posix.dumps(1)
sm.explore(find = good, avoid = bad)
if sm.found:
find_state = sm.found[0]
flag = find_state.posix.dumps(0)
print(flag)
脚本没出现地址,只是有失败和成功字符,angr的模板简单了。
757515121f3d478
字符指示操作,字符数组已知,动调出最终结果,按照字符操作(这有点跟着信号走的意思),循环15次出flag。
最终字符
22h 3fh 34h 32h 72h 33h 18h a7h 31h f1h 28h 84h c1h 1eh 7ah
v4是结果数组char类型,一个字节,所以结果保留一个字节。
757515121f3d478