RE_调试专项训练

[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)

[GDOUCTF 2023]润!-CSDN博客

还能这么搞,额。。。。

最后就是走maze了

可以手搓,也可以写脚本

CTF-Reverse 迷宫地图类题目分析‘‘DFS和BFS算法‘‘(学习笔记)【详】_ctf reverse map-CSDN博客

脚本的话先后面学习一下。 

[BJDCTF 2020]Easy

这个错误信息表明一个程序试图访问它不应该访问的内存部分。异常代码 c0000005 表示“访问冲突”,意味着程序试图读取或写入受保护的内存地址。

1. 重新启动应用程序

  • 关闭该应用程序并重新启动。有时这可以解决临时的内存问题。

2. 更新软件

  • 确保该应用程序和操作系统都是最新版本。开发者经常发布更新来修复错误和提高稳定性。

3. 以管理员身份运行

  • 右键点击应用程序图标,选择“以管理员身份运行”。这有时可以绕过某些访问限制。

4. 检查系统内存

  • 使用Windows内置的内存诊断工具检查系统内存是否有问题。可以在“开始”菜单中搜索“Windows内存诊断”。

5. 杀毒和防恶意软件

  • 使用杀毒软件和防恶意软件工具扫描系统,确保没有恶意软件导致这个问题。

6. 兼容模式

  • 如果该应用程序比较旧,可以尝试右键点击应用程序图标,选择“属性”,然后在“兼容性”选项卡中选择“以兼容模式运行这个程序”。

7. 重新安装应用程序

  • 卸载并重新安装该应用程序。这有助于修复由于文件损坏导致的问题。

8. 检查硬件

  • 如果上述方法都不起作用,可能需要检查硬件是否存在问题,如内存条或硬盘。

跳转函数找错了

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值