CTF逆向-[watevrCTF 2019]esreveR-看似复杂流程,发现核心逻辑,按64位架构导出栈中和寄存器中的值得到结果

CTF逆向-[watevrCTF 2019]esreveR-看似复杂流程,发现核心逻辑,按64位架构导出栈中和寄存器中的值得到结果

来源:https://buuoj.cn/

内容

附件:https://pan.baidu.com/s/1CL9SAiLOT6Y1aPuVq1tYOw?pwd=hsd5 提取码:hsd5

答案:watevr{esrever_reversed_youtube.com/watch?v=I8ijb4Zee5E}

总体思路

用ida打开发现默认是按com加载,但该文件是elf文件,故选按elf加载

发现大量函数,但是都不涉及input,暂时忽略

找到判断flag的地方,发现是逐个判断数值是否相等,导出栈中所有的值得到结果

导出寄存器中的值,与上一步结果拼接

详细步骤

  • 查看文件内容

    • CTF逆向-[watevrCTF 2019]esreveR-看似复杂流程,发现核心逻辑,按64位架构导出栈中和寄存器中的值得到结果_第1张图片
    • 使用ida64打开,按elf加载
  • 发现几个函数,逐个点进去查看

    • CTF逆向-[watevrCTF 2019]esreveR-看似复杂流程,发现核心逻辑,按64位架构导出栈中和寄存器中的值得到结果_第2张图片
  • 这些函数的计算都比较简单,但是都和v_input没有关系,关注到输入和判断的地方。

  • 发现是通过f_encode函数判断以后就直接输出了

    • CTF逆向-[watevrCTF 2019]esreveR-看似复杂流程,发现核心逻辑,按64位架构导出栈中和寄存器中的值得到结果_第3张图片
  • 进入f_encode发现有个f_check函数,此时v_input作为最后一个参数传入,继续跟进。

    • CTF逆向-[watevrCTF 2019]esreveR-看似复杂流程,发现核心逻辑,按64位架构导出栈中和寄存器中的值得到结果_第4张图片
  • 这里直接对v_input与每个参数进行值判断,则我们在这里下一个断点。

    • CTF逆向-[watevrCTF 2019]esreveR-看似复杂流程,发现核心逻辑,按64位架构导出栈中和寄存器中的值得到结果_第5张图片
  • 其运行到断点出以后栈中是各个参数的值,寄存器中是前几个参数,分别是rdirsirdxrcxr8r9

    • CTF逆向-[watevrCTF 2019]esreveR-看似复杂流程,发现核心逻辑,按64位架构导出栈中和寄存器中的值得到结果_第6张图片

    • 这里是因为在x64汇编架构中

      • X64汇编

        64位CPU有16个通用寄存器,寄存器存放8个字节数据,它们名称分别为:

        rax,rbx,rcx,rdx,rsi,rdi,rsp,rbp

        r8,r9,r10,r11,r12,r13,r14,r15

        32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数。rax作为返回值。

        64位没有栈帧的指针,32位用ebp作为栈帧指针,64位取消了这个设定,rbp作为通用寄存器使用。

        rax 作为函数返回值使用。

        rsp 栈指针寄存器,指向栈顶

        rdi,rsi,rdx,rcx,r8,r9 用作函数参数,依次对应第1参数,第2参数。。。

        rbx,rbp,r12,r13,r14,r15 用作数据存储,遵循被调用者使用规则,简单说就是随便用,调用子函数之前要备份它,以防他被修改。

        r10,r11 用作数据存储,遵循调用者使用规则,简单说就是使用之前要先保存原值。

  • 我们复制栈顶的值07FFDEB2D83F8并在汇编窗口中按g键跳转到这个地方,按*键将此处前足够多个(比如500个)转换为数组,得到栈的值

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xY2p0amv-1651905271987)(https://raw.githubusercontent.com/serfend/res.image.reference/main/image-20220507142527231.png)]
  • 按shift+e导出这些值,使用python进行处理

    • data = '7B0000000000000065000000000000007300000000000000720000000000000065000000000000007600000000000000650000000000000072000000000000005F00000000000000720000000000000065000000000000007600000000000000650000000000000072000000000000007300000000000000650000000000000064000000000000005F0000000000000079000000000000006F00000000000000750000000000000074000000000000007500000000000000620000000000000065000000000000002E0000000000000063000000000000006F000000000000006D000000000000002F00000000000000770000000000000061000000000000007400000000000000630000000000000068000000000000003F0000000000000076000000000000003D000000000000004900000000000000380000000000000069000000000000006A00000000000000620000000000000034000000000000005A0000000000000065000000000000006500000000000000350000000000000045000000000000007D00000000000000A0872DEBFD7F0000C291139AFFFFFFFFD5B3BF5C000000002D68F2C7FFFFFFFFC20000000000000016867D4200000000A0872DEBFD7F0000160000000000000005AF41000000000077000000000000006100000000000000740000000000000065000000'
      data = bytearray.fromhex(data)
      data = data.replace(b'\0',b'')
      print(data) // bytearray(b'{esrever_reversed_youtube.com/watch?v=I8ijb4Zee5E}\xa0\x87-\xeb\xfd\x7f\xc2\x91\x13\x9a\xff\xff\xff\xff\xd5\xb3\xbf\\-h\xf2\xc7\xff\xff\xff\xff\xc2\x16\x86}B\xa0\x87-\xeb\xfd\x7f\x16\x05\xafAwate')
      
    • 复制中其中的{esrever_reversed_youtube.com/watch?v=I8ijb4Zee5E}作为flag后部分

    • 再拼接寄存器中的值 di si dx cx r8 r9 ,77 61 74 65 76 72 = ‘watevr’

  • 故最后答案为 watevr{esrever_reversed_youtube.com/watch?v=I8ijb4Zee5E}

其他文档

  • CTF逆向-常用的逆向工具 提取码:pnbt
  • B站教程中国某省队CTF集训(逆向工程部分)
    • 中国某省队CTF集训(逆向工程部分)(已授权)(一)
    • 基础加密方式例如 XXTEABase64换表
    • Python库 Z3 方程式、不定式等的 约束求解
    • 基础的假跳转花指令(脏字节)
    • 非自然程序流程
      • 扁平化程序控制流
      • OLLVM程序流程(虚拟机壳) 很难一般不考
      • ida里面按X键跟踪,寻找所有Tyw的引用(即类型是写入的),通常就是关键位置
    • 中国某省队CTF集训(逆向工程部分)(已授权)(二)
    • ollydb动调去壳,upx为例子
    • python的逆向和自定义虚拟指令
      • 使用pycdc 提取码:dorr 解密python编译的exe或者pyc
      • 逐条去解析用py字典手动实现的指令调用
      • C++编译的程序的逆向
    • 中国某省队CTF集训(逆向工程部分)(已授权)(三)
      • 简单模运算加密
      • base58 寻找一下特别大的数,这种数通常是算法的标识,或者ida7.7版本以上自带的find crypt插件ctrl+alt+f
      • 常见的关键位置是有新的内存分配的地方通常是关键地方,或者函数中间突然return的地方也是
      • 迷宫题 注意绘制出来就好
      • 动调题
        • 注意观察会执行的反调试分支,例如出现int 3,需要跳过去
  • 基本知识
    • 大小端序

更多CTF逆向题通用性做法和常用工具下载参考该博文内容:CTF逆向Reverse题的玩法

相关逆向CTF题

  • Python

    • Python反汇编方法 Python的pyc字节码反编译反汇编相关知识
    • [CTF逆向-羊城杯 2020]Bytecode-WP-Python字节码反编译
  • 远程调试汇编

    • CTF逆向-[watevrCTF 2019]Timeout-WP-远程调试和修改程序当前运行位置RIP
  • 流程控制

    • CTF逆向-Dig the way Interesting Pointer-通过栈溢出方式覆盖变量以达到修改执行流程的目的
  • 逆向思维

    • [CTF逆向-NPUCTF2020]Baby Obfuscation-逆向思维编写脚本以及函数含义的逻辑理解
    • [CTF逆向-MRCTF2020]EasyCpp - C++类型的逆向通用操作方法
    • [CTF逆向-SUCTF2018]babyre-WP-cpp简单迭代并按表输出值的爆破
  • 安卓

    • [CTF逆向-网鼎杯 2020 青龙组]bang-安卓脱壳逆向:frida-dexdump导出得到源码
  • 虚拟机

    • [CTF逆向-GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用
    • [CTF逆向-WMCTF2020]easy_re-WP_虚机-perl加载器截取
  • 反调试和SMC

    • [CTF逆向-SCTF2019]creakme-WP-基于AES加密算法下的保护:反调试及except_handler和SMC
    • CTF逆向-[FlareOn1]Shellolololol-栈上执行,多层smc的动调得到最终结果
  • 加密

    • Python 基于pycryptodome,实现对AES、DES、3DES、RSA等常用加密算法的使用,文末附各种加密的源码示例
    • [CTF逆向-FlareOn2]very_success-WP_rol循环位移加密
    • base64换表
      • [CTF逆向-CISCN2018]2ex-WP_mips-32架构以及base64换表
      • [CTF逆向-De1CTF2019]Re_Sign-简单脱壳和base64换表编码的深度算法跟踪
  • 花指令

    • [CTF逆向-SCTF2019]babyre-WP_简单去花指令和流程识别
    • CTF逆向-[MRCTF2020]VirtualTree-恒成立的jz花指令去除及smc变换原执行流程在二叉树上的应用,通过逆向思维编写脚本以解决
  • 流程混淆的扁平化处理

    • [CTF逆向-RoarCTF2019]polyre-WP_控制流扁平化去混淆idcpy去指令

    • CTF逆向-[SUCTF2019]hardcpp-使用优化过的deflat.py处理混淆的控制流并将cpp的lambda解析得到实际处理逻辑

你可能感兴趣的:(CTF-逆向,安全)