[HNCTF 2022 WEEK2]Try2Bebug_Plus
卡那里了,先不 patch 试试,动调时候再改
字符串窗口寻找,就是v3
也可以写脚本
#include <stdio.h>
#include <string.h>
#include <stdint.h>
int main(void)
{
unsigned int a1[] = {1218055165, 954087480, 382851665, 1896157421, 509711250, 189299029, 179587463, 1572042981, 2677908685, 1240652200, 1619994270, 1650571313};
int a2[] = {170, 187, 204, 221};
unsigned int v0,v1,sum,i;
unsigned char flag[12];
for (int k = 0; k < 12; k += 2)
{
v0 = a1[k];
v1 = a1[k + 1];
sum = -957401312;
for (i = 0; i <= 0x1F; ++i)
{
v1 -= (v0 + sum) ^ (16 * v0 + a2[2]) ^ ((v0 >> 5) + a2[3]);
v0 -= (v1 + sum) ^ (16 * v1 + *a2) ^ ((v1 >> 5) + a2[1]);
sum += 1640531527;
}
a1[k] = v0;
a1[k + 1] = v1;
}
for (int i = 0; i < 12; i++)
{
flag[i] = (a1[i]) ^ (16 * i);
printf("%c", flag[i]);
}
}
//th1s_1s_flag
[MoeCTF 2022]fake_key
眼见不一定为真,就像你看到的密钥。
程序中出现不确定的数字怎么办呢?调试就完事。
rand()那跟了一下,只有9次好像,不知道哪里出问题,应该是29个数
data=[0x29,0x4823,0x18be,0x6784,0x4ae1,0x3d6c,0x2cd6,0x72ae,0x6952]
看了一下wp:
1.这是伪随机
#include<stdio.h>
#include <stdlib.h>
int main()
{
for (int j = 0; j < 29; j++)
printf("%d,", rand() % 10);
}
//1,7,4,0,9,4,8,8,2,4,5,5,1,7,1,1,5,2,7,6,1,4,2,3,2,2,1,6,8,
但我理解的是只有那种有随机数种子才是伪随机。
可能是因为取模和默认种子数
2.猜测
可以通过先输入一段已知字符(如12312312312312312312312323123
),然后再写脚本,判断每个值偏移了多少。
再把这个值记下即可。 尝试两次发现一样,所以是伪随机,直接从被比较的文本减去这个值即可
exp:
enflag = [21, 33, 15, 25, 37, 91, 25, 57, 95, 58,
59, 48, 116, 7, 67, 63, 9, 90, 52, 12,
116, 63, 30, 45, 39, 33, 18, 22, 31]
randed = [1, 7, 4, 0, 9, 4, 8, 8, 2, 4, 5, 5, 1, 7, 1, 1, 5, 2, 7, 6, 1, 4, 2, 3, 2, 2, 1, 6, 8, ]
key = [121, 117, 110, 122, 104, 49, 106, 117, 110, 84,
67, 76, 44, 116, 114, 97, 99, 107, 89, 89,
68, 83]
for i in range(29):
enflag[i] -= randed[i]
enflag[i] ^= key[i % len(key)]
print(chr(enflag[i]), end='')
[GDOUCTF 2023]润!
UPX魔改壳,将四处FUK改为UPX,然后直接脱
输入16个字符
先提取出map
提取出来长度是2048?不是512?后面一堆0应该不是,按512
512=64*8
突然想到会不会是三维,512=8*8*8,但打印出来也不太对
又仔细看了一下moving函数
按 u 每次会重置map
__int64 init()
{
__int64 result; // rax
int j; // [rsp+4h] [rbp-Ch]
int i; // [rsp+8h] [rbp-8h]
int v3; // [rsp+Ch] [rbp-4h]
v3 = 0;
for ( i = 0; i <= 7; ++i )
{
for ( j = 0; j <= 7; ++j )
{
puzzle[8 * i + conut + 7 - j] = (gen[conut / 8 + i] >> j) & 1;
++v3;
}
}
result = (unsigned int)(conut + v3);
conut += v3;
return result;
}
所以应该是 8 张 8*8的map
gen = [127, 127, 31, 223, 223, 255, 255, 255, 255, 255,
241, 255, 223, 255, 255, 255, 255, 255, 197, 223,
223, 255, 255, 255, 255, 255, 253, 255, 255, 255,
255, 255, 255, 253, 253, 253, 252, 255, 255, 255,
255, 255, 255, 255, 254, 254, 252, 249, 255, 255,
255, 255, 255, 255, 255, 251, 255, 255, 255, 255,
255, 255, 255, 248]
conut = 0
# c=c[:64]
map = [0]*512
for k in range(8):
for i in range(8):
for j in range(8):
map[8 * i + conut + 7 - j] = (gen[int(conut / 8) + i] >> j) & 1
conut += 64
for i in range(0+k*64,64+k*64,8):
print(map[i:i+8])
print('*'*50)
还能这么搞,额。。。。
最后就是走maze了
可以手搓,也可以写脚本
CTF-Reverse 迷宫地图类题目分析‘‘DFS和BFS算法‘‘(学习笔记)【详】_ctf reverse map-CSDN博客
脚本的话先后面学习一下。
[BJDCTF 2020]Easy
这个错误信息表明一个程序试图访问它不应该访问的内存部分。异常代码 c0000005
表示“访问冲突”,意味着程序试图读取或写入受保护的内存地址。
1. 重新启动应用程序
- 关闭该应用程序并重新启动。有时这可以解决临时的内存问题。
2. 更新软件
- 确保该应用程序和操作系统都是最新版本。开发者经常发布更新来修复错误和提高稳定性。
3. 以管理员身份运行
- 右键点击应用程序图标,选择“以管理员身份运行”。这有时可以绕过某些访问限制。
4. 检查系统内存
- 使用Windows内置的内存诊断工具检查系统内存是否有问题。可以在“开始”菜单中搜索“Windows内存诊断”。
5. 杀毒和防恶意软件
- 使用杀毒软件和防恶意软件工具扫描系统,确保没有恶意软件导致这个问题。
6. 兼容模式
- 如果该应用程序比较旧,可以尝试右键点击应用程序图标,选择“属性”,然后在“兼容性”选项卡中选择“以兼容模式运行这个程序”。
7. 重新安装应用程序
- 卸载并重新安装该应用程序。这有助于修复由于文件损坏导致的问题。
8. 检查硬件
- 如果上述方法都不起作用,可能需要检查硬件是否存在问题,如内存条或硬盘。
跳转函数找错了