Xctf进阶刷题-1
0x01shuffle
IDA分析即可看到flag
0x02 reversing-x64elf(python二维数组)
IDA分析关键函数
可以看到是对输入的值进行了sub_4006FD函数操作然后进行判定
进入函数查看,可以看到是一个计算操作
编写脚本即可得flag
注意:python中二维数组的编写
0x03 guess-the-number(jar包逆向)
是一个java程序,直接解压jar包,查看.class源码,可以看到是对两个字符串进行操作
一开始想要用python编写脚本的,但是xor函数涉及到了Biginter,所以直接改下代码用Java跑
0x04 easyre(python异或)
IDA分析关键函数,输入字符串为v7,长度为24,并且做了以下操作,其中unk_402158是已知的数据
编写脚本即可跑出flag
注意:Python中异或要加个括号,不加会先运行6-1
0x05 re-for-50-piz(mips)
IDA分析,发现和以往的代码都不太一样,载入的时候IDA也提示是MIPS
参考:https://blog.csdn.net/qq_42967398/article/details/94845416
0x06 dmd-50
IDA分析关键函数,要求输入Key的值
可以看到输出,所以需要进下面的判定
所以输入要等于41里的值,将41的值拖出来用Md5解密即可
0x07 parallel-comparator-200(爆破)
直接可以看源码分析:
所以编写一个脚本就可以了
注意:由于生成的是随机数,所以需要爆破一下
0x08 secret-galaxy-300(运行时堆栈中)
这个题比较神奇
主函数:看到调用了fill和print
fill函数:给一堆变量赋值了
打印出这些值
动态运行看看:
也没有什么输出也没有什么flag的信息
但是在动态调试的时候在堆栈中意外发现了flag
0x09 srm-50(十六进制转字符串)
IDA分析关键函数
可以查看到410A80等的值,十六进制转字符串即可,最终可直接看出flag
0x0A simple-check-100(linux动态调试)
IDA分析关键函数,是对输入的Key进行一个check操作,然后会对v8运行interesting_function
check函数:
interesting函数:可以看到是v3和flag_data做异或
Flagdata:
有点复杂,选择动态调试,想看看直接绕过输出,结果是一堆乱码
最后得知需要在Linux下进行动态调试,即可得到flag
0x0B Mysterious(atoi函数)
IDA分析关键函数,可以看到只要知道v5的内容就可以了
一开始去分析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
0x0D re1-100
IDA分析,关键函数:
可以看出输入就是bufWrite
所以输入字符串的长度为42,第一位和最后一位分别是{},前十位是53fc275d81,后十位是4938ae4efd,最后经过一个混淆,要等于下面那个字符串
查看混淆的代码,就是分块处理了下各个字符串,换了下位置
最终换回来就得到flag了
0x0E answer_to_everything
IDA分析关键函数
所以只要输入42,就可以得到一串字符:Cipher from Bill \nSubmit without any tags\n#kdudpeh
根据题目提示sha1加密和不需要加tag,变化一下就可以得到flag了
0x0F elrond32
0x10 tt3441810
0x11 re2-cpp-is-awesome(dword/dd)
IDA看看
这个是主函数
可以看到sub_400B56函数:
和sub_400B73函数
所以我们得知要满足判定条件
我们可以看到off_6020A0和dword_6020C0
那么我们只要编写脚本,满足判定条件即可
注意:dword代表是4个字节一位,align8代表8字节对齐,所以在0x24和5之间是有一个0的,汇编中dd代表4字节,dw代表2字节,db代表1字节
0x12 re4-unvm-me(python3的int()函数和md5加解密)
是个后缀pyc的文件
直接拖进软件解出源码
只要将md5s中的数字转成十六进制后找md5解密网站解密即可,其中有一个少一位的在首位补上0
注意:#int(‘0x’+n.hexdigest(),16))是将一个十六进制字符串(添加了’0x’让其变成了十六进制)转成十进制
0x13 流浪者
解开压缩包,是一个exe,运行,发现需要输入字符串然后点击验证按钮
放入IDA分析,在import里寻找getwindowstext函数,果然有
找到对应调用的函数,可以看到对输入的字符串进行了一些操作
跟下去看sub_4017F0,看到是根据变换后的字符串,然后再和aA这个数组进行变换,因为是dword类型,是四字节一位的,所以a1+4*v4就相当于a1[v4],变换完后和对应字符串比较
aA这个数组如下:
那么我们就可以编写脚本,最终可得到flag,其中对j判断的0,9,10等数字就是从字符串第一次变换里得到的范围