NKCTF RE
NKCTF RELogin System第一部分先运行运行发现要先过一下username才能输入pass,ida看一下,可以发现是一个z3:
from z3 import *def solve_sub_1229(): a1 = [Int(f'a1_{i}') for i in range(16)] s = Solver() s.add(a1[2] + a1[1] + a1[0] + a1[3] == 447) s.add(101 * a1[2] + a1[0] + 9 * a1[1] + 8 * a1[3] == 12265) s.add(5 * a1[2] + 3 * a1[0] + 4 * a1[1] + 6 * a1[3] == 2000) s.add(88 * a1[2] + 12 * a1[0] + 11 * a1[1] + 87 * a1[3] == 21475) s.add(a1[6] + 59 * a1[5] + 100 * a1[4] + a1[7] == 7896) s.add( ...
羊城杯 Ez加密器
羊城杯 Ez加密器第一部分通过查找字符串找到主函数:
看到这里有四个函数,我们一一分析,第一个函数没有看出有什么的特别,我们看第二个:第二个信息量就很大了,首先可以看到两个提示输入,那么下面的两个应该是接受输入的的函数了。
这里sub_140003A20这个函数看的不是很懂,先放一下,后面的sub_140003910这个函数和前面的sub_140003A20函数结构很像,我们动态调试一下这两个函数,动态调试时发现fun1(sub_140003A20)这个函数是验证我们的验证码是否正确,同时这里的fun1他限制了验证码是6位的数字,点进fun1里的a1可以发现:
这里也可以看到这里的两个数据的长度分别是6和40,a000000存储着我们的验证码,那么上面就存储着我们的flag,调试看看:
猜测正确。其实这里也可以把fun1的前半段代码复制下来爆破出验证码的长度,因为fun1中只有len(a1)为6时才能让v3
为1
后半部分的代码时验证输入的是不是字符串,同样可以爆破,动态调试试,当然也可以GPT(大人,时代变了@w@)
第二部分分析完第二个函数,我们看看后面两个:第三个是ba ...
NSSCTF vm_wo
NSSCTF vm_wo第一部分无壳,mac,拖进IDA看看,有一个明显的比较,直接拿到flag最后比较的data
data = [0xDF, 0xD5, 0xF1, 0xD1, 0xFF, 0xDB, 0xA1, 0xA5, 0x89, 0xBD, 0xE9, 0x95, 0xB3, 0x9D, 0xE9, 0xB3, 0x85, 0x99, 0x87, 0xBF, 0xE9, 0xB1, 0x89, 0xE9, 0x91, 0x89, 0x89, 0x8F, 0xAD]
第二部分接着点击myoperate函数看看,读代码发现,这直接告诉我们opcode了,即每一个8字节的十六进制拼接,注意要去掉最后一个因为他只是(v8 + 7)
# hex_string = "020D01011903001A"# # 将十六进制字符串转换为字节列表# byte_list = [int(hex_string[i:i+2], 16) for i in range(0, len(hex_string), 2)]# # 将字节列表逆序# byte_list.reverse()# ...
Hgame 2023 week4 (NSSCTF上下载) VM
本人第一次尝试VM类型的逆向CTF题,若有错误,欢迎指出交流QAQ
Hgame 2023 week4 (NSSCTF上下载) VM第一部分IDA打开,主程序如图:
我们点击第一个qmemcpy里的sub_140001000函数,跟进sub_140001060(第一个)函数:
这里应该是对虚拟机初始化,初始化几个关键值(指向字符串的索引位置,临时存放变量位置,输入的每个值位置等),但是我们并不知道这几个值对应的是什么,所以先放一边。回到主函数,我们看到有一个for循环,应该是最后比较flag的地方
我们将这个数组记为data[i],然后看下面if语句,很明显是最后的告诉我们是否正确的输出,大致分析了一下,接着我们上主菜:分析这个VM的模拟器(sub_1400010B0):
第二部分进入这个函数,我们可以看到一个数组,点进去发现有很多的数据,最关键的是它有一个 != 255,
那么我们可以大胆的猜测这个数组是opcode,那么这个a1 + 24大概就是ip了,我们接着点击下面的函数进行分析:
这里很明显是一个cpu的模拟器,也是这个vm题最重要的部分,我们挨个分析: ...
HgameCTF again!
一,HgameCTF again!第一部分打开压缩包,发现是两个文件:bin1.exe和bin2.pyc,将两个拖进IDA没有发现什么有用的东西,突然注意到bin1的图标是pyinstxtractor的图标,所以猜测这是应该pyc经过pyinstxtractor打包得到的exe,所以解包一下,解包出bin1.pyc拖进010看有一个hint:
他说可以MD5这个文件,用这个文件去解bin2,但是我太菜了,不知道怎么使用这个提示。
第二部分在010看bin2.pyc发现在文件的最后有大量的重复数据
于是我猜测这里是对整个文件进行了异或,而以异或的数据就是重复数据:
a405b5d321e446459d8f9169d027bd92#因为一个数异或上0都是本身,而PE文件最后应该是有大量的0填充
所以我们写一个脚本试试:
def XOR_bin2(input_file,key,output_file): with open(input_file,"rb") as fin: with open(output_file,"wb") ...
SICTF r3 closeme
第一部分打开题目,先找main函数,点进第一个函数中(此时只有几十行代码)发现有不少地方爆红(看网上一些大佬的wp没有讲到这一个,应该是简单没有提),在爆红的地方按TAB进入反汇编窗口,用d + c小连招解决爆红,然后发现代码有400行(QAQ),那只能慢慢分析了。
第二部分发现下面的代码,在大约360行附近的if ( v45 == “combase.dll” )语句处有一个突兀的异或,分析一下发现这是一个hint,解出来:
data = [0x23, 0x11, 0x0D, 0x1B, 0x13, 0x4B, 0x18, 0x04, 0x03, 0x0A, 0x50, 0x08, 0x1D, 0x06, 0x54, 0x16, 0x1A, 0x18, 0x0B, 0x1C, 0x5A, 0x0F, 0x14, 0x18, 0x5E, 0x12, 0xE5, 0xF2, 0xF1, 0xE2, 0xE3, 0xE0, 0xE4, 0xE8, 0xF0, 0xA9, 0xE8, 0xF2, 0xAC, 0xEE, 0xE2, 0xE6, 0xF3, 0xFA, 0xB ...
春秋杯2023冬 复现
春秋杯2023冬 复现upx2023首先发现无法直接upx -d的命令脱壳,再仔细看,发现是修改了upx的特征码,将UPX0等改为了upx0导致命令脱壳失败,所以我们首先要在010中将特征码修改回来(UPX的特征码是55 50 58),都修改后就可以直接upx -d脱壳了,然后我们拖进IDA分析:
发现是一个rand—seed的一个形式,还有一个change函数但是代码有点复杂,看不太懂,所以我们动态调试看一下,放一个测试字符串康康:
flag{0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ}
得到:
f{37BFJNRVZlg02468ACEGIKMOQSUWY}a159DHLPTX
发现change函数大概只是将flag的顺序换了一下,没有修改值,所以关键就来到如何找到seed,然后逆向异或出顺序换了的flag,所以我们直接爆破seed,来找到时间戳:
#include<stdio.h>#include<stdlib.h>int main(){ int seed, i, key, ...
re基础知识(复习)
re基础知识(复习)一 动态调试1.exe与elf的区别可执行文件指的是可以由操作系统进行加载执行的文件
可执行文件的文件格式常见有:exe 和 dll(Windows 系列)、elf(Linux 系列)
EXE(Executable)是Windows操作系统中的可执行文件格式,它是一种二进制格式,包含了程序的机器代码和相关的资源。EXE文件可以直接在Windows上运行,它通常以.exe作为文件扩展名。EXE文件可以包含多个可执行程序和库文件,它们可以通过链接器和加载器来进行连接和加载。
ELF(Executable and Linkable Format)是一种通用的可执行文件格式,主要用于UNIX和类UNIX操作系统,如Linux。ELF文件也是一种二进制格式,包含了程序的机器代码、数据和相关的元数据。ELF文件可以通过链接器和加载器来进行连接和加载,它支持动态链接和共享库的使用。
总的来说,EXE和ELF是不同操作系统中的可执行文件格式,它们在文件结构和使用方式上有一些区别。
文件结构上的区别:
EXE文件通常包含一个程序的完整可执行代码,以及相关的资源和数据。它可以有多个 ...
初步认识手脱upx壳
逆向学习笔记手脱upx壳工具准备:xdbg32,ExeinfoPE
前言:因为我们在CTF中经常会遇见upx壳,在有些题中我们无法直接通过工具进行脱壳,这时我们就需要进行手脱upx壳来进行逆向分析了。
以BUUCTF中新年快乐.exe为例(本题可以直接upx -d进行脱壳)进行说明:
首先我们ExeinfoPE看一下exe的基本信息:
发现是32位的upx壳,我们将它用xdbg32打开:
F9运行到入口(可以设置入口断点方便一点:在xdbg上方”选项“中选择”选项“,里面就有入口断点的设置):
第一步首先要找到OEP去壳后的程序起点。这里常用的有三个方法:
一:我们可以看有大跳转的地方:
我们直接看E9跳转的地址就是我们要找的OEP了,不过这个方式很多壳我们是没有办法找到的。
二:根据ESP定律设置硬件断点(ESP定律:是计算机用语,意思是向堆栈中压入下一行程序的地址,其实就是会出现很多pushad):
我们在这里设置一个断点,再F9运行就会程序断在恢复原状态的popad位置,之后我们运行过去,就可以找到OEP。
三:通过内存断点找到OEP。内存断点是通过修改页的属性来将程序断 ...