0x03Xctf进阶刷题-1

Xctf进阶刷题-1

0x01shuffle

IDA分析即可看到flag

image-20201028100237540

0x02 reversing-x64elf(python二维数组)

IDA分析关键函数

可以看到是对输入的值进行了sub_4006FD函数操作然后进行判定

image-20201027174007904

进入函数查看,可以看到是一个计算操作

image-20201027174043472

编写脚本即可得flag

image-20201027175341690

注意:python中二维数组的编写

0x03 guess-the-number(jar包逆向)

是一个java程序,直接解压jar包,查看.class源码,可以看到是对两个字符串进行操作

image-20201027183024987

一开始想要用python编写脚本的,但是xor函数涉及到了Biginter,所以直接改下代码用Java跑

image-20201027183147009

0x04 easyre(python异或)

IDA分析关键函数,输入字符串为v7,长度为24,并且做了以下操作,其中unk_402158是已知的数据

image-20201028092543787

image-20201028092904689

编写脚本即可跑出flag

image-20201027182905474

注意:Python中异或要加个括号,不加会先运行6-1

0x05 re-for-50-piz(mips)

IDA分析,发现和以往的代码都不太一样,载入的时候IDA也提示是MIPS

参考:https://blog.csdn.net/qq_42967398/article/details/94845416

image-20201028100333224

image-20201028100408292

0x06 dmd-50

IDA分析关键函数,要求输入Key的值

image-20201027182604719

可以看到输出,所以需要进下面的判定

image-20201027182542427

所以输入要等于41里的值,将41的值拖出来用Md5解密即可

image-20201027182629949

0x07 parallel-comparator-200(爆破)

直接可以看源码分析:

image-20201027182101171

image-20201027180417612

image-20201027182054092

所以编写一个脚本就可以了

image-20201027180404777

注意:由于生成的是随机数,所以需要爆破一下

0x08 secret-galaxy-300(运行时堆栈中)

这个题比较神奇

主函数:看到调用了fill和print

image-20201027180024719

fill函数:给一堆变量赋值了

image-20201027180045329

打印出这些值

image-20201027180116127

动态运行看看:

image-20201027180133857

也没有什么输出也没有什么flag的信息

但是在动态调试的时候在堆栈中意外发现了flag

image-20201027180225886

0x09 srm-50(十六进制转字符串)

IDA分析关键函数

image-20201027175822604

image-20201027175734844

可以查看到410A80等的值,十六进制转字符串即可,最终可直接看出flag

image-20201028093014322

image-20201027175748471

0x0A simple-check-100(linux动态调试)

IDA分析关键函数,是对输入的Key进行一个check操作,然后会对v8运行interesting_function

image-20201027174951320

check函数:

image-20201027175030634

interesting函数:可以看到是v3和flag_data做异或

image-20201027175211284

Flagdata:

image-20201027175058496

有点复杂,选择动态调试,想看看直接绕过输出,结果是一堆乱码

image-20201027175502311

最后得知需要在Linux下进行动态调试,即可得到flag

0x0B Mysterious(atoi函数)

IDA分析关键函数,可以看到只要知道v5的内容就可以了

image-20201027174533035

一开始去分析atoi函数了,但是分析了半天没有弄懂,后来发现这是固定的函数,和itoa对应,是字符串如’123’转整数123

char *itoa (int value, char *str, int base );

返回值:返回指向str的指针,无错误返回。

int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等,大小应在2-36之间。

所以输入的字符串为’122xyz’,即可得到flag

0x0C newbie_calculations(计算器思路)

看题目知道这是个计算器题

IDA分析,函数调用很复杂

参考:https://www.cnblogs.com/DirWang/p/11586159.html

思路就是:因为没有输入,所以只是对固定数值进行的计算操作,对出现的401100,401000,401220函数进行分析,然后自己用熟悉的语言重写一下,然后复制这段代码运行即可得出flag

image-20201027173642989

image-20201027173844498

0x0D re1-100

IDA分析,关键函数:

image-20201027172611785

可以看出输入就是bufWrite

image-20201027172650353

所以输入字符串的长度为42,第一位和最后一位分别是{},前十位是53fc275d81,后十位是4938ae4efd,最后经过一个混淆,要等于下面那个字符串

查看混淆的代码,就是分块处理了下各个字符串,换了下位置

image-20201027173036364

最终换回来就得到flag了

0x0E answer_to_everything

IDA分析关键函数

所以只要输入42,就可以得到一串字符:Cipher from Bill \nSubmit without any tags\n#kdudpeh

image-20201027173507303

根据题目提示sha1加密和不需要加tag,变化一下就可以得到flag了

0x0F elrond32
0x10 tt3441810
0x11 re2-cpp-is-awesome(dword/dd)

IDA看看

image-20201102151235206

image-20201102151429640

这个是主函数

可以看到sub_400B56函数:

image-20201102151302390

和sub_400B73函数

image-20201102151145960

所以我们得知要满足判定条件

我们可以看到off_6020A0和dword_6020C0

image-20201102151547732

image-20201102151634166

那么我们只要编写脚本,满足判定条件即可

image-20201103161236507

注意:dword代表是4个字节一位,align8代表8字节对齐,所以在0x24和5之间是有一个0的,汇编中dd代表4字节,dw代表2字节,db代表1字节

0x12 re4-unvm-me(python3的int()函数和md5加解密)

是个后缀pyc的文件

直接拖进软件解出源码

image-20201102173720552

只要将md5s中的数字转成十六进制后找md5解密网站解密即可,其中有一个少一位的在首位补上0

注意:#int(‘0x’+n.hexdigest(),16))是将一个十六进制字符串(添加了’0x’让其变成了十六进制)转成十进制

0x13 流浪者

解开压缩包,是一个exe,运行,发现需要输入字符串然后点击验证按钮

放入IDA分析,在import里寻找getwindowstext函数,果然有

image-20201103155558866

找到对应调用的函数,可以看到对输入的字符串进行了一些操作

image-20201103155618140

跟下去看sub_4017F0,看到是根据变换后的字符串,然后再和aA这个数组进行变换,因为是dword类型,是四字节一位的,所以a1+4*v4就相当于a1[v4],变换完后和对应字符串比较

image-20201103155652535

aA这个数组如下:

image-20201103155847933

那么我们就可以编写脚本,最终可得到flag,其中对j判断的0,9,10等数字就是从字符串第一次变换里得到的范围

image-20201103161208429

第一页题目完成:

image-20201103160209798