刷题wp记录

目录

 

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


Easy_Re

用ida打开,输入关键字,再F5看伪代码                

刷题wp记录

点开&xmmword_413E34

刷题wp记录

按R转换为字符

刷题wp记录

将字符翻转得到flag:DUTCTF{We1c0met0DUTCTF}

easy_vb

用ida打开,搜素字符串flag,没找到,再搜ctf,找到flag

刷题wp记录

Reverse

刷题wp记录

得到关键字wrong,再打开ida搜索关键字

刷题wp记录

F5看伪代码

刷题wp记录

点开sub_4110BE函数

刷题wp记录

经查阅可能是base64加密,则写出c语言脚本

刷题wp记录

刷题wp记录

再把得到的字符串进行base64解密就得到flag

刷题wp记录

 

Android Easy

用apkIDE反编译,得到

刷题wp记录

根据java代码,先写出一部分c语言脚本,求出j

刷题wp记录

j=54,于是char b2[54];,写出剩下脚本

刷题wp记录

得到flag

刷题wp记录

Android Normal

用apkIDE打开apk文件

 

刷题wp记录

再打开so文件找stringFromJNI()函数

 

刷题wp记录

看不出来算法,点进XMMword_8B0

刷题wp记录

转换为数据

刷题wp记录

发现了flag为[email protected]

Androideasy

用apkIDE反编译得到:

 

刷题wp记录

则可据此写出简单的c语言脚本:

刷题wp记录

得到flag

刷题wp记录

Classical Crackme

用PEID工具扫描

 

刷题wp记录

发现是.NET,于是用ILSpy工具反编译,得到

 

刷题wp记录

将b进行base64解码得到flag

刷题wp记录

Findkey

用ida打不开,用ultraedit打开,发现头文件为03 F3 0D 0A,是pyc格式,于是在线python反编译,得到反编译代码

 

刷题wp记录

据此写出对应py脚本

刷题wp记录

得到flag

刷题wp记录


Hello

用ida打开文件,找到关键代码

刷题wp记录

不太清楚v2的值,由于start为函数名称,所以尝试把函数名换为地址,成功写出c语言脚本

刷题wp记录

得到

刷题wp记录

Sheasy

用ida打开,点开main函数

 

刷题wp记录

刷题wp记录

点开byte_8049AE0,得到byte_8049AE0和byte_8049B15的值

刷题wp记录

写出相应的c语言脚本:

刷题wp记录

得到flag

刷题wp记录

Smali

首先使用工具Smali2Java将smali文件转换为java文件

刷题wp记录

可以看出大概使是用的AES算法,key为base64解码后的cGhyYWNrICBjdGYgMjAxNg==,密文为base64解码后的sSNnx1UKbYrA1+MOrdtDTA==。写出相应的python脚本

刷题wp记录

刷题wp记录

爬楼梯

先用apkIDE反编译

刷题wp记录

可以看到

if (this.to_reach_int <=this.has_gone_int) {

     ((Button)findViewById(2131492950)).setClickable(true);

}

只要setClickable为ture就可以了

先用apktool box反编译apk,找MainActivity.smali文件,用记事本打开,找关键词setClickable

刷题wp记录

刷题wp记录

找到了这两个,v3=0x1,再找v5

刷题wp记录

找到v5=0x0,改成0x1试试。

然后回编译apk,结果出错了,找不到解决方法,可能是工具问题,于是试了下将classes文件提取出来改smali文件,再放回apk中,最后重新签名就可以了。

打开apk,无论爬多少楼都可以看到flag

刷题wp记录


软件密码**-1

先搜索字符串,有个你赢了,则跳到你赢了那里,往上翻,发现了关键代码

刷题wp记录

大概的分析是

输入再变化为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的地址查看数据

 

刷题wp记录

写出c语言脚本

刷题wp记录

刷题wp记录

 

Easy_CrackMe

打开文件,随意输入密码

刷题wp记录

打开ida,在ida中搜索关键字Incorrect Password,得到

刷题wp记录

F5打开伪代码

刷题wp记录

点开a5y

刷题wp记录

得到a5y存储的数据为5y,同理v5为R3versing,分析可知sting=E,v3=a,v4=5y,v5=R3versing,则输入Ea5yR3versing正确

 

刷题wp记录

Easy_ELF

用ida打开文件,找到mian函数

刷题wp记录

打开sub_8048434函数

刷题wp记录

写出对应c语言脚本

刷题wp记录

Easy_KeygenMe

用ida搜素关键字wrong

刷题wp记录

F5查看伪代码

刷题wp记录

第一次的scanf为name,第二次为serial,为简单的异或算法,每2个16进制进行一次计算,写出c语言脚本:

刷题wp记录

pwn:fd

先连接上去查看fd.c代码

刷题wp记录

ssize_t read(int fd,void *buf,size_t nbyte)

read函数是负责从fd中读取内容.成功时,read返回实际所读的字节数,如果返回的值是0,表示已经读到文件的结束了.

大概就是让fd=0,然后使传入buf的值为0,就可以输入第二个命令LETMEWOM

刷题wp记录

Text1

刷题wp记录

用WASD控制方向,从C走到X,用od打开

刷题wp记录

得到SSSDSSSASSDDWDWWDDDWWAAAWAWWDDDDDSDDWDDSDDDSSAASAAWAASSSASSDDDWWDDDDSSAA

NJCTF

用工具打开apk,没找到什么有用的,于是找到so文件打开。找到android_main函数

刷题wp记录

控制流平坦化,就是在不改变源代码的功能前提下,将C或C++代码中的if、while、for、do等控制语句转换成switch分支语句。这样做的好处是可以模糊switch中case代码块之间的关系,从而增加分析难度。

所以这个应该就是OLLVM的混淆,if-else的代码块是顺序执行的,混淆后代码块的执行由while循环和变量v4动态计算而得。

在其中找到了flag的函数

刷题wp记录

刷题wp记录

由于内存地址最大为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个中

刷题wp记录

Replace

用od打开,发现关键字correct,在上面断点,然后发现只要运行到一个地方程序就会结束

刷题wp记录

查看调用函数地址,发现是将90给了eax,也就是nop掉了

刷题wp记录

经测试,1的时候eax为601605CC,2的时候为601605CD,

所以是输入的值+601605CB=真正eax,程序在00401071会被强行跳转,也就是要把这个地址给nop掉。

在网上查到可以计算好地址,使得call 40466F正好抹掉这个jmp。加数比得数大,因此需要利用eax的溢出。601005Cb+输入值=0x100401071,得到2687109798

Music Player

打开程序,发现播放到1分钟后就会提示

刷题wp记录

打开od搜索关键字,有两个可疑的

刷题wp记录

刷题wp记录

经断点测试,第一个会在59秒时断下。往上翻发现关键跳,改成jmp后在1分钟时又显示

刷题wp记录

在改的那里断点,发现会每秒都会重复一次,于是就在59秒时断点

刷题wp记录

在这里就会弹出错误,于是往上找到第二个关键跳,改为jmp。重新运行得到flag

Timer

用apkIDE打开,找到关键就在于求k

刷题wp记录

于是直接写出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

 

刷题wp记录

将if-gtz改为if-ltz

然后找到k对应的变量为v3处,在之后添加const v3,1616384将k改为常量

最后得到flag