攻防世界re入门题

simple-unpack

下载附件,放进PE分析,发现是upx壳
在这里插入图片描述
在linux用upx -d 文件名 的命令脱壳,然后将文件拖进ida
在这里插入图片描述
双击flag,得到flag
在这里插入图片描述

no-strings-attached

将文件拖入ida
在这里插入图片描述
点进authenticate()函数
在这里插入图片描述
看一下decrypt函数,发现是一个加密函数
在这里插入图片描述
这里采用动态调试的方法查看内存中的值,decrypt函数
结束的位置为0x08048707,在这里下断点
在这里插入图片描述
然后运行程序,查看eax的值
在这里插入图片描述
可以得到flag

getit

将文件拖入PE,发现是64位的
在这里插入图片描述
将其拖入ida进行查看
在这里插入图片描述

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v3; // al
  __int64 v5; // [rsp+0h] [rbp-40h]
  int i; // [rsp+4h] [rbp-3Ch]
  FILE *stream; // [rsp+8h] [rbp-38h]
  char filename[8]; // [rsp+10h] [rbp-30h]
  unsigned __int64 v9; // [rsp+28h] [rbp-18h]

  v9 = __readfsqword(0x28u);
  LODWORD(v5) = 0;
  while ( (signed int)v5 < strlen(s) )
  {
    if ( v5 & 1 )
      v3 = 1;
    else
      v3 = -1;
    *(&t + (signed int)v5 + 10) = s[(signed int)v5] + v3;
    LODWORD(v5) = v5 + 1;
  }
  strcpy(filename, "/tmp/flag.txt");
  stream = fopen(filename, "w");
  fprintf(stream, "%s\n", u, v5);
  for ( i = 0; i < strlen(&t); ++i )
  {
    fseek(stream, p[i], 0);
    fputc(*(&t + p[i]), stream);
    fseek(stream, 0LL, 0);
    fprintf(stream, "%s\n", u);
  }
  fclose(stream);
  remove(filename);
  return 0;
}

查看一些参数的值
在这里插入图片描述
t存储的应该就是flag的值,注意要加上0x53
只需要将t的值复现出来就行了

s='c61b68366edeb7bdce3c6820314b7498'
t='' 
v5=0
while(v5<len(s)):
    if(v5&1):
        v3=1
    else:
        v3=-1
    t=t+chr(ord(s[v5])+v3)
    v5=v5+1
print(t)

最后运行结果为
在这里插入图片描述
所以flag为

SharifCTF{b70c59275fcfa8aebf2d5911223c6589}

csaw2013reversing2

将文件双击运行
在这里插入图片描述
将其拖入PE,发现是32位的
在这里插入图片描述
将其拖进ida
在这里插入图片描述
可以看到第16行应该是弹出flag的值,IpMem存的应该就是flag的值,但是运行程序之后发现是乱码,这里应该是没有执行sub_401000函数的原因。

我们用OD打开文件

在这里插入图片描述
可以看出,进行if判断后,程序直接跳过了sub_401000函数,然后跳出弹框,显示乱码,所以我们需要对程序进行修改使其执行sub_401000函数。
在这里插入图片描述
这里要注意,还需要修改下面的jmp跳转,使其跳转到第二个flag处,因为那里是弹框的函数
在这里插入图片描述
最后得到flag
在这里插入图片描述

maze

先将文件拖入PE,发现是64位的
在这里插入图片描述
将文件放在kali里运行一下
在这里插入图片描述
随便输入点东西,失败了
在这里插入图片描述
拖进64位ida

在这里插入图片描述

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  const char *v3; // rsi
  signed __int64 v4; // rbx
  signed int v5; // eax
  char v6; // bp
  char v7; // al
  const char *v8; // rdi
  __int64 v10; // [rsp+0h] [rbp-28h]

  v10 = 0LL;
  puts("Input flag:");
  scanf("%s", &s1, 0LL);
  if ( strlen(&s1) != 24 || (v3 = "nctf{", strncmp(&s1, "nctf{", 5uLL)) || *(&byte_6010BF + 24) != 125 )
  {
LABEL_22:
    puts("Wrong flag!");
    exit(-1);
  }
  v4 = 5LL;
  if ( strlen(&s1) - 1 > 5 )
  {
    while ( 1 )
    {
      v5 = *(&s1 + v4);
      v6 = 0;
      if ( v5 > 78 )
      {
        v5 = (unsigned __int8)v5;
        if ( (unsigned __int8)v5 == 'O' )
        {
          v7 = sub_400650((_DWORD *)&v10 + 1);
          goto LABEL_14;
        }
        if ( v5 == 'o' )
        {
          v7 = sub_400660((char *)&v10 + 4, v3);
          goto LABEL_14;
        }
      }
      else
      {
        v5 = (unsigned __int8)v5;
        if ( (unsigned __int8)v5 == '.' )
        {
          v7 = sub_400670(&v10, v3);
          goto LABEL_14;
        }
        if ( v5 == '0' )
        {
          v7 = sub_400680(&v10, v3);
LABEL_14:
          v6 = v7;
          goto LABEL_15;
        }
      }
LABEL_15:
      v3 = (const char *)HIDWORD(v10);
      if ( !(unsigned __int8)sub_400690(asc_601060, HIDWORD(v10), (unsigned int)v10) )
        goto LABEL_22;
      if ( ++v4 >= strlen(&s1) - 1 )
      {
        if ( v6 )
          break;
LABEL_20:
        v8 = "Wrong flag!";
        goto LABEL_21;
      }
    }
  }
  if ( asc_601060[8 * (signed int)v10 + SHIDWORD(v10)] != '#' )
    goto LABEL_20;
  v8 = "Congratulations!";
LABEL_21:
  puts(v8);
  return 0LL;
}

代码中有O,o,0,.这四个字符,于是猜测可能对应上下左右四个方向,而迷宫应该是个二维数组

bool __fastcall sub_400650(_DWORD *a1)//(_DWORD *)&v9 + 1 'O'
{
  int v1; // eax

  v1 = (*a1)--;
  return v1 > 0;
}

bool __fastcall sub_400660(int *a1)//(int *)&v9 + 1 'o'
{
  int v1; // eax

  v1 = *a1 + 1;
  *a1 = v1;
  return v1 < 8;
}

bool __fastcall sub_400670(_DWORD *a1)//&v9 '.'
{
  int v1; // eax

  v1 = (*a1)--;
  return v1 > 0;
}

bool __fastcall sub_400680(int *a1)//&v9 '0'
{
  int v1; // eax

  v1 = *a1 + 1;
  *a1 = v1;
  return v1 < 8;
}

分别与O,o,.,0相对应
根据二维数组的性质,可以判断出
O对应左
o对应右
.对应上
0对应下
asc_601060里存放了迷宫
在这里插入图片描述
这里应该是一个8*8的迷宫

  ******
*   *  *
*** * **
**  * **
**  * **
*  *#  *
** *** *
**     *
********

我们的目标是走到#,所以flag为

nctf{o0oo00O000oooo…OO}
### 关于攻防世界中的加密技术及其应用 #### 加密与解密的基础概念 加密是一种通过特定算法将原始数据转换为不可读形式的技术,目的是保护数据的安全性和隐私性。在网络安全领域,加密技术被广泛应用于防止敏感信息泄露、篡改和窃听。常见的加密方法包括对称加密(如AES)、非对称加密(如RSA)以及流加密(如RC4)。这些技术不仅用于静态数据的存储安全,还适用于动态通信过程中的数据传输安全保障[^1]。 #### 开源工具的应用实例 在网络攻防实践中,开源工具扮演着重要角色。例如,`Bash Crypt` 是一种基于命令行的简单加密工具,它能够实现基本的数据加密功能;而 `EAS Phish` 则专注于钓鱼攻击场景下的密码学运用。通过对这些工具的学习和实践,可以深入理解加密机制的实际操作流程及其潜在漏洞[^2]。 #### 动态解密技术探讨 针对某些复杂的恶意软件或者高级持续威胁 (APT),它们可能采用自定义或嵌套式的加解密逻辑来隐藏行为特征。在这种情况下,研究如何逆向分析并修改其内部处理函数变得尤为重要。正如提到的一种技巧——将原本负责加密的部分代码替换为对应的反向运算即解密操作,则可有效还原受保护的内容结构[^3]。 #### 蜜罐技术的成本考量 从更宏观的战略层面来看,在构建防御体系时引入蜜罐作为诱饵节点之一,不仅可以迷惑入侵者延长其探索周期,更重要的是收集到更多有关对方战术情报以便后续改进措施制定。这种做法体现了现代信息安全防护理念中对于资源消耗平衡的关注点所在[^4]。 ```python import base64 def simple_encrypt(data, key='secret'): """ 使用Base64编码模拟简易加密 """ encoded_data = data.encode('utf-8') encrypted = base64.b64encode(encoded_data).decode() return f"{key}:{encrypted}" def simple_decrypt(encrypted_text, key='secret'): """ 对应上述方法进行解码恢复原字符串 """ _, cipher_part = encrypted_text.split(':') # 假设格式固定 decrypted_bytes = base64.b64decode(cipher_part) return decrypted_bytes.decode() example_message = "This is a secret message." print("Original Message:", example_message) ciphered_result = simple_encrypt(example_message) print("Encrypted Result:", ciphered_result) deciphered_output = simple_decrypt(ciphered_result) print("Decrypted Output:", deciphered_output) ``` 以上示例展示了基础层次上的字符串加密/解密过程,尽管实际应用场景下通常需要更加复杂且经过验证强度更高的方案支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值