[CTF从0到1]又见安卓逆向+位运算

发布于 2024-02-05  138 次阅读


BUUCTF - 相册

看题目就像安卓逆向,好久没做过了,搞一道来玩玩。

拖进jeb,先浏览代码,发现了“mail”字样,

编辑->寻找,查找带mail字样的函数碰运气,结果开盖有喜:

猜测这是关键函数,按X看交叉引用,

双击第一个进去看看,看到了MAILSERVER变量,双击看声明,发现和base64加密有关,

双击NativeMethod,发现函数里是空的,

根据经验,Native函数一般涉及到了外部.so文件,直接解压apk,找到.so文件,

拖进IDA。Shift+F12看到了这几个字符串,

分别进行base64解码,解到第二个时得到flag。

这个题主打一个误打误撞,复盘也不知道思路是怎样的,反正最后是出flag了23333。

[FlareOn4]IgniteMe

终于碰见一道需要动态调试的题了,


函数很少,每一个都不长,挨个看看。


start函数逻辑比较简单,if判断为真就输出GoodJob通过,判断为假就不通过,至于上面几个函数暂时不知道是干什么的。


sub_4010F0函数,直接丢进GPT分析,这个函数功能是读取数据,把换行符和回车符去掉后存进byte_403078数组中。


sub_401050函数,大概是把byte_403078数组各元素和v4进行异或,然后和给定的数组byte_403000逐位对比。看了一下sub_401020函数,就是计算byte_403078数组长度的。v4来自sub_401000函数,跟进看看,


???什么也没有。确认一下异或那行汇编的地址,



拖进OD动调看看。

根据代码逻辑,寄存器ECX里就是v4的值(十六进制),

v4为4。回到IDA,很容易找到byte_403000数组。现在万事俱备,脚本直接出flag,

用flag{}包裹即可。

但是我在复盘这道题的时候,又重新看了下sub_401000函数:

__int16 sub_401000()
{
  return (unsigned __int16)__ROL4__(-2147024896, 4) >> 1;
}

查了一下才搞明白,这里其实是把32位带符号整数-2147024896循环左移4位,将结果强制转换为无符号16位整数(即保留二进制的低16位),之后再右移1位。算了一下确实是4,原来是我的问题,哈哈。

最后更新于 2024-02-05