相册:
打开题目,下载附件,发现是apk文件,在jd_gui中打开
看到base64密码,没找到密文,没看懂。翻了一下大佬的wp找到。
找到Native Method,百度一下。
Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。
对于NativeMethod的问题,要到apk中对应的位置找到native-lib.so然后拖到IDA中
(直接将文件拖到ida中,找到对应文件)
找到三个base64密文,解出发现第二个为flag
flag{18218465125@163.com}
学到的知识点、:
1.对于apk中NativeMethod接口,找到对应的so文件,拖入ida中。
level1:
打开题目,下载附件。找到主函数分析
int __cdecl main(int argc, const char **argv, const char **envp)
{
int i; // [rsp+4h] [rbp-2Ch]
FILE *stream; // [rsp+8h] [rbp-28h]
char ptr[24]; // [rsp+10h] [rbp-20h] BYREF
unsigned __int64 v7; // [rsp+28h] [rbp-8h]
v7 = __readfsqword(0x28u);
stream = fopen("flag", "r"); // fopen函数打开文件用于读写,此处为对文件只读
fread(ptr, 1uLL, 0x14uLL, stream); // fread函数用于将文件中的数据读取到指定,即将stream中的数据读到ptr中
fclose(stream); // fclose函数用来关闭一个已打开的文件
for ( i = 1; i <= 19; ++i )
{
if ( (i & 1) != 0 )
printf("%ld\n", (unsigned int)(ptr[i] << i));// a<<b对于整数表示“向左移动”。的按位表示a是左移位b
else
printf("%ld\n", (unsigned int)(i * ptr[i]));
}
return 0;
}
写脚本解密
#include<stdio.h>
int main(){
long long ptr[19]={198,232,816,200,1536,300,6144,984,51200,570,92160,1200,565248,756,1474560,800,6291456,1782,65536000};
int i,j;
for ( i = 1; i <= 19; ++i )
{
if ( (i & 1) != 0 )
for(j=0;j<=256;j++){
if(ptr[i-1]==(j << i))
printf("%c",j);
}
else
for(j=0;j<=256;j++){
if(ptr[i-1]/i==j)
printf("%c",j);
}
}
return 0;
}
得到flag{d9-dE6-20c}
学到的知识:
1.fopen函数(打开文件),fread函数(将指定文件读取到指定位置),fclose函数(关闭文件)。
2.a<<b含义.