(太简单的懒得写)
0x00 game {#0x00+game5368}
先复制done!!! the flag is处的地址
打开try again。将上面跳转地址修改即可
0x01 Hello, CTF {#0x01+Hello%2C+CTF1903}
od打开程序
发现这个字符串有点奇怪。拿去16进制转化。得到答案。
0x02 open-source {#0x02+open-source6026}
可以发现,这题主要考察这个算法。
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 {#0x03+logmein6823}
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 {#0x04+python-trade4927}
首先先得到一个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 : 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()了,否则会报错(踩坑了)