逆向BSides SF CTF之flagstore.apk

看有一个writeup写了个装drozer, 然后尝试了一下并没有成功。感觉虽然功能不错,但是有点麻烦。然后
参考:
https://ctf.rip/bsides-sf-ctf-2017-flag-receiver-mobile-reverse-engineering/
https://russtone.io/2017/02/14/bssidessf-2017-flagreceiver/

MainActivity中发现启动之后就向Send_to_Activity这个广播接收器注册了一个action为com.flagstore.ctf.INCOMING_INTENT的广播,
这里写图片描述
而且界面只有一个to-do: UI pending,在Send_to_ActivityonReceive()方法中可以发现,需要发送一个满足特定条件的广播才能激活进入下一个Activity。
这里写图片描述
这个特定条件是:
extra中的msg值为:OpenSesame。然后调用android的am工具。不过记住要用root权限,仅仅在adb shell am… 是不能触发的。

adb shell
su
am broadcast -a "com.flagstore.ctf.INCOMING_INTENT" --es msg "OpenSesame"

然后就可以看到界面跳转了。然后出现一个很大的按钮可以点击,然而点击之后,应用就崩溃了
于是静态分析源码。
把这个lib\armeabi-v7a\libnative-lib.so文件拖到IDA中去
这里写图片描述
找到Exports就可以找到一个函数getPhrase()
然后双击,进入该函数,然后按F5是不行的,搜了一下才知道这时候需要点击右键,然后Create Function。这样再按F5就可以得到C代码了。
这里写图片描述
这里写图片描述
其中__stack_chk_guard__stack_chk_fail()是GCC的堆栈保护机制,其中__stack_chk_guard叫作CANARY(金丝雀)值。

我们发现这一随机值是放在了函数的局部变量和保存的指令指针(译注:此处指返回地址和EBP)之间。这个值被称作金丝雀(“canary”)值,指的是矿工曾利用金丝雀来确认是否有气体泄漏,如果金丝雀因为气体泄漏而中毒死亡,可以给矿工预警。
http://www.freebuf.com/articles/system/24177.html
在#27行中,将_stack_chk_guard保存在v24中,然后再在函数返回之前,#52,#53行将之前保存的值与现在的_stack_chk_guard比较,若两者不一致,金丝雀(canary)的值被修改了,栈溢出发生了,保存的指令指针可能也被修改了,因此不能安全返回,则执行_stack_chk_fail(),然后会丢出一个错误,退出进程。

IDA小技巧

注意这里的dest, v16, v17, v18, v19, v20等是十进制,可以在IDA里选择将其改成16进制或者字符串。
这里写图片描述

关于 strncat

头文件:#inclue <string.h>
strncat()用于将n个字符追加到字符串的结尾,其原型为:

char * strncat(char *dest, const char *src, size_t n);

strncat()将会从字符串src的开头拷贝n 个字符到dest字符串尾部,dest要有足够的空间来容纳要拷贝的字符串。如果n大于字符串src的长度,那么仅将src全部追加到dest的尾部。
strncat()会将dest字符串最后的’\0’覆盖掉,字符追加完成后,再追加’\0’。
返回字符串dest。

关于strncpy

头文件:#include <string.h>
strncpy()用来复制字符串的前n个字符,其原型为:

char * strncpy(char *dest, const char *src, size_t n);

【参数说明】dest 为目标字符串指针,src 为源字符串指针。
【返回值】返回字符串dest。

关于跨平台的移植性

int类型比较特殊,具体的字节数同机器字长和编译器有关。如果要保证移植性,尽量用__int16 __int32 __int64吧。__int16、__int32这种数据类型在所有平台下都分配相同的字节。所以在移植上不存在问题。

建议:在代码中尽量避免使用int类型,根据不同的需要可以用short,long,unsigned int 等代替。
http://www.cppblog.com/xyjzsh/archive/2010/10/20/130554.html
怪不得很多IDA出来的C有很多__int8, __int16, __int32等等。

然后顺便反编译了getFlag
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值