CG-CTF re部分wp

将cgctf re部分移到这
Re
1,hello re
没什么可说的,拖进ida,发现几个大数字,用热键r一下,将数字变为字符串,由于是小端,将字符串倒过来就是flag 了
2,readasm2
int main(int argc, char const *argv[])
{
char input[] = {0x0, 0x67, 0x6e, 0x62, 0x63, 0x7e, 0x74, 0x62, 0x69, 0x6d,
0x55, 0x6a, 0x7f, 0x60, 0x51, 0x66, 0x63, 0x4e, 0x66, 0x7b,
0x71, 0x4a, 0x74, 0x76, 0x6b, 0x70, 0x79, 0x66 , 0x1c};
func(input, 28);
printf("%s\n",input+1);
return 0;
}
题目给了一个asm文件,里面是对func函数的描述,翻译成c语言就是

void func(char input[],int num)
{
int i=1;
while(i<=num)
{
input[i]^=i;
i++;
}
}

就可以算出flag
3,wxyvm1
还是先拖入ida,可以看出函数不难理解,将我们的输入经过sub_4005B6与byte_6010c0转换后与 dword_601060比较后,正确即为flag

 
c="C4 34 22 B1 d3 11 97 07 DB 37 C4 06 1D FC 5B ED 98 DF 94 D8 B3 84 CC 08"
with open('wxyvm') as wxy:
    b=wxy.read()
d=[]
e=[]
for i in c.split():
    d.append(int(i,base=16))

for i in b.split():
    e.append(int(i,base=16))

for i in range(5000):
    v0=e[3*(4999-i)]
    v1=e[3*(4999-i)+1]
    v3=e[3*(4999-i)+2]
    if v0==1:
        d[v1]-=v3
    elif v0==2:
        d[v1]+=v3
    elif v0==3:
        d[v1]^=v3
    elif v0==4:
        d[v1]/=v3
    elif v0==5:
        d[v1]^=d[v3]
    else :
        continue
print(''.join([str(chr(int(i)%128))for i in d]))

这里的wxyvm文件是byte_6010c0的数据
运算得到flag


4,py交易
题目给了一个.pyc文件,我用了uncompyle6逆向

 
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'

逻辑很好懂,将函数改一下

import base64
correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
f=base64.b64decode(correct)
print(f)

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

运行得到flag


5,maze
有题目可以猜到是一道迷宫题,拖进ida
在这里插入图片描述
的确是迷宫题,用O o . 0作为上下左右。找到题目迷宫部分
在这里插入图片描述
在这里插入图片描述
由这推断到35既#处为终点,将迷宫以每行8个分隔开

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

走一遍得到flag

6,你大概需要一个优秀的mac
题目给了一个OS X的程序(虽然我用的是Mac,但这题不用Mac也可以做)
还是拖进ida
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
程序将输入xor六次后与unk_100000ED0对比
写脚本

 
with open('mac') as mac:
    v2=mac.read()
INPUT=[]

for i in v2.split():
    INPUT.append(int(i,base=16))
print(INPUT)

for i in range(0,10):
    INPUT[i]^=173
for i in range(10,20):
    INPUT[i]^=190
for i in range(20,30):
    INPUT[i]^=239
for i in range(30,40):
    INPUT[i]^=171
for i in range(40,len(INPUT)):
    INPUT[i]^=239
for i in range(0,len(INPUT)):
    INPUT[i]^=222
print(INPUT)
print(''.join(chr(i)for i in INPUT))

运行得flag
7,single
要求输入一串字符,经过三个函数的考验,
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
可以看出这是一个神奇的数独,将unk_602080取81个数,排成9*9的格式

 
 00 03 00 06 00 00 00 00 00
 06 00 00 00 03 02 04 09 00
 00 09 00 01 00 07 00 06 00
 07 04 06 00 00 00 00 00 00
 00 01 08 00 00 00 06 03 00
 00 00 00 00 00 00 01 04 07
 00 08 00 09 00 04 00 07 00
 00 07 04 02 01 00 00 00 06
 00 00 00 00 00 03 00 01 00

每行每列每九宫格为1-9不同的数,解数独后将最初unk_602080中不为零的数转化为零作为输入,得flag:flag{401095728057800001802040305000321589500479002923586000105060203300008950269750804}

8,480小时精通c++
用ida查看main
在这里插入图片描述
上面v5后就是加密的flag,在看汇编
在这里插入图片描述
在The Encrypted Flag is前有一段nop,大概是加密的函数,在函数表中找,
在这里插入图片描述
有个StringEncryptFunction函数
用gdb
在这里插入图片描述
经过之前对_X1C_CG…函数的分析,rdi为处理的数据地址,rsi为数据的字符数
set $rdi=$rax
set $rsi=36
将程序跳转到StringEncryptFunction
set $rip=0x4224f6
c
在这里插入图片描述
得到flag

猜你喜欢

转载自www.cnblogs.com/harmonica11/p/11365453.html