(见证自己的成长历程,也希望可以提供解题思路的参考,帮助别人)
目录
-
easyre
(1)把文件拖到ida64里,一打开就看到了flag
(2)也可以找到main函数
按f5找到伪代码,在里面看到flag
(3)还可以在刚打开的界面按shift+f12
在这里看到flag
2.reverse1
在ida打开后按shift+f12
看到这样有关flag的东西,可以按这个形如flag的{hello_world}进入这里
发现{hello_world}被黄色部分的东西调用,双击进去看对其有关的操作
进入汇编代码视图,按f5查看伪代码(更直观)
这是输入flag,把str2和flag进行比较,相同就输出.....right flag,但红框部分对str2进行了操作,将其中所有o(ASCII码111)换成了0(48)
所以是输入的flag和{hell0_w0rld}进行比较
所以flag就是{hell0_w0rld}
3.reverse2
和第二题一样,都是字符串的替换,用ida打开,类似的操作找到伪代码发现
只不过这里是将i和r替换成1
点开flag,进入一个界面,发现flag是{.......如图}
所以替换之后答案应为
flag{hack1ng_fo1_fun}
4.内涵的软件
用64打开看伪代码时提示用不是64的ida打开
所以换32ida,之后发现这个
flag{49d3c93df25caad81232130f3d2ebfad}
直接提交花括号里的东西,就正确(不过并没有看很懂)
5.新年快乐
打开文件查壳,发现有upx壳
在工具文件夹的目录下输入upx -d 文件名,进行脱壳
脱完壳用ida(不是64)打开,看到happynewyear!样的字符,点开查伪代码看到它就是flag
strcpy:接收输入,赋值给逗号后变量名。
strncmp:比较,第三个为比较的长度。
所以flag{HappyNewYear!}
6.xor
什么壳也没有,ida64打开
找出main函数f5看伪代码
memset
代码是将输入字符串和global进行比较,第一个框是判断输入字符串长度是否为33,所以flag长度应为33。第二个框是将输入字符串的每一项与前一项进行异或运算,并将运算结果取代该项,直到最后一位(注意这里是从i=1开始运算的,也就是索引为1,即第二项,第一项不变,每循环一次,i+1,先把i与33比较大小然后再加1,因此先进行第32次操作,再加1,然后再停止,第一项不变化)
所以global是flag每一项与前一项异或运算后的结果,由gobal可倒推出flag
科普小知识:
若 x ^ y = z(^为python中异或符号),则
y ^ z = x
x ^ z = y
所以由此思路倒推。双击global查看它的值,发现它是这样
有数字有字符串,需要手动调整一下
注意这里不带引号的数字就是整数,而在""中的数字和字母都是字符串,要挨个分开,每个算一个字符,而这里的h是16进制的意思,没有实际含义,不带”“的h前是十六进制的整数,需要手动转变成正常的样子
最后面的,0表示内容结束,没有实际含义,也不是global的内容
所以最终在python中打出global是这样
这是Python脚本供参考,运行得到flag
flag{QianQiuWanDai_YiTongJiangHu}
7.helloword
下载题目是一个apk文件,apk文件是安卓系统中的可执行文件(应用程序),直接放进ida里打开,不过记得要选ADK的那个(第二个)
打开按shift+f12查看字符串,往下拉(f开头附近)找到flag
flag{7631a988259a00816deda84afb29430a}
reverse3
使用pycharm的base64模块的decode时,记得语法规范使用base.b**decode()函数,标明是base几的解码
SimpleRev
注意这里的优先级为先加法运算再整体异或,不要弄错了 所以写出来的脚本是这样的
luck_guy
还是要注意ida里的字符串都是反序的
被嗅探的流量
JustRE
看main函数看不懂,一堆粉色函数名(c++中的函数名)
按shift+f12查看字符串列表,发现类似flag的
点进去查看伪代码
第14行是输出一个字符串,两个%d处的内容分别被后面的19999,0替换
所以flag是flag{1999902069a45792d233ac}
findit
是apk文件(安卓逆向),用ApkIDE打开
找到MainActivity.smali文件,发现一串字符串,用脚本把ascii码变成字母
发现pvkq正好偏移10位就对应flag,所以用凯撒密码解码得flag
简单注册器
pyre
.pyc文件是.py文件编译后的文件,用.pyc在线反编译网站反编译出py脚本,观察脚本为加密后比较,写脚本找到flag
刮开有奖
复杂伪代码可以直接改造成脚本运行出flag
伪代码改c脚本小tips:把*(_DWORD*) 删掉,然后将各种基址+偏移的表示也换成数组的寻址
tips:好好学汇编和c吧!
CrackRTF
官方文档:ALG_ID (Wincrypt.h) - Win32 apps | Microsoft Learn
[2019红帽杯]easyRE
前面有坑,在程序执行完后的位置发现一串数据被同一处地址调用(x查看引用)
点进去看
v1和v4完全相等,if前半段是对v1低位异或,HIBYTE函数的作用是对v4(也就是v1)的高位(后8位)异或,也就是说v1的最低位和最高位分别和byte_6CC0A0的前四位异或得到f和g,所以猜测v1是一个数组,对两串数组进行操作得到flag
LOWORD()得到一个32bit数的低16bit
HIWORD()得到一个32bit数的高16bit
LOBYTE()得到一个16bit数最低(最右边)那个字节
HIBYTE()得到一个16bit数最高(最左边)那个字节
在for循环中找到操作方法,那先用if里的条件算出v1,再根据for循环内容写脚本算出flag
flag{Act1ve_Defen5e_Test}
[WUSTCTF2020]level1
i & 1这里是判断奇偶的意思,即可以理解为i % 2
写脚本逆出来
flag{d9-dE6-20c}
[ACTF新生赛2020]usualCrypt
点进去看到加密和比较函数,点入加密函数看到形如base64加密,但注意base64的格式,这里在返回值仍有一处函数操作,点进去发现是大小写转换
点进比较函数得到加密后、大小写转换后的密文zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9
转换一下ZmxhZ3tiGNXlXjHfaDTzN2FfK3LycRTpc2L9
再看base64加密函数,发现在加密操作上面还有一个操作
byte_40E0A0里是base64的编码表,上面的操作sub_401000点进去发现是对编码表的一个更改操作
就是位移,这里要注意result++整体的值还是result本身,result++就是先返回result再result+1
所以这里的索引下标还是result而不是result+1
注意检查常见加密(比如base64的格式,看看里面有没有被魔改,不然会被浪费时间)
[HDCTF2019]Maze 反汇编-花指令处理
参考链接https://www.cnblogs.com/Cat-opdog/p/15704234.html
另外也可以用如下方式修改程序并运行(不用创建函数了,不然新生成的代码段无法被ida识别,ida也不知道开始反汇编的位置)
IDA修改exe并保存运行:
IDA修改exe并保存运行_ida怎么编辑exe_大灬白的博客-CSDN博客
IDA出现“sp-analysis failed”和F5无法反编译的解决方法
IDA出现“sp-analysis failed”和F5无法反编译的解决方法 - 爱码网
原理贴:IDA反编译失败:positive sp value has been found
原理贴:IDA出现"sp-analysis failed"和F5(反编译)失败IDA出现"sp-analysis failed"和F5(反编译)失败_Yuri800的博客-CSDN博客
点进去看两个线程的函数
这里可以看到有两个锁,waitforsingleobject 然后其实分析时不需要注意特别多就是看到sleep这个函数,是冻结这个线程100毫秒这样一个线程就可以等到另一个线程运行好,避免出现一个1线程重复运行的情况,说到这里,可以知道这个代码的运行就是两个线程不断交替,即单数不变双数加密,且一共有30位从索引29倒着来,至此写脚本解密。因为密文只给了29位对比,第30位多解,为E时过:ThisisthreadofwindowshahaIsESE
[MRCTF2020]Xor
ida报错函数无法分析
原因是因为IDA不能正确识别这个call的参数,或者是参数出错。
解决办法:1. 按空格,找到出错地址
2. 双击进入函数,然后退出再F5,恢复正常
之后即可正常f5查看伪代码
[GWCTF 2019]xxor
进入sub_400770函数(比较判断),看到
用python跑方程,z3
z3的简单使用的脚本及教程网站:Python_Z3_python z3_C4cke的博客-CSDN博客
跑出来了加密之后的密码
然后从上面看输入开始逆,注意这里是看不出来输入的长度,脚本跑出来的结果是18位的(大部分想要看长度只能通过check()这种专门的函数)
有一个位移操作,用c语言写脚本比较好,直接复制粘贴,for循环里的内容记得反着来,脚本得到
666c61677b72655f69735f6772656174217d
这一串
直接在线16进制转换可得flag,或者用脚本进行大小端转换
得到flag{re_is_great!}
!获取数的时候,注意几个一组,然后从下往上组合(注意是小端存储)
这里unk_601060是Key的地址,它的值其实是[0002,0002,0003,0004](注意是小端存储,每一组要反着来读取)
[FlareOn4]IgniteMe
v4为函数sub_401000()的返回值,下面的加密函数用v4对输入的字符串进行加密,所以先从sub_401000()函数得出v4的值
__ROL__()函数:循环左移函数,第一个数是循环左移的值,第二个参数是循环左移的位数,最后再整体逻辑右移
即将0x80070000向左循环移动4位,即× 24(相当于十六进制向左移动一位),得到0x00700008。 然后再右移一位得到0x00700004。还要注意到return(int16),即取十六进制的后两个字节。 故v4=0x0004
看wp遇到未知的函数可以从汇编看出函数操作的内容
一般eax里面会存放返回值,一样可以看出移位后得到v4
(还有动调跑过这个操作后查看ax的值的(返回值是int16所以只看16位,也就是ax),感觉非常方便)
[FlareOn6]Overlong
打开发现一个加密函数,点进去
是对Text的前a3,也就是前28位进行加密,但是Text有128位
所以加密长度不够长,只加密了前一部分,所以打开程序只跑出了前一小段解密出的字符串
更改程序把这里的1C改成80,即加密的操作循环28次改成128次,然后点应用进程序,再程序打开得到
当然上网搜wp说这样也有弊端
[FlareOn3]Challenge1
是一个base64改编码表的很常规题,不过上网发现了一个很新鲜的脚本
import base64
import string
str1 = 'x2dtJEOmyjacxDemx2eczT5cVS9fVUGvWTuZWjuexjRqy24rV29q'
string1 = "ZYXABCDEFGHIJKLMNOPQRSTUVWzyxabcdefghijklmnopqrstuvw0123456789+/"
#更改后的密码表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
print(base64.b64decode(str1.translate(str.maketrans(string1,string2))))
挺高级,没见过,有空可以用用
BJD hamburger competition
Unity题型
看出应先将代码将字符串先用sha1解密,然后再用md5加密
检查md5()函数发现是以'X2'形式输出,并且只输出前20位,所以flag只取加密结果的前20位。
X2是标准化输出,这里是将字符串转化为两位十六进制输出的格式
ToString(“X2”) 为C#中的字符串格式控制符X为 十六进制 2为 每次都是两位数比如 0x0A ,若没有2,就只会输出0xA 假设有两个数10和26,正常情况十六进制显示0xA、0x1A,这样看起来不整齐,为了好看,可以指定"X2",这样显示出来就是:0x0A、0x1A。 (由此知是大写的字母)
flag{B8C37E33DEFDE51CF91E}