上海市赛初赛 两个简单题拿了三血,还摸了两题Misc,最开始比赛没沉下心还是浪费了一些时间,感觉应该能更好的。近期来打的比较爽的一次比赛。 两题逆向都0解,后面也没深究了...感觉不如Misc Reverse exEXE 这边一个beingdebugged反调试,nop lpAddress里面一个rc4 sub_401535是base64,所以就是RC4+base64,直接cyberchef解密就行 encrytor 大致流程:获取固定的DateTime 16574669,然后获取当前时间,并转换成10进制的Dword数组,获取分钟和秒钟相乘,将获得的数转换为字符串,然后经过SHA256加密,得到的值作为RC4的key对flag.txt进行加密,输出到flag.txt.enc中 关键函数: 出题时间可以通过文件修改时间查看 考虑到程序运行时间,最后取的是33*41=1353 rc4解密即可 flag在哪? 保存了一些函数的地址,重命名一下 动调到这里 进去p一下,下面call的analyse有问题,nop掉然后看汇编即可 可以看到是有一个表,然后nop掉的位置是

CTF 6 天前

DLL注入 通过DLL注入可以对其他进程进行hook/热补丁/修复BUG,同时也是渗透其他进程的有效方法。 DLL被加载到进程后会自动运行DIIMain()函数,用户可以把想执行的代码放到DIIMain()函数,每当加载DLL时,添加的代码就会自然而然得到执行。利用该特性可修复程序Bug,或向程序添加新功能。 本篇博客将使用Inline Hook和DLL注入技术实现控制程序执行流 DLL注入流程 使用MS编译dll动态链接库后,可以通过一些常见的方式进行DLL的注入: 创建远程线程(CreateRemoteThread() API) 使用注册表(AppInit_DLLs值) 消息勾取(SetWindowsHookEx() API) 通过这些方法编写注入程序,然后对写有Inline Hook逻辑的DLL程序进行加载并且注入进目标进程 代码编写 DLL编写 DLL加载到进程后会运行DllMain()函数,通过这个特点,我们可以修改上一篇博客中的Inline Hook代码为如下代码 其中,DllMain()参数中的ul_reason_for_call与之前TLS_Callback学习

Win API逆向 反调试, Python字节码 ,OLLVM rc4 换表base64 贪玩ctf TlsCallback_0有个Isdebuggerpresent反调试 直接nop就行 这边messagebox有个小技巧,把中文显示出来,选这个直接显示中文 非常的方便 通过中文定位到关键代码发现有个加密 往下翻可以看到可疑加密函数 进入后可以发现频繁调用sbox进行加密操作 并且有两个sbox 猜测为aes 实际动调后发现256字节的两个sbox 回到前面先把account解出来 acc = [0x04, 0x1F, 0x1F, 0x1E, 0x43, 0x4B, 0x43, 0x45, 0x44, 0x00, 0x16, 0x10, 0x55, 0x17, 0x12, 0x73] for i in range(len(acc)-1): acc[i] ^= acc[15] print(chr(acc[i]), end='') print(chr(acc[15]), end='') #wllm08067sec&das 然后拿到

CTF 2022-10-31

前言 长城杯决赛的逆向题目 感觉还是有点意思的 这种读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