【逆向】攻防世界新手题

admin 2025年1月11日12:16:54评论2 views字数 1876阅读6分15秒阅读模式

(太简单的懒得写)

0x00 game

【逆向】攻防世界新手题

先复制done!!! the flag is处的地址
打开try again。将上面跳转地址修改即可
【逆向】攻防世界新手题

【逆向】攻防世界新手题

0x01 Hello, CTF

od打开程序
【逆向】攻防世界新手题

发现这个字符串有点奇怪。拿去16进制转化。得到答案。
【逆向】攻防世界新手题

0x02 open-source

【逆向】攻防世界新手题

可以发现,这题主要考察这个算法。

unsigned int hash = first* 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;

【逆向】攻防世界新手题

第一个地方得到first值=0xcafe
第二个地方得到second % 5 == 3 || second % 17 != 8都需要是错的
【逆向】攻防世界新手题

得到其最小值为25
第三个地方就是比较字符串长度。这里为7.
第三个地方%x,说明这里输出的值是16进制
【逆向】攻防世界新手题
编写脚本如下
【逆向】攻防世界新手题

所以说答案是c0ffee (起初我以为是0xc0ffee试了好几下)

0x03 logmein

【逆向】攻防世界新手题

F5查看程序伪代码
【逆向】攻防世界新手题

strcpy(v8, ":\"AL_RT^L*.?+6/46");
  v7 = 28537194573619560LL;
  v6 = 7;
  printf("Welcome to the RC3 secure password guesser.\n", a2, a3);
  printf("To continue, you must enter the correct password.\n");
  printf("Enter your guess: ");
  __isoc99_scanf("%32s", s);
  v3 = strlen(s);
  if ( v3 < strlen(v8) )
    sub_4007C0();
  for ( i = 0; i < strlen(s); ++i )
  {
    if ( i >= strlen(v8) )
      sub_4007C0();
    if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
      sub_4007C0();
  }
  sub_4007F0();
}

注意,
1.这里v7是十进制加密,将他转化为字符串是ebmarah。
而由于这里是x86系列的CPU,都是以小端序储存数据的,即低位字节存入低地址,高位字节存入高地址。所以说我们需要把字符串反过来
2.判断输入的字符与v8长度是否一致。一致则错误

__isoc99_scanf("%32s", s);
      v3 = strlen(s);
      if ( v3 < strlen(v8) )

【逆向】攻防世界新手题

3.输入的字符串要求需要小于,v8长度。s需要与后面那串相匹配。

        if ( i >= strlen(v8) )
          sub_4007C0();
        if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
          sub_4007C0();
      }
      sub_4007F0();

最后得出exp(python写的):

v8=":\"AL_RT^L*.?+6/46"
v7='ebmarah'
v7=v7[::-1]
v6=7
flag=''
for i in range(len(v8)):
    flag += chr(ord(v8[i]) ^ ord(v7[i%v6]))
print(flag)

0x04 python-trade

首先先得到一个pyc文件,我们利用uncompyle6模块来把他转成py

uncompyle6 1.pyc>1.py

【逆向】攻防世界新手题
得到源码

import base64

def encode(message):
    s = ''
    for i in message:
        x = ord(i) ^ 32
        x = x + 16
        s += chr(x)

    return base64.b64encode(s)


correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
flag = ''
print 'Input flag:'
flag = raw_input()
if encode(flag) == correct:
    print 'correct'
else:
    print 'wrong'

然后根据他的算法逆向就好了

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@File  : trade.py
@Author: YanXia
@Date  : 2021/8/15 15:43
@email  : [email protected]
@link:https://535yx.cn
'''

    import base64
    correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
    flag=''
    b=base64.b64decode(correct)
    for i in b:
        x=(i-16)^32
        flag+=chr(x)
        print(flag)

注意:由于python的base64解码后是bytes形式,所以不需要再用ord()了,否则会报错(踩坑了)

©著作权归作者所有 - source: 535yx.cn

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月11日12:16:54
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【逆向】攻防世界新手题https://cn-sec.com/archives/3619330.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息