BUUCTF reverse模块的wp

(见证自己的成长历程,也希望可以提供解题思路的参考,帮助别人)

目录

easyre

2.reverse1

3.reverse2

4.内涵的软件

5.新年快乐

6.xor

memset

7.helloword

reverse3

SimpleRev

luck_guy

被嗅探的流量

JustRE

findit

简单注册器

pyre

刮开有奖

CrackRTF

[2019红帽杯]easyRE

[WUSTCTF2020]level1

[ACTF新生赛2020]usualCrypt

[HDCTF2019]Maze 反汇编-花指令处理

[MRCTF2020]Xor

[GWCTF 2019]xxor

[FlareOn4]IgniteMe

[FlareOn6]Overlong

[FlareOn3]Challenge1

BJD hamburger competition


  1. 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}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值