SY的ctf之旅

发布时间 2023-12-20 00:21:08作者: More_ci

1、 ida

shift f12---跳转string

ctrl x------交叉引用

shift e-----数据导出

a-----------转化为字符串数组

\------------去除灰色的变量解释

/------------添加注释

N-----------重命名

ctrl z------返回上一步,撤回原行为

Y-----------重组数组(更改变量类型)

*(shift+8)------------构建数组(记得取消dup格式)

      

 

u-------------取消定义

 

2、pyc

形如%1f要将%改成\x

for后:换行要tab

3、凯撒密码

可带入数值判断偏移量,解密(注意大小写的条件可能不同)

4、RSA

ctf工具中公钥分析的应用,需含begin end
x64dbg
按如图所示找到程序入口点(OEP)

 

选中(OEP)后按 shift d-------调用字符串界面

5、汇编代码转换成二进制可执行文件

   linux下gcc安装

   sudo apt install gcc

   gcc -o name(可执行文件名)  name.s(汇编代码)

6、打包

    (1)upx使用

        upx程序路径于windows终端打开,upx.exe  需脱壳程序地址与名称

        wsl下直接upx -d -文件名  注:原程序(文件)直接脱壳,无新文件产生。

    (2)pyinstxtractor.py使用

        用于脱pyinstaller

        脚本路径与windows终端打开,python3 pyinstxtractor.py 需脱壳程序地址与名称

        脱壳后文件将于pyinstxtractor.py路径下生成

        pyc文件转py      安装.pyc.py所使用的库uncompyle6,这里用了清华源并且指定使用了3.9.0版本库

                pip install -i https://pypi.tuna.tsinghua.edu.cn/simple uncompyle6==3.9.0

               找到测试脚本.pyc所在的文件夹,cd 到此路径下,并输入以下打包命令:

               uncompyle6 -o 测试脚本.py 测试脚本.pyc

7、加密函数

      

               搜索一下(CryptCreateHash)是哈希算法的意思,且0x8004表示sha1方法

       这些粉红色的东东是Windows API

8、ida换编码

    类似这种输出一个&byte_的,有可能是因为有中文。

    Option---general---strings---Default 8-bit由UTF-8换成另一个,重启ida,注意load exsite,id64存在编码方式不变。尝试(1)不重启,按f5.   (2)选中对应位置(注意带上‘0’)按a,此时才能把中文带到伪代码中,不加‘0’可能带不到伪代码中。

    有的中文换编码后也没发现,找到对应位置选中,右键即可看到内容,如图

9、花指令---jmp

    选中此句,点u

    找到多出的语句,此题为e9那句

 

    直接把e9那句nop掉,再按c转换成c代码

    最后在main函数前面选中点p重新定义成函数

 

    定义后结果

    之后就可以反编译啦

10、dup命令

      8  dup(0),分配一段空间,由8个0组成 

               

      故数组的后8个元素均为0,而且末尾不存在8这个元素。

11、ida中元素转换为c语言数组常见错误

     在clion中用h后缀表示的十六进制会报错,更不能加上单引号使其强行正确,应转化为0x前缀格式

    字符型:先全选R键转换,再复制粘贴;

    整型:shift  e提取,再复制   (还有一个好处就是,无需全选,只需选中对应行,shift e可以提取该数组的所有值)

    

 12、逆向中py脚本的编写

    (1)字符串:

         一维:a=‘            ’

         二维:b=[”    “,”   “]

    (2)将字符转换为ASCLL码值

        ord()

     将ASCLL码值转变为字符

        chr()

    (3)py中整除符号://

    (4)print()会自动换行,不换行需加上print('',end=' ')

13、ida识别错误转换问题

    

 

    很明显是数组指针类型的v3,故把__int64改成char *

    后面的v3[i%3]+2*(i/3)也将改变成二维数组的类型

 14、迷宫:

    找到迷宫(二维数组看成一个迷宫,三维数组看成多个迷宫)(自定义数组根据题目含义分析)

    (1)直接convert---convert string----复制该十六进制数据,在ida对话框中输出,即可得到字符

    (2)先按u取消定义,后将其改为Byte型,根据需要改变类型Byte、word、dword

       

      再按*重组数组,一般可以知道迷宫的行数或者列数,估计另一个,相乘得到数组大小。

      再convert  to  Byte或word dword

 15、linux文件远程调试

    Debugger---process options 

    Application 路径加文件名(linux虚拟机)(可以只在这行加文件名,让linux自动检测,其他行不写任何东西)

    Input file  路径加文件名(Linux虚拟机)

    Directory 路径(Linux虚拟机)

    Hostname  虚拟机ip

 16、混淆

    调试!!!

    让程序跑起来,之后输入内容,在内容位置下断点(下断点后按ese返回),调用该内容时便会停止,分析该处对输入内容的加密!

17、z3的使用

    第一步 创建变量

      import z3  
      x=z3.Int('x')      或x,y,z,e,f=z3.Ints("x y z e f")

    第二步 创建求解器

      solver=z3.Solver()

    第三步 添加约束

      solver.add()

    第四步 求解方程

      if solver.check()=z3.sat:
              print(solver.model())    \\或者 m=solver.model()    print(m[x]),print(m[y])
                           \\注意其中的m[x]与m[y]不是一个数字类型,而是一个字符串形式的数据,不能直接进行加减运算。
                            \\m[x].as_long()可进行加减计算
                            \\转换成字符串也要chr(m[x].as_long())
          else:        print("该方程无解")

18、D810插件使用

    shift+ctrl+D启动
    

    启动后选择对应的混淆,这里是ollvm混淆,故选择此项,点Start,之后就可以欢快的按F5啦。