刷题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记录_第1张图片

点开&xmmword_413E34

刷题wp记录_第2张图片

按R转换为字符

刷题wp记录_第3张图片

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

easy_vb

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

刷题wp记录_第4张图片

Reverse

刷题wp记录_第5张图片

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

刷题wp记录_第6张图片

F5看伪代码

刷题wp记录_第7张图片

点开sub_4110BE函数

刷题wp记录_第8张图片

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

刷题wp记录_第9张图片

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

刷题wp记录_第10张图片

 

Android Easy

用apkIDE反编译,得到

刷题wp记录_第11张图片

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

刷题wp记录_第12张图片

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

刷题wp记录_第13张图片

得到flag

Android Normal

用apkIDE打开apk文件

 

刷题wp记录_第14张图片

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

 

刷题wp记录_第15张图片

看不出来算法,点进XMMword_8B0

刷题wp记录_第16张图片

转换为数据

刷题wp记录_第17张图片

发现了flag为[email protected]

Androideasy

用apkIDE反编译得到:

 

刷题wp记录_第18张图片

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

刷题wp记录_第19张图片

得到flag

Classical Crackme

用PEID工具扫描

 

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

 

刷题wp记录_第20张图片

将b进行base64解码得到flag

刷题wp记录_第21张图片

Findkey

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

 

刷题wp记录_第22张图片

据此写出对应py脚本

刷题wp记录_第23张图片

得到flag


Hello

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

刷题wp记录_第24张图片

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

刷题wp记录_第25张图片

得到

Sheasy

用ida打开,点开main函数

 

刷题wp记录_第26张图片

刷题wp记录_第27张图片

点开byte_8049AE0,得到byte_8049AE0和byte_8049B15的值

刷题wp记录_第28张图片

写出相应的c语言脚本:

刷题wp记录_第29张图片

得到flag

Smali

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

刷题wp记录_第30张图片

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

刷题wp记录_第31张图片

爬楼梯

先用apkIDE反编译

刷题wp记录_第32张图片

可以看到

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

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

}

只要setClickable为ture就可以了

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

刷题wp记录_第33张图片

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

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

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

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

刷题wp记录_第34张图片


软件密码破解-1

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

刷题wp记录_第35张图片

大概的分析是

输入再变化为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记录_第36张图片

写出c语言脚本

刷题wp记录_第37张图片

 

Easy_CrackMe

打开文件,随意输入密码

刷题wp记录_第38张图片

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

刷题wp记录_第39张图片

F5打开伪代码

点开a5y

刷题wp记录_第40张图片

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

 

刷题wp记录_第41张图片

Easy_ELF

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

刷题wp记录_第42张图片

打开sub_8048434函数

刷题wp记录_第43张图片

写出对应c语言脚本

刷题wp记录_第44张图片

Easy_KeygenMe

用ida搜素关键字wrong

刷题wp记录_第45张图片

F5查看伪代码

刷题wp记录_第46张图片

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

刷题wp记录_第47张图片

pwn:fd

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

刷题wp记录_第48张图片

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

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

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

Text1

刷题wp记录_第49张图片

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

刷题wp记录_第50张图片

得到SSSDSSSASSDDWDWWDDDWWAAAWAWWDDDDDSDDWDDSDDDSSAASAAWAASSSASSDDDWWDDDDSSAA

NJCTF

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

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

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

在其中找到了flag的函数

刷题wp记录_第51张图片

刷题wp记录_第52张图片

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

Replace

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

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

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

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

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

Music Player

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

刷题wp记录_第53张图片

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

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

刷题wp记录_第54张图片

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

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

Timer

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

刷题wp记录_第55张图片

于是直接写出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记录_第56张图片

将if-gtz改为if-ltz

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

最后得到flag

 

你可能感兴趣的:(刷题wp记录)