前言 长城杯决赛的逆向题目 感觉还是有点意思的 这种读TracerPid的反调试和BUG()内核异常跳转以前没见过 比赛的时候疯狂搜索 也没个解决办法,后来是自己试着调试调试把这个反调试过掉了 然后大概摸清楚了题目的运行逻辑。总的来说这题还是很有趣的。直接看题吧 easy_re 首先我们拿到题目,进来是start函数,这边可以看到main,init 点进去init可以发现加载了三个函数,依次点进去看 第一个是一些奇怪的操作,但是可以看到一个函数,这个是检测反调试的 第二个是一个TracerPid反调试加BUG()异常 第三个不知道是啥玩意,感觉没啥用 经过动态调试,f8断点可以发现程序是先执行init for循环里面的第一个函数,第二个函数,第一个函数里面的那个函数。我们过反调试也很简单,只要在这个位置断点,然后点进cmp左边的,按dddd把里面第一行的pid数字改成0即可 然后进入到第一个函数里面的那个函数,这个其实是检测反调试的,之前被卡在这里卡了好久,一直不懂他是怎么传参的,后面发现其实是和之前运行的那个反调试有关系。把反调试过了之后也就进入主函数正常执行了。 不过这底

CTF 2022-09-27

re1 直接关键词捕捉Tea 那就是tea加密吧 点进tea那个函数里面稍微美化下,可以发现其实是魔改过的xxtea,跑12轮,分了8组。那就直接开逆 改一下现成的脚本 #include<stdio.h> #include"defs.h" #include <stdint.h> unsigned int enc_2[8] = { 0x10BD3B47, 0x6155E0F9, 0x6AF7EBC5, 0x8D23435F, 0x1A091605, 0xD43D40EF, 0xB4B16A67, 0x6B3578A9 }; unsigned int data[8] = { 0xD58F4C91, 0x9A751121, 0xD1F7D6AC, 0x63575833, 0x2A313023, 0xF9750867, 0xB2A9EDA5, 0xD6A7CD37 }; unsigned int data1[8] = { 0x5DFAFC16, 0x3E3D5252, 0x03623808, 0x6B884FEA, 0xE99A75EB

CTF 2022-08-10

babynim 这题比初赛的简单多了我是没想到的...就是符号表也有,复现了初赛的LOADER之后这题没有难度属于是。 ida打开,动态调试到主要逻辑,简单分析,这里验证flag格式 分析可以知道star开头的函数进行了乘法,第一个,第二个参数是input与密文1,也就是一串反着的flag(浪费了我的时间。。。,然后第三个参数是结果。 eq函数进行了比较,可以把最终的密文提取出来,在hello44里面 这里eqeq函数就是对大数进行比较 提取数据出来写个python脚本除一下即可得到flag print(0x1566336316561EDB086701C71C71C7) print(chr(0xa7)) a=0x666C61677B63393461626261652D353263302D346461302D616666312D383839373730353839356337A7 b=0x4732510F4379F99925CF3B2C29EAFA1647B1E897A61BFD7C1D1807478D0E18A1AC9791D6DBB1BD74554FECECC16519CE

CTF 2022-08-10

deeprev 这题非常新颖,直接在elf里面的LOAD段写机器码,加载汇编并且跳转过去执行 最开始其实是常规动调,注意到链接了so文件并且读取了so里面的secret到elf中,那么直接在elf中的secret上面下一个内存读写断点。(这边我给check也下了) 然后运行,可以发现载入so库的时候就完成了加密,等到执行到main函数的时候check已经有值了。 我自己是通过一直f7步入,ida提示eip跳转到非代码段,从而发现了LOAD段藏起来的机器码。仔细看一下ida的注释就可以发现这边复制了so的secret 然后进一步动调加分析可以得到每一片段其实是这样的,每一行第二位是操作码,第一位是偏移地址,第三位是值。动调可以发现有很多重复的这样的片段,并且每一段都把第三行的第三位给第二行的偏移地址,简单理解R_X86_64_RELATIVE,操作码0x8是赋值。 在进一步动调之后发现0xc3操作码是标志下一步跳转进LOAD段执行代码 那么我们其实只需要把所有的机器码提取出来,再扔到机器码转汇编的网站上面解密就行了。 直接复制LOAD段内容,提取机器码 s='' with open

CTF 2022-08-10

IDA for RE插件推荐 这篇可能会持续更新 起因是某开发巨佬群里说让我出个IDA插件合集,那就直接开搞,正好可以水一篇博客涨涨人气( 那不多bb直接进入正题 LazyIDA 链接:https://github.com/P4nda0s/LazyIDA 简化逆向流程 这个插件个人已经用成习惯了,属于是没有这个插件就逆不下去了(开个玩笑。功能可以直接看图,这里简单介绍一下我个人最常用几个的功能 Convert,直接把ida里面数据转换成python list或者c array,而且可以自己选择数据类型,在提取密文的时候就非常的方便。 Fill with NOPs,字面意思,直接把选中的区域全部填充为0x90(不过在其他架构上面这个没用) Paste Data,这个功能非常牛,可以直接在动调的时候把数据粘贴在内存里面,有时候我们解rc4或是异或这种对称加密,直接把密文粘贴到input的内存里面,再断点在解密之后的地方,就可以直接拿到flag。 其他的功能可以看Github链接里面的readme,都挺好用的 Keypatch 链接:https://github.com/keyston

CTF 2022-08-02

蓝帽杯初赛逆向LOADER复现 分析 首先一进来直接开幕雷击 可以看到加载了一个程序在里面,点进unk可以发现MZ开头的数据,直接猜想里面有一个程序。当时第一反应是dump程序出来,但是发现dump出来的东西运行不了,于是直接放弃了。后来经过wjh大佬指点,可以直接动调。于是直接开调 动调这个也可以讲一点,基本上程序进行输入输出的地方肯定是关键函数。这个题要找到关键函数的话,键盘上先多按f8,注意call哪个函数之后程序输出东西了,那么打个断点,然后重新开始程序再f9到这个地方f7进这个call,这样反复,肯定能快速找到主要函数。 例如这边就找到main_0了,然后下面几个call其实点进去看一下就差不多知道了,其实主函数在这里(可以熟练用快捷键n去改一下这些函数名,方便识别。) 那么调到这里之后,可以继续往下走,发现下面一个就是输入数据,这个时候可以点进函数返回的数据下去看一下,可以看到这其实是一个结构体,我们可以选择进入structures创建一个结构体。当然也可以不创建。 这边这一块,点进数据看一下,可以发现其实是检测前五位是不是flag{ 同理在这边也可以发现是fla

CTF 2022-07-11

前言 自己第一次做出来关于rust这方面的逆向题目,真的是体会到了什么叫做 💩 上加 💩 分析 首先拿到题目,题干就说是rustvm,关键这个题还就三百分..现在逆向真是太难了。 先定位到关键函数开始分析,上面的报错不用管,可以看到也是有一堆的东西 这边进去看一下可以知道这几个是干嘛的,配合动调可以知道把输入的东西转成int。这边有些thread线程的东西,含义不明也没关系,不影响接下来的做题,想搞懂这些都是干嘛的还是得动调一步一步走着看,这段代码重复了八次,每次都把 这边是一些输出的信息,这函数类似于printf,不用具体分析 这一块先malloc然后配合动调可以知道把输入的东西都读进去v129了 这一块是把vm的机器码写入,同样可以通过动调得知 下面的case操作,想都不用想,就是vm,这只能自己一个一个分析,配合动调可以拿到所有的机器码。这个真的是又臭又长,而且搭配着一堆_mm_loadu_这种函数,有的时候根本没法看反汇编的代码,我看的时候基本上都是对着汇编直接看的,去理解汇编每个寄存器在干嘛才是最折磨的事情。 这些操作里面有些很好分析,例如and,or,xor这些

CTF 2022-07-07

周六忘了比赛,晚上快六点才拿到题目,看了下感觉能做,研究了下,最后还是可惜,比赛结束了 拿到题目ida打开惯例看一下main 再看看汇编 基本上确定是ollvm了 下面那一堆整齐的是真实块,上面通过分发器跳转才到达真实块执行代码。看到群里有大佬直接通过动调跳转找代码的,那确实是真功夫...脚本小子直接拿deflat.py还原了。 建议放虚拟机里面,装GitHub页面推荐的angr版本 脚本还原之后的样子 这个时候f5已经可以看了 PART1 先看看第一部分的代码,前面到qmemcpy的代码是正常的分配内存和输入输出。后面进行了很长一堆的运算,其实都不用看,其实可以分析出来,前面都是静态的拿现有的进行操作,最后都给了v20,直接断在59行然后拿出v20就行了。 59行之后是一个flag格式比对,把flag里面的内容截取出来放到v22里面 PART2 我们先不看400670这个函数,先看看后面的东西,做游戏题比较多的应该很容易就能看出来这是个迷宫了,拿400670函数对flag内容处理后的数据逐位进行操作(也就是迷宫里面的上下左右)这边其实故意搞复杂了点,把上下弄成加减100,然后

CTF 2022-05-09

几个月之前就有这个想法了,一直拖到寒假,起因还是因为小米平板5上面的圆形指针实在是太拉了,然后做了个magisk模块,又发现magisk模块在其他型号的平板上面会导致卡开机。才准备写个xposed模块 项目地址: https://github.com/Xunflash/SetMiPad5Pointer/ 可以去看看啥的,想着和安卓逆向应该也有点关系,就学了几天xposed(顺带学了下JAVA的反射,安卓动态布局)写安卓APP是真的麻烦啊,我现在水平真的只是停留在啥都懂一丁点,但是懂的都不多。好多东西深入学就会感觉好难,而且三分钟热度 :Coolapk24: 这篇以后再改成详细介绍模块是怎么写出来的吧,感觉自己真的好菜

2022-02-19

W@v3s战队 一、战队信息 名称:W@v3s 排名:9 二、解题情况 粘贴解题图片 三、解题过程 Web 题目一名称 Checkin 直接访问 Burp抓包即可得到flag 关键步骤截图 题目二名称 pppop Pop链的exp: <?php class A1{ public $tmp1; public $tmp2; } class A3{ } class A4{ public $tmp1; } class A6{ public $tmp1; } class A8{ } $a1 = new A1(); $a3 = new A3(); $a4 = new A4(); $a6 = new A6(); $a8 = new A8(); $a1->tmp1=$a3; $a3->tmp2=$a4; $a4->tmp1=$a6; $a6->tmp1=$a8; echo urlencode(serialize($a1)); 这时候会执行echo new $this->tmp1($this->tmp2); 使用Glo

CTF 2021-10-23