ISG管理运维2017 Reverse Mobile 笔记(一)

20170831  时长3h

ISG赛前练习一:mobile

apkIDE打开,进入main activity,分析java代码

ISG管理运维2017 Reverse Mobile 笔记(一)_第1张图片
java

发现comparaTo比较后是0,相等是通过的条件

向上一行,str为MAGIC_STR的md5,再向上发现该值已被赋值


ISG管理运维2017 Reverse Mobile 笔记(一)_第2张图片
java

即flag为ISG{ISG2017xxxx}的md5

Reverse : login (暂无)

linux x64     工具ida和gdb


gdb简单命令

(gdb) file  文件名  加载被调试的可执行程序文件,在被调试程序所在目录下执行GDB,因而文本名不需要带路径

(gdb) r      run  简写  运行

(gdb) c     continue 简写  继续执行

(gdb) b    下断  有b 行号

b 函数名称

b *函数名称  符号表示将断点设置在”由编译器生成的prolog代码处“

b *代码地址

(gdb) d              删除指定编号的某个断点,或删除所有断点,断点编号从1开始递增

(gdb) s                “Step Into (单步步入)”

(gdb) n                “Step Over (单步步过)”------这两个命令必须在有源代码调试信息的情况下才可以使用(GCC编译时使用“-g”参数)

(gdb)  i                 Info的简写,用于显示各类信息,详情请查阅“help i”

(gdb) disas  0xXXXX       反汇编

(gdb) q                退出

汇编风格转换:(gdb)set disassembly-flavor intel

gdb查看内存:

x/ 是可选的参数,表示一个内存地址

1) n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容

2) f 表示显示的格式

3) u 表示将多少个字节作为一个值取出来,如果不指定的话,GDB默认是4个bytes,如果不指定的话,默认是4个bytes。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

参数 f 的可选值:

x 按十六进制格式显示变量。

d 按十进制格式显示变量。

u 按十六进制格式显示无符号整型。

o 按八进制格式显示变量。

t 按二进制格式显示变量。

a 按十六进制格式显示变量。

c 按字符格式显示变量。

f 按浮点数格式显示变量。

参数 u 可以用下面的字符来代替:

b 表示单字节

h 表示双字节

w 表示四字 节

g 表示八字节

举例:

(gdb) p record

$10 = {12, 76, 48, 62, 94, 17, 32, 37, 52,69}

(gdb) p &record

$11 = (int (*)[10]) 0x8049740

(gdb) x/4uw 0x8049740

0x8049740 :12764862

(gdb) x/6ow 0x8049740

0x8049740 :0140114060076

0x8049750 :0136021


Mobile : Ransonware

题目由两部分组成sample.apk与_target.jpg

使用apkIDE部分java提示error,这次使用jadx

找到main,发现对_target.jpg的操作

ISG管理运维2017 Reverse Mobile 笔记(一)_第3张图片
发现Aha encodeFile

java AES加密

ISG管理运维2017 Reverse Mobile 笔记(一)_第4张图片
main AES

class Aha()


ISG管理运维2017 Reverse Mobile 笔记(一)_第5张图片
Aha()

即mask与main 的"dajidalijinwanchiji~~~~~~" 异或,并作为AES加密的key

再次异或找到key

解密_target.jpg即可

具体解密脚本还未完成

你可能感兴趣的:(ISG管理运维2017 Reverse Mobile 笔记(一))