ciscn2023
babyresnap.berkeley.edu打开xml文件。
修改设置secret变量的流程:
在其设置完secret后展示:
得到secret:
逆向如图所示的算法:
具体流程就是将输入的每两个字符进行异或,放置到test中,然后将test[1:-1]与secret比对
exp1234data=[102,10,13,6,28,74,3,1,3,7,85,0,4,75,20,92,92,8,28,25,81,83,7,28,76,88,9,0,29,73,0,86,4,87,87,82,84,85,4,85,87,30]for i in range(1,len(data)): data[i]^=data[i-1]print(bytes(data))
ezbyte
查看程序可以知道flag的前五位和后五位,然后将中间的分别放入r12、r13、r14、r15中,但之后的程序没有对r12有处理。
使用readelf --debug-dump=frame ezbyte或readelf -Wwr ezbyte获取Dwarf调试信息。
逻辑:
123456r12, r13, r ...
DASCTF2023二进制
careful直接上传微步云沙箱
babyRe调试一下了解主要逻辑:
v17的位置是处理输入字符串的;
StartAddress是最后进行比较的;
v17的位置的数据是经过前面有个函数异或解开的,带有一点混淆,处理后可以得到:
exp123456789101112131415161718192021222324252627282930key = [ 93, 66, 98, 41, 3, 54, 71, 65, 21, 54]data = [ 0xF7, 0x2E, 0x34, 0xF0, 0x72, 0xCF, 0x5E, 0x0A, 0xBB, 0xEC, 0xB1, 0x2B, 0x70, 0x88, 0x88, 0xED, 0x46, 0x38, 0xDB, 0xDA, 0x6C, 0xBD, 0xD4, 0x06, 0x77, 0xF2, 0xCF, 0x56, 0x88, 0xC6, 0x31, 0xD2, 0xB7, 0x5A, 0xC1, 0x42, 0xB0, 0xF4, 0x48, 0x37, 0xF5, 0x2C, 0xF5 ...
安洵杯2023-wp
ez_cpp正向逻辑:123456789101112131415161718192021222324252627282930313233343536373839404142def reverse_bit(num, bit): result = 0 for i in range(bit): result |= ((num >> i) & 1) << (bit - i - 1) return resultb = "SYC{xxxxxxxxxxxxxxxxxxxxxxxx}"d = []c = 0x1EF035for i in range(len(b)): eax = (c & 0xFFFF00) + ord(b[i]) - 0x3D if eax & 0xFF < 0x3E: v7 = ord(b[i]) + 13 if ord(b[i]) > 0x5A: if ord(b[i]) + 13 < ...
天堂之门原理
前言本篇文章仅为看wp学习到的天堂之门技术做个总结。
具体学习,看看这些✌:
👉天堂之门 (Heaven’s Gate) C语言实现 | 34r7hm4n’s blog (bluesadi.cn) 👈讲得很细,看完就懂
👉天堂之门 (Heaven’s Gate) - s0rry’s Blog
WoW64WOW64(Windows-On-Windows 64bit)是X64 Windows操作系统的一个子系统,为32位应用程序提供运行环境。类似的还有WOW32子系统,负责在32位Windows系统上运行16位应用程序。
在64位系统中,32位的应用程序运行在一个WoW64的子系统中,这个子系统为32位程序提供了一个类似沙箱的运行环境。事实上这个32位程序运行的环境也是一个64位的运行环境,系统在创建32位进程时,首先创建一个64位的进程,然后再在其中创建一个32位的子环境。32位程序所调用的系统函数,最终都要通过64位的动态链接库而实现。
Winodws系统中,CS段寄存器用来标识目前所运行的代码是32位的,还是64位的。
以一个使用天堂之门的程序为例,其为64位程序。
一开始为6 ...
d3ctf2023学习
前言之所以标题为学习,是因为我不会。
这篇文章仅为看完各位佬的wp之后,照葫芦画瓢跟着做一遍的过程,部分脚本会直接使用各位佬的wp。
在这次CTF中,我发现我其实并没有系统地学习逆向,从头到尾都是瞎子乱撞,对于各式各样的知识的理解只是流于表面。
所以啊,还得学,而且还得扎得深点啊。
各位✌的writeup:
👉2023 AntCTF x D^3CTF 亚军 Writeup By S1uM4in)
👉2023 D^3CTF writeup by 万年三等奖
👉还有个官方的wp,就不放了
d3syscall首先看main,大概逻辑就是输入flag,检测。
sub_D3F5就是检测函数。
是syscall进行的系统调用,调用的操作由eax的值决定。
因此需要看syscall的调用有什么。
来到sub_1830,这里有对数据段取非,并写文件的操作,还有对字符串异或的操作。
但其实我并不知道为什么程序会来到这里,还是需要系统地学习一下程序执行的流程等知识啊。
对unk_4020数据段的取非操作,可以在动态调试下直接把结果dump出来,看文件头可以知道是一个新的ELF文件。
也可以使 ...
与程序交互的问题
前言这个问题是在做逆向时碰到的,就是一个猜数字的游戏,要猜对一百轮,这时,我的第一个想法是写一个自动与程序交互的脚本,于是就开始网上找有没有类似的脚本或方法了。
首先,要说明的是我并没有做出来关于这个猜数字程序的自动交互脚本,因为在这过程中遇到了个问题,这在下面讲述,所以我的方法只是面向一个简单的test程序:
12345678910#include<stdio.h>int main(){ char str[10]; printf("hello\n"); scanf("%s", str); printf("%s hello", str); scanf("%s",str); printf("hello %s\n", str); return 0;}
其次,我只是对我的方法进行一个叙述,说实话,这个方法很臭,我是真的想不出来好的方法了T_T T_T T_T
问题使用python的subprocess模块,
如果将程序输入输出导入subprocess模块的 ...
动态规划
前言以下只是碰到问题的解决方法,顺便对学习到的算法记录一些笔记,并非彻底地讲解动态规划算法
问题叙述以下代码只是对问题的一个简要的描述,实际上十六个数组的元素都不为0。
123456789101112131415a = [0] * 16b, c, d, e, f, g, h, i, j, k, l, m, n, o, p = [[0] * 16] * 16, [[0] * 16] * 16, [[0] * 16] * 16, [[0] * 16] * 16, [[0] * 16] * 16, [[0] * 16] * 16, [[0] * 16] * 16, [[0] * 16] * 16, [[0] * 16] * 16, [[0] * 16] * 16, [[0] * 16] * 16, [[0] * 16] * 16, [[0] * 16] * 16, [[0] * 16] * 16, [[0] * 16] * 16, arrays = [b, c, d, e, f, g, h, i, j, k, l, m, n, o, p] ...
QExtend-300
QExtend——XCTF函数主逻辑
开始函数的逻辑,标记的一行为将输入的第四位和最后一位都变成0,即去掉flag中的{},然后比较前四位是否位ZCTF,最后再使用flag中{}中的字符串。
sub_4026D0函数进入loc_4026D0可以看到,这其实应该是一个函数,但被数据断开了,但经过不更改代码的调试发现0x4026E5的数据在之后会被用到,因此如果要程序正常执行就不能直接使用nop将其覆盖。
先忽略这个数据,使用nop覆盖。
获得sub_4026D0函数的主要逻辑。
再进入switch的各个case的函数中看一下。
这里被标记的行有将函数返回地址进行加一的操作,可以将其nop掉,因为函数返回地址处的指令没有啥作用。
回看被nop的数据
此处的call会将函数返回地址压入栈中,而返回地址0x4026E5就是数据的地址,通过这种方法,当跳入sub_4026F5函数时,使用pop就可以获得数据的地址,然后继续下方的指令。
sub_4026F5函数没有push ebp;mov ebp esp;环节因此,第一个出栈的就是函数返回地址。
此处将数据的地址pop到esi中,而且还 ...
SCU2022新生赛
SCU2022新生赛签到
Tower_of_Hanoi1234567891011int x[35]={ 0x1BF21, 0x1BF31, 0x1BF27, 0x1BF31, 0x1BF26, 0x1BF34, 0x1BF29, 0x1BF20, 0x1BF37, 0x1BF24, 0x1BF37, 0x1BF20, 0x1BF21, 0x1BF37, 0x1BF0D, 0x1BF3B, 0x1BF21, 0x1BF0D, 0x1BF24, 0x1BF37, 0x1BF20, 0x1BF2B, 0x1BF0D, 0x1BF3B, 0x1BF3C, 0x1BF26, 0x1BF37, 0x1BF20, 0x1BF37, 0x1BF21, 0x1BF26, 0x1BF3B, 0x1BF3C, 0x1BF35, 0x1BF2F,};int i;for(i=0;i<35;i++){ putchar(x[i]^0x1bf52);}
ez_Android主体逻辑
即要获取一串0与1组成的字符串,使用check函数检查。
check函数将a ...
TEA加密与解密
TEA加密解密流程参考代码:(源自:常见加密算法和编码识别 - CTF Wiki (ctf-wiki.org))
12345678910111213141516171819202122232425#include <stdint.h>void encrypt (uint32_t* v, uint32_t* k) { uint32_t v0=v[0], v1=v[1], sum=0, i; /* set up */ uint32_t delta=0x9e3779b9; /* a key schedule constant */ uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */ for (i=0; i < 32; i++) { /* basic cycle start */ sum += delta; v0 += ((v1& ...