2020网鼎杯-青龙组-逆向

一.bang

题目描述:简单安卓脱壳
(安卓题跑到逆向里还有没有人管了_手动狗头.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。

1.修改脱壳app源码并编译安装

从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"};

2020网鼎杯-青龙组-逆向_第1张图片
编译参数设置:2020网鼎杯-青龙组-逆向_第2张图片
修改完成上述两项,编译出app安装
2020网鼎杯-青龙组-逆向_第3张图片

2.xposed框架激活脱壳app,脱出dex,JEB反编译得flag

xposed框架激活app后,打开how_debug,随便操作一会,在/data/data/packageName下产生dex文件
把dex文件都复制到电脑上,用JEB反编译(产生4个dex,我是在第四个找到onclick函数)
2020网鼎杯-青龙组-逆向_第4张图片
flag{borring_things}

三. jocker

工具:

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)
自修改代码,程序在执行某段代码的过程中会对程序的代码进行修改,只有在修改后的代码才是可汇编,可执行的。在程序未对该段代码进行修改之前,在静态分析状态下,均是不可读的字节码。

2020网鼎杯-青龙组-逆向_第5张图片
函数里也爆红,所以动调x64dbg启动。
现在是IDA和x64dbg同时打开这个文件,IDA看各函数的起始位置,x64dbg动调看结果,分析汇编得算法(算法通常简单 异或是真香_(:з」∠)_),前面已知输入是24位。
动态输入24个字符,单步步进,发现循环,就是在赋值输入,找到假flag的两函数,下断。
下段
接着往下走,中找到关键函数00401500(自解密函数)
2020网鼎杯-青龙组-逆向_第6张图片
输入和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

位数不够,下面还有函数,肯定有关系,接着往下跟,

2020网鼎杯-青龙组-逆向_第7张图片
又发现五个字符,下面的操作是左移位右移位,没出现数组,所以是和某固定数运算,推测异或。利用最后一个字符 ‘}’

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}

四. signal

题目提示:跟着信号一直走

工具:

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的模板简单了。
2020网鼎杯-青龙组-逆向_第8张图片
757515121f3d478

法二:

字符指示操作,字符数组已知,动调出最终结果,按照字符操作(这有点跟着信号走的意思),循环15次出flag。
最终字符
22h 3fh 34h 32h 72h 33h 18h a7h 31h f1h 28h 84h c1h 1eh 7ah
v4是结果数组char类型,一个字节,所以结果保留一个字节。
757515121f3d478

你可能感兴趣的:(我的CTF之路)