-
-
[讨论]第三题思路
-
发表于: 2015-10-18 23:57 2779
-
APK解包,dex没有保护,所有工作在so内部完成,ida加载so,失败
在机器上安装运行应用,之前有修改固件的vm/Jni.cpp文件,相关jni入口直接打印出来入口地址
I/dalvikvm( 8867): CrackU jni Lcom/ctf/crackme3/MainActivity; check 0x6549ec39
ida attach后加断点
进入后程序跳来跳去,担心jni入口只是保存输入字符并不处理,所以想在系统返回的字符串上做处理:还是修改vm/Jni.cpp,如果提交特定字符串,返回异常字符串
if(*newStr == 'x' && newStr[1] == 'x') return (char const*)0x12345678;
修改固件后,输入xx,在strlen函数中捕获到异常,调用堆栈在0x654e3576
初步跟踪该处代码发现一个字符串长度的循环,看起来像是在处理输入字符。
花了比较多时间动态跟踪,大致看到这部分代码只拷贝了一下输入字符。
中间尝试过暴力破解,写一个APK封装该so,发现调用时间太长,strace发现调用了nanosleep,修改固件屏蔽掉该调用,check一次还是需要将近1s,并且发现CPU占用率50%,双核的机器,也就是说check一下满CPU运行需要1s钟,用飞机座位编号的两个数字加一个大写字母破解了一遍,没有结果故放弃。
继续ida动态跟踪,初步发现里面有三个函数表,两个跳转函数,一个处理前面的三个函数表,一个处理分支,另外一个加密数据的函数。分别用来隐藏调用和数据,用ida脚本记录调用信息,在三个函数中设置断点自动记录调用过程,跑了一个晚上都没跑完。
修改脚本,只在特定步骤下断点,大致发现整个check过程有几个循环[从strlen返回后开始]
65494576 处,字符串长度的循环
654A0188 长度100次的循环
6549f844 超长的165596次循环
654a75ed 63次循环
6549a6cc 264次循环
循环的次数很固定,同输入字符串无关[空串除外]
dump关键节点的内存比较time up
看过提示发现自己还差太远:)
signal 用strace的时候有注意到
19:53:01 sigaction(SIGILL, {0x654870a5, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0) = 0 4005E000触发
19:53:01 sigaction(SIGSEGV, {0x654870a5, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0) = 0
19:53:01 sigaction(SIGTRAP, {0x654870a5, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0) = 0
另外整个过程so基地址 65485000
在机器上安装运行应用,之前有修改固件的vm/Jni.cpp文件,相关jni入口直接打印出来入口地址
I/dalvikvm( 8867): CrackU jni Lcom/ctf/crackme3/MainActivity; check 0x6549ec39
ida attach后加断点
进入后程序跳来跳去,担心jni入口只是保存输入字符并不处理,所以想在系统返回的字符串上做处理:还是修改vm/Jni.cpp,如果提交特定字符串,返回异常字符串
if(*newStr == 'x' && newStr[1] == 'x') return (char const*)0x12345678;
修改固件后,输入xx,在strlen函数中捕获到异常,调用堆栈在0x654e3576
初步跟踪该处代码发现一个字符串长度的循环,看起来像是在处理输入字符。
花了比较多时间动态跟踪,大致看到这部分代码只拷贝了一下输入字符。
中间尝试过暴力破解,写一个APK封装该so,发现调用时间太长,strace发现调用了nanosleep,修改固件屏蔽掉该调用,check一次还是需要将近1s,并且发现CPU占用率50%,双核的机器,也就是说check一下满CPU运行需要1s钟,用飞机座位编号的两个数字加一个大写字母破解了一遍,没有结果故放弃。
继续ida动态跟踪,初步发现里面有三个函数表,两个跳转函数,一个处理前面的三个函数表,一个处理分支,另外一个加密数据的函数。分别用来隐藏调用和数据,用ida脚本记录调用信息,在三个函数中设置断点自动记录调用过程,跑了一个晚上都没跑完。
修改脚本,只在特定步骤下断点,大致发现整个check过程有几个循环[从strlen返回后开始]
65494576 处,字符串长度的循环
654A0188 长度100次的循环
6549f844 超长的165596次循环
654a75ed 63次循环
6549a6cc 264次循环
循环的次数很固定,同输入字符串无关[空串除外]
dump关键节点的内存比较time up
看过提示发现自己还差太远:)
signal 用strace的时候有注意到
19:53:01 sigaction(SIGILL, {0x654870a5, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0) = 0 4005E000触发
19:53:01 sigaction(SIGSEGV, {0x654870a5, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0) = 0
19:53:01 sigaction(SIGTRAP, {0x654870a5, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0) = 0
另外整个过程so基地址 65485000
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
谁下载
peterchen
飘云
huangyalei
whydbg
hawking
opensky
ELyt
yingyue
simplaman
loudy
三寸法师
天山飞雪
keellisa
愚公
lonshek
KooJiSung
errantdog
zhengcai
krash
lacoucou
lcweik
baichisi
熊猫正正
ugene
LOVEZ
icatXP
小调调
Arcade
ggggwwww
Chostrider
MaYil
adslxyz
happytimex
zvrop
outdoxl
shixiaoyi
naidizekij
冷瞳
lxtalx
zwfg
starfly
currwin
blowingluo
cainaifa
CrackLife
inforworm
鱼妹兔
memphwong
e守望者e
spritelime
无名诸葛
vVv一
Canere
deff
Scatter
Ericky
pwnerZ
ShallBegin
misskings
calcium
老和部队
huixiu
flystream
seelong
bujianshi
FraMeQ
virusjing
hulimin
mumuhacker
miraclee
ddddddfx
kksamoyed
lulusudoku
hellsong
bbll
stezqy
我跑来花花
soco峰
世人谓我
谁下载
peterchen
飘云
huangyalei
whydbg
hawking
opensky
ELyt
yingyue
simplaman
loudy
三寸法师
天山飞雪
keellisa
愚公
lonshek
KooJiSung
errantdog
zhengcai
krash
lacoucou
lcweik
baichisi
熊猫正正
ugene
LOVEZ
icatXP
小调调
Arcade
ggggwwww
Chostrider
MaYil
adslxyz
happytimex
zvrop
outdoxl
shixiaoyi
naidizekij
冷瞳
lxtalx
zwfg
starfly
currwin
blowingluo
cainaifa
CrackLife
inforworm
鱼妹兔
memphwong
e守望者e
spritelime
无名诸葛
vVv一
Canere
deff
Scatter
Ericky
pwnerZ
ShallBegin
calcium
老和部队
huixiu
flystream
seelong
bujianshi
FraMeQ
virusjing
hulimin
mumuhacker
miraclee
ddddddfx
kksamoyed
lulusudoku
hellsong
bbll
stezqy
我跑来花花
soco峰
世人谓我
看原图
赞赏
雪币:
留言: