题目


丢进Exeinfo PE里面,得到64bit,无壳

丢进IDA pro(x64)里面,找到主函数

代码中有一个花指令:*(unsigned int (__fastcall **)(char *))judge)(input)

  • unsigned int (__fastcall **)(char *):这是一个函数指针类型,指向一个接受char *类型参数并返回unsigned int类型的函数。__fastcall是一种调用约定,它指定了函数参数传递的方式。
  • (*):这表示函数指针的间接引用,即对函数指针judge进行解引用,获取其指向的函数。
  • (char *)judge:这是对函数指针judge的解引用,将其当作一个函数调用,并传递input作为参数。
  • 因此,(*(unsigned int (__fastcall **)(char *))judge)(input)的整体含义是:调用judge指向的函数,传递input作为参数,并期望该函数返回一个unsigned int类型的值

双击judge追踪看看,有的大佬说会双击跟踪不了报错,我的可以双击跟踪

一开始我还没发现有问题,以下内容参考大佬wp

选中public judge,按C,跳出“Directly convert to code?”-->Yes,变成了汇编

把红色区域全部框选起来,按P,试图重新生成function——这里会出现一个红色错误endp ; sp-analysis failed

打开IDA的Options--->General-->Disassembly,勾选“Stack pointer”,打开堆栈指针

发现出现负值,说明我的IDA7.7存在指针错误

我看几个大佬的wp,他们都没有去解决这个指针问题,可能是不影响解题吧,所以我也没去管它

这里放上解决错误的资料:IDA出现"sp-analysis failed"和F5(反编译)失败-CSDN博客

视线回到主函数,在第8行,judge是一个数组,但是在第12行,judge是一个函数指针

从二进制机器码的角度看,可以理解成这个judge函数的每个字节都被异或了

用人话说,这个函数被加密了

解决方式也是参考大佬的wp——使用IDApython脚本解决:file-->script command

大佬的脚本如下:

1 add=0x600b00
2 for i in range(182):
3 PatchByte(add+i,Byte(add+i)^0xC)

但是,我运行会报错,我的IDA没有这个函数,导入了ida_bytes模块也没有用

放下我这边能运行的代码(记得左下角Scripting language选python):

1 import idaapi
2
3 add = 0x600b00
4 for i in range(182):
5 idaapi.patch_byte(add + i, idaapi.get_byte(add + i) ^ 0xC)
  • idaapi.patch_byte函数用于修改指定地址的字节,它接受两个参数:地址和要写入的字节值。
  • idaapi.get_byte函数用于获取指定地址的字节值,它接受一个参数:地址,并返回该地址处的字节值

按一次就可以了,变成下面这样:

选中judge,按C(变成汇编),框选地址B00~BB5,也就是所有的红色区域,按P(重新生成function)

此时可以在左边找到judge函数内容

点进去,F5反汇编

这个代码不难理解,写逆向脚本也不难,但是我这里又犯了一个错

我以为只需要拿v2去异或解题,v3虽然也在代码中,但是后面都没再提及了,我以及单纯就是干扰,或者是没有用的乱码数据

我只用v2运行解题脚本的时候,结果就是一个:flag

我看到这个老开心了,证明我的代码是没有错误的,思路大方向也是没有错误了,但是之后就没有找到其他的东西了

看来看去,还是v3最可疑,单独用v3运行解密脚本,是一堆没有价值可读性的东西

后面看了大佬的脚本,要把v2与v3加在一起

啊?这是为什么??代码里没有体现啊????然后我就去找了资料

双击v2,点进去看看栈

双击v3,也是看看栈

20~1C:5个,刚好对的上v2的长度

1B~13:9个,也刚好对的上v3的长度

有没有发现,v2和v3用的是一块连续的空间啊啊啊

修改后的脚本如下:

 1 s1 = "fmcd"
2 s2=chr(0x7F)
3 s3="k7d;V`;np"
4 key=s1+s2+s3
5 input_str = ""
6
7 for i in range(len(key)):
8 input_str += chr(ord(key[i]) ^ i)
9
10 print(input_str)

运行结果: flag{n1c3_j0b}

BABYRE 【攻防世界】 Reverse的更多相关文章

  1. 攻防世界 reverse 进阶 10 Reverse Box

    攻防世界中此题信息未给全,题目来源为[TWCTF-2016:Reverse] Reverse Box 网上有很多wp是使用gdb脚本,这里找到一个本地还原关键算法,然后再爆破的 https://www ...

  2. 攻防世界 reverse evil

    这是2017 ddctf的一道逆向题, 挑战:<恶意软件分析> 赛题背景: 员工小A收到了一封邮件,带一个文档附件,小A随手打开了附件.随后IT部门发现小A的电脑发出了异常网络访问请求,进 ...

  3. 攻防世界 reverse tt3441810

    tt3441810 tinyctf-2014 附件给了一堆数据,将十六进制数据部分提取出来, flag应该隐藏在里面,(这算啥子re,) 保留可显示字符,然后去除填充字符(找规律 0.0) 处理脚本: ...

  4. 攻防世界 reverse 进阶 APK-逆向2

    APK-逆向2 Hack-you-2014 (看名以为是安卓逆向呢0.0,搞错了吧) 程序是.net写的,直接祭出神器dnSpy 1 using System; 2 using System.Diag ...

  5. 攻防世界 reverse BABYRE

    BABYRE   XCTF 4th-WHCTF-2017 int __cdecl main(int argc, const char **argv, const char **envp) { char ...

  6. 攻防世界 reverse Windows_Reverse2

    Windows_Reverse2   2019_DDCTF 查壳: 寻找oep-->dump-->iat修复   便可成功脱壳 int __cdecl main(int argc, con ...

  7. 攻防世界 reverse BabyXor

    BabyXor     2019_UNCTF 查壳 脱壳 dump 脱壳后 IDA静态分析 int main_0() { void *v0; // eax int v1; // ST5C_4 char ...

  8. 攻防世界 reverse parallel-comparator-200

    parallel-comparator-200 school-ctf-winter-2015 https://github.com/ctfs/write-ups-2015/tree/master/sc ...

  9. 攻防世界 reverse 进阶 8-The_Maya_Society Hack.lu-2017

    8.The_Maya_Society Hack.lu-2017 在linux下将时间调整为2012-12-21,运行即可得到flag. 下面进行分析 1 signed __int64 __fastca ...

  10. 攻防世界 reverse easy_Maze

    easy_Maze 从题目可得知是简单的迷宫问题 int __cdecl main(int argc, const char **argv, const char **envp) { __int64 ...

随机推荐

  1. 【Unity3D】拖尾TrailRenderer

    1 TrailRenderer 简介 ​ TrailRenderer 组件用于实现拖尾效果,可以调整拖尾颜色.时长.宽度等属性,其属性面板如下: Materials:拖尾材质,最好设置为 Defaul ...

  2. 【framework】InputChannel创建流程

    1 前言 IMS启动流程 中介绍了 IMS 在 Java 层和 Native 层的初始化流程,以及创建 NativeInputManager.InputManager.InputReader.Inpu ...

  3. Linux下Mysql的相关配置

    Linux下Mysql的配置 安装 rmp -ivh MySQL-server-4.1.22-0.glibc23.i386.rpm --nodeps rmp -ivh  MySQL-client-4. ...

  4. 《系列二》-- 6、从零开始的 bean 创建

    目录 createBean() 的面纱 createBean() 的承包者: doCreateBean() 总结 阅读之前要注意的东西:本文就是主打流水账式的源码阅读,主导的是一个参考,主要内容需要看 ...

  5. 【Android逆向】frida 破解 滚动的天空

    1. apk 安装到手机中 2. 玩十次之后,会提示 充值 3. adb shell dumpsys window | grep mCurrentFocus 查看一些当前activity是哪一个 是 ...

  6. 项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)

    需求   使用Qt软件开发一个检测cpu温度的功能.  兼容windows.linux,国产麒麟系统(同为linux) Demo   windows上运行(需要管理员权限):     国产麒麟操作上运 ...

  7. zlib开发笔记(一):zlib库介绍、编译和工程模板

    前言   Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库.   zlib库   zlib被设计为一个免费的,通用的,法律上不受限制的-即不受任何专利保护的无损数据压缩库,几乎可 ...

  8. mongodb(2022)

    了解 文档数据库MongoDB用于记录文档结构的数据,如JSON.XML结构的数据.一条文档就是一条记录(含数据和数据结构),一条记录里可以包含若干个键值对.键值对由键和值两部分组成,键又叫做字段.键 ...

  9. python文件加锁模块之fcntl

    # 示例 import fcntl with open('./test.txt', 'w') as f: fcntl.flock(f, fcntl.LOCK_EX) # 对文件加锁,除加锁进程外其它进 ...

  10. django自定义模型管理器Manager及方法

    django自定义模型管理器Manager及方法 自定义管理器(Manager) 在语句Book.objects.all()中,objects是一个特殊的属性,通过它来查询数据库,它就是模型的一个Ma ...