20170831 时长3h
ISG赛前练习一:mobile
apkIDE打开,进入main activity,分析java代码

发现comparaTo比较后是0,相等是通过的条件
向上一行,str为MAGIC_STR的md5,再向上发现该值已被赋值

即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/ <n、f、u> <addr>是可选的参数,表示一个内存地址
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 <record>:12764862
(gdb) x/6ow 0x8049740
0x8049740 <record>:0140114060076
0x8049750 <record+16>:0136021
Mobile : Ransonware
题目由两部分组成sample.apk与_target.jpg
使用apkIDE部分java提示error,这次使用jadx
找到main,发现对_target.jpg的操作

java AES加密

class Aha()

即mask与main 的"dajidalijinwanchiji~~~~~~" 异或,并作为AES加密的key
再次异或找到key
解密_target.jpg即可
具体解密脚本还未完成
网友评论