比赛和复现

比赛和一些题目复现

Patriotctf2022-Flowing

主程序就这一段,输入一个十六进制数,然后从文件中读取flag,可以采用爆破,可能是因为linux和windows的不同,我自己模拟出来的数据不一样,所以没爆破出来,最后采用了subprocess爆破

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import subprocess

real_flag=''#绝对正确的前6个字符

for i in range(0xffffffff):#当前爆破的位置上的字符
real_flag_arr_s=str(hex(i).strip('0x'))#输入到程序中的字符串,hex自带0x所以要去除掉0x
#上面都是一些初始化
p = subprocess.Popen(["./flowing"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.stdin.write(real_flag_arr_s.encode())
p.stdin.close()#停止输入
out = p.stdout.read()
if b"PCTF" in out or b"pctf" in out:
print(out)
exit()

Patriotctf2022-Fishyfish

得到.s文件,查阅后得知是gcc编译过程中生成的

生成可执行程序过程为成四个步骤: 1、由.c文件到.i文件,这个过程叫预处理。 2、由.i文件到.s文件,这个过程叫编译。 3、由.s文件到.o文件,这个过程叫汇编。 4、由.o文件到可执行文件,这个过程叫链接。

1
2
3
4
//使用以下指令将.s文件生成.o文件
gcc -c test.s -o test.o
//使用以下指令将.o文件生成可执行文件
gcc test.o -o test

将生成的可执行文件拖入ida中

可以看到这里调用了socket网络通信

https://zhuanlan.zhihu.com/p/260139078

先将异或后的数据发送到目标地址中,然后读取数据并写入文件中

我们可以不使用套接字进行编程,而使用pwntools这个工具,然后模拟socket接收数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *

#开启远程端口,网址+端口
p=remote("chal1.pctf.competitivecyber.club",10015)
#发送数据
p.send(b"obese dragonfish")
#接收指定长度的数据,直到timeout
data=p.readn(0x3888)
#将数据写入文件

with open("fish.bin","wb") as f:
f.write(bin_file)

p.interactive()

Self-Reverse

NCTF2021-狗狗的秘密

考点:反调试、SMC、进制转换

NCTF2021-鲨鲨的秘密

考点:反调试、CRC32、SMC

ISCC2022-MYALA

考点:维吉尼亚加密、C++