51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

【逆向】攻防世界新手题

(太简单的懒得写)

0x00 game {#0x00+game5368}

62192-n7y71k2r4bh.png

先复制done!!! the flag is处的地址
打开try again。将上面跳转地址修改即可
93513-nr8aw117l7k.png

75642-8slxd0br1o.png

0x01 Hello, CTF {#0x01+Hello%2C+CTF1903}

od打开程序
08119-0nnmupxzk1t.png

发现这个字符串有点奇怪。拿去16进制转化。得到答案。
02089-1v5xx781yp4.png

0x02 open-source {#0x02+open-source6026}

53054-3u0izlj2rq8.png

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

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

21821-gyc51q8oez.png

第一个地方得到first值=0xcafe
第二个地方得到second % 5 == 3 || second % 17 != 8都需要是错的
63437-nytphawl4o.png

得到其最小值为25
第三个地方就是比较字符串长度。这里为7.
第三个地方%x,说明这里输出的值是16进制
52500-g507nks3usd.png
编写脚本如下
98739-tnfzd7mkbj.png

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

0x03 logmein {#0x03+logmein6823}

29482-m58ss1lmjva.png

F5查看程序伪代码
27930-qdepn5duni.png

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

56327-uoue4ayzq.png

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 {#0x04+python-trade4927}

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

uncompyle6 1.pyc>1.py

35569-6ew3lk8ux8q.png
得到源码

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  : yx535@qq.com
@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()了,否则会报错(踩坑了)

赞(2)
未经允许不得转载:工具盒子 » 【逆向】攻防世界新手题