逆向攻防世界CTF系列1-Hello,CTF

逆向CTF系列1-Hello,CTF

下载文件首先查壳

image-20241011170415935

是32位的。

上面的图看到了没有。说明这个软件是没有加壳的。是用Microsoft Visual C++ 6.0软件编写的。如果查到了是aspack的。那就说明是加了aspack的壳。您可以用专门脱aspack脱壳机来脱壳。很多高手都是用OllyDBG V1.10 手工来脱壳的。

可以先运行一下源程序,输入123,发现输出wrong

image-20241011213951422

可能是要我们输出success才行。在ida中再看看,果断F5。

int __cdecl main(int argc, const char **argv, const char **envp) {
  int i; // ebx
  char v4; // al
  int result; // eax
  int v6; // [esp+0h] [ebp-70h]
  int v7; // [esp+0h] [ebp-70h]
  char Buffer[2]; // [esp+12h] [ebp-5Eh] BYREF
  char v9[20]; // [esp+14h] [ebp-5Ch] BYREF
  char v10[32]; // [esp+28h] [ebp-48h] BYREF
  __int16 v11; // [esp+48h] [ebp-28h]
  char v12; // [esp+4Ah] [ebp-26h]
  char v13[36]; // [esp+4Ch] [ebp-24h] BYREF

  strcpy(v13, "437261636b4d654a757374466f7246756e");
  while ( 1 ){
    memset(v10, 0, sizeof(v10));
    v11 = 0;
    v12 = 0;
    sub_40134B(aPleaseInputYou, v6);
    scanf("%s", v9);
    if (strlen(v9) > 0x11 ) break;
    for ( i = 0; i < 17; ++i ) {
      v4 = v9[i];
      if ( !v4 ) break;
      sprintf(Buffer, "%x", v4);
      strcat(v10, Buffer);
    }
     if (!strcmp(v10, v13))  sub_40134B(aSuccess, v7);
     else sub_40134B(aWrong, v7);
  }
  sub_40134B(aWrong, v7);
  result = --Stream._cnt;
  if ( Stream._cnt < 0 )
    return _filbuf(&Stream);
  ++Stream._ptr;
  return result;
}

sub_40134B没搜到他的用途,但是读完代码并理解后可以假设一下他是输出函数,也就是,在v10和v13相等才会输出v13

简单讲一下代码逻辑,输入v9,v9长度不能大于0x11(0x11=17,16进制,因为0x),循环17次,取出每一位如果为0则退出循环,不为0则拼接到v10(16进制),循环结束后进行比较。

也就是437261636b4d654a757374466f7246756e是输入字符串的16进制

%x以十六进制数形式输出整数

image-20241011220112125

当然也可以写脚本:

16进制字符串转字符串,大致的逻辑就是将16进制字符串每两个字符组合在一起得到一个16进制的字符串

x='437261636b4d654a757374466f7246756e' 
y='' 
i=0
while(i < len(x)):
    y += chr(int(x[i:i+2],16))
    i += 2
print(y)

以下是 int() 方法的语法:

class int(x, base=10)

参数

  • x – 字符串或数字。
  • base – 进制数,默认十进制。

CrackMeJustForFun

成功,CrackMeJustForFun就是flag

image-20241011220412699

补充一下壳的知识:

壳是指在一个程序外面包裹一段代码,保护里面的代码不被正确反编译或非法修改,在加载到内存时般先于程序运行,拿到控制权,然后保护并加载程序。

加壳:其实是利用特殊的算法,对EXE、DLL文件里的资源进行压缩。类似WINZIP 的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。加壳过的程序可以直接运行但是不能查看源代码,要经过脱壳才可以查看源代码,这样可以起到保护程序的作用。

image-20241011171006197

  • 压缩壳:通过压缩算法压缩软件大小。
    行但是不能查看源代码,要经过脱壳才可以查看源代码,这样可以起到保护程序的作用。

[外链图片转存中…(img-PC0hMHDZ-1728655915194)]

  • 压缩壳:通过压缩算法压缩软件大小。
  • 加密壳:利用各种反跟踪技术保护程序不被调试、脱壳、反编译。
### CTF竞赛概述 CTF(Capture The Flag)竞赛是一种在网络空间安全领域广泛开展的技术比赛形式,旨在通过模拟真实环境中的攻击与防御场景来提升参与者的技能水平。这类竞赛不仅是学习和实践网络安全技术的有效途径,同时也是检验个人或团队技术水平的重要平台。 #### CTF竞赛的主要赛制分类 CTF竞赛通常分为三种主要赛制:解题模式(Jeopardy)、攻防模式(Attack-Defense),以及混合模式(Mix)。 - **解题模式**:参赛者需解决一系列涉及逆向工程、密码学、渗透测试等问题的任务,每完成一项任务即可获得相应分数[^2]。这种模式注重理论知识的应用能力。 - **攻防模式**:各支队伍被分配到独立运行的服务实例上,在保护自己服务免受其他队伍攻击的同时尝试入侵对方服务器并窃取标志文件(flag)。此过程强调实时操作能力和快速响应机制的重要性。 - **混合模式**:综合了解题与攻防两种形式的优点,例如先通过解题获取基础积分再进入对抗阶段调整总成绩排名情况等设置方法。像 iCTF 这样的国际赛事就采用了此类综合性更强的比赛规则设计思路。 #### 如何参与CTF竞赛? 对于初学者来说,可以从以下几个方面着手准备加入CTF活动当中去: 1. 学习基础知识:熟悉计算机网络原理、操作系统基本概念、编程语言特性等方面的知识体系构建起扎实的地基; 2. 掌握工具使用技巧:熟练运用诸如Wireshark抓包分析软件、Burp Suite网页漏洞扫描插件之类的实用型辅助程序提高工作效率; 3. 积累实践经验:积极参与线上练习平台上的题目挑战或者报名线下举办的各类小型友谊性质交流会积累实际动手经验;可以通过访问专门提供在线刷题功能的网站来进行日常训练[^4]; 4. 加入社区讨论群组:与其他志同道合的朋友一起分享心得感悟共同进步成长往往能够事半功倍达到理想效果。 ```python # 示例代码展示如何连接远程SSH服务进行端口探测 import paramiko def ssh_connect(ip, port=22): try: client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(ip, port) print(f"Successfully connected to {ip} on port {port}") except Exception as e: print(e) ssh_connect('example.com', 2222) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值