CG-CTF re部分wp

Posted harmonica11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:flag401095728057800001802040305000321589500479002923586000105060203300008950269750804

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

以上是关于CG-CTF re部分wp的主要内容,如果未能解决你的问题,请参考以下文章

CG-CTF web部分wp

BUUCTF Re部分wp

BUUCTF Re部分wp

BUUCTF Re部分wp

CG-CTF | Hello,RE!

2020网鼎杯第一场青龙组re部分wp