目录
Easy_Re
easy_vb
Reverse
Android Easy
Android Normal
Androideasy
Classical Crackme
Findkey
Hello
Sheasy
Smali
爬楼梯
软件密码破解-1
Easy_CrackMe
Easy_ELF
Easy_KeygenMe
pwn:fd
Text1
NJCTF
Replace
Music Player
Timer
用ida打开,输入关键字,再F5看伪代码
点开&xmmword_413E34
按R转换为字符
将字符翻转得到flag:DUTCTF{We1c0met0DUTCTF}
用ida打开,搜素字符串flag,没找到,再搜ctf,找到flag
得到关键字wrong,再打开ida搜索关键字
F5看伪代码
点开sub_4110BE函数
经查阅可能是base64加密,则写出c语言脚本
再把得到的字符串进行base64解密就得到flag
用apkIDE反编译,得到
根据java代码,先写出一部分c语言脚本,求出j
j=54,于是char b2[54];,写出剩下脚本
得到flag
用apkIDE打开apk文件
再打开so文件找stringFromJNI()函数
看不出来算法,点进XMMword_8B0
转换为数据
发现了flag为[email protected]
用apkIDE反编译得到:
则可据此写出简单的c语言脚本:
得到flag
用PEID工具扫描
发现是.NET,于是用ILSpy工具反编译,得到
将b进行base64解码得到flag
用ida打不开,用ultraedit打开,发现头文件为03 F3 0D 0A,是pyc格式,于是在线python反编译,得到反编译代码
据此写出对应py脚本
得到flag
用ida打开文件,找到关键代码
不太清楚v2的值,由于start为函数名称,所以尝试把函数名换为地址,成功写出c语言脚本
得到
用ida打开,点开main函数
点开byte_8049AE0,得到byte_8049AE0和byte_8049B15的值
写出相应的c语言脚本:
得到flag
首先使用工具Smali2Java将smali文件转换为java文件
可以看出大概使是用的AES算法,key为base64解码后的cGhyYWNrICBjdGYgMjAxNg==,密文为base64解码后的sSNnx1UKbYrA1+MOrdtDTA==。写出相应的python脚本
先用apkIDE反编译
可以看到
if (this.to_reach_int <=this.has_gone_int) {
((Button)findViewById(2131492950)).setClickable(true);
}
只要setClickable为ture就可以了
先用apktool box反编译apk,找MainActivity.smali文件,用记事本打开,找关键词setClickable
找到了这两个,v3=0x1,再找v5
找到v5=0x0,改成0x1试试。
然后回编译apk,结果出错了,找不到解决方法,可能是工具问题,于是试了下将classes文件提取出来改smali文件,再放回apk中,最后重新签名就可以了。
打开apk,无论爬多少楼都可以看到flag
先搜索字符串,有个你赢了,则跳到你赢了那里,往上翻,发现了关键代码
大概的分析是
输入再变化为ebx
ecx=CTF_100_.009E77F8
eax=ebx=输入的
ecx=ecx-ebx=CTF_100_.009E77F8-eax
循环
dl=ecx+eax
eax=eax^(ecx+eax)
eax=eax+1
有多少位就循环多少次
循环完后和后面几个数据比较比较
找到ecx+eax的地址查看数据
写出c语言脚本
打开文件,随意输入密码
打开ida,在ida中搜索关键字Incorrect Password,得到
F5打开伪代码
点开a5y
得到a5y存储的数据为5y,同理v5为R3versing,分析可知sting=E,v3=a,v4=5y,v5=R3versing,则输入Ea5yR3versing正确
用ida打开文件,找到mian函数
打开sub_8048434函数
写出对应c语言脚本
用ida搜素关键字wrong
F5查看伪代码
第一次的scanf为name,第二次为serial,为简单的异或算法,每2个16进制进行一次计算,写出c语言脚本:
先连接上去查看fd.c代码
ssize_t read(int fd,void *buf,size_t nbyte)
read函数是负责从fd中读取内容.成功时,read返回实际所读的字节数,如果返回的值是0,表示已经读到文件的结束了.
大概就是让fd=0,然后使传入buf的值为0,就可以输入第二个命令LETMEWOM
用WASD控制方向,从C走到X,用od打开
得到SSSDSSSASSDDWDWWDDDWWAAAWAWWDDDDDSDDWDDSDDDSSAASAAWAASSSASSDDDWWDDDDSSAA
用工具打开apk,没找到什么有用的,于是找到so文件打开。找到android_main函数
控制流平坦化,就是在不改变源代码的功能前提下,将C或C++代码中的if、while、for、do等控制语句转换成switch分支语句。这样做的好处是可以模糊switch中case代码块之间的关系,从而增加分析难度。
所以这个应该就是OLLVM的混淆,if-else的代码块是顺序执行的,混淆后代码块的执行由while循环和变量v4动态计算而得。
在其中找到了flag的函数
由于内存地址最大为0xffffffff,所以i要小于4294967295。写出脚本#include
#include
char *flg(int a1, char *a2)
{
intv2;
intv3;
intv4;
char v5;
intv6;
intv7;
intv8;
intv9;
intv10;
intv11;
v2= a1;
v3= a1;
v4= a1 % 10;
v5= v4;
*a2= 20 * v4;
v6= v3 / 100 % 10;
v7= 19 * v6 + 20 * v4;
a2[1] = v7;
a2[2] = v7 - 4;
v8= v3 / 10 % 10;
a2[3] = v3 / 1000000 % 10 + 11 * v8;
v9= v3 / 10000 % 10;
v10= v3 / 1000 % 10;
a2[4] = 20 * v10 - v9;
a2[5] = (v8 + v5) * v10;
a2[6] = v8 * v10 * v9;
v11= v2 / 100000 % 10;
a2[7] = 20 * v11 - v6;
a2[8] = 10 * v10 | 1;
a2[9] = (v8 + v5) * v11 - 1;
a2[10] = v5 * v8 * v6 * v6 - 4;
*(a2 + 11) = ((v6 + v8) * v11 - 5);
return a2;
}
int main()
{
inti,j,flag=0;
chara2[13]={0};
for(i=0;i<4294967295;i++)
{
flag=0;
memset(a2,0,13);
flg(i,a2);
for(j=0;j<12;++j)
{
if((a2[j]>='a'&&a2[j]<='z') || (a2[j]>='A'&&a2[j]<='Z')||(a2[j]>='0'&&a2[j]<='9'))
{
continue;
}
else
{
flag = 1;
break;
}
}
if(flag == 0)
printf("%s\n",a2);
}
return0;
}
得到flag有很多很多,但仔细看其实只有20个在不停循环,所以最后爆破出的flag在这20个中
用od打开,发现关键字correct,在上面断点,然后发现只要运行到一个地方程序就会结束
查看调用函数地址,发现是将90给了eax,也就是nop掉了
经测试,1的时候eax为601605CC,2的时候为601605CD,
所以是输入的值+601605CB=真正eax,程序在00401071会被强行跳转,也就是要把这个地址给nop掉。
在网上查到可以计算好地址,使得call 40466F正好抹掉这个jmp。加数比得数大,因此需要利用eax的溢出。601005Cb+输入值=0x100401071,得到2687109798
打开程序,发现播放到1分钟后就会提示
打开od搜索关键字,有两个可疑的
经断点测试,第一个会在59秒时断下。往上翻发现关键跳,改成jmp后在1分钟时又显示
在改的那里断点,发现会每秒都会重复一次,于是就在59秒时断点
在这里就会弹出错误,于是往上找到第二个关键跳,改为jmp。重新运行得到flag
用apkIDE打开,找到关键就在于求k
于是直接写出java脚本求出k
public class HelloWorld {
public static boolean is2(int n) {
if (n <= 3) {
if (n > 1) {
return true;
}
return false;
} else if (n % 2 == 0 || n % 3 == 0) {
return false;
} else {
int i = 5;
while (i * i <= n) {
if (n % i == 0 || n % (i + 2)== 0) {
return false;
}
i += 6;
}
return true;
}
}
public static void main(String args[]) {
int time = 200000;
int k = 0;
while (time > 0) {
if (is2(time)) {
k += 100;
}
else {
k--;
}
time--;
}
System.out.println(k);
}
}
得到k=1616384,再打开IDA看so文件的stringFromJNI2函数,结果太复杂了无法解出,然后在网上看到可以用直接更改smali的方式得出flag:
在MainActivity$1.smali中搜索到关键词The flag is
将if-gtz改为if-ltz
然后找到k对应的变量为v3处,在之后添加const v3,1616384将k改为常量
最后得到flag