一.PE格式
此题主要考察基础的PE文件格式,参考https://blog.csdn.net/qq_20307987/article/details/50953033
当然,使用工具更简单。PETool
可以求得flag
二.Warmup
IDA打开,定位到主函数
关键位置循环加密,然后与一个字符串比较。可以直接写脚本。
s="LDYVLQMZHuY:|cQ[^Qyo|cQ{~QYO\CQ[^/s"
le=len(s)
flag1=''
for i in range(le):
flag1=flag1+chr(ord(s[i])^0xE)
print(flag1)
求得flag
BJWXB_CTF{W4rm_UP_warm_up_WARM_UP!}
三. r100
IDA打开
找到main函数,仔细观察一下,可见,sub_4006FD是个关键,点进去
程序会将输入的内容与这些字符串经过操作后比较,可以写脚本了
t1="Dufhbmf"
t2="pG`imos"
t3="ewUglpt"
s=[]
for i in range(3):
s.append([])
for i in range(7):
s[0].append(t1[i])
for i in range(7):
s[1].append(t2[i])
for i in range(7):
s[2].append(t3[i])
#print(s)
flag=[]
for i in range(12):
flag.append(chr(ord(s[i%3][2*(int)(i/3)])-1))
print("".join(flag))
得到flag
Code_Talkers
四.逆向练习
IDA定位到主函数,F5
while用于输入,下面的for循环用于判断。
v32是我们输入的内容。
分析下v9,由于v9到v30的内存连着,可以将其看做一个数组,则“*(&v9+i)”可以看做是在取该数组的数;
byte_41578是个字符串。
所以,v32的前17位应该是以v9到v26所存的数为下标的数组byte_415768的值。
v33到v37在v32数组后面,可以认为,他们是一体的,我们即输入的数的后五位应该是“1024}”。
写个脚本
s=[1,4,14,10,5,36,23,42,13,19,28,13,27,39,48,41,42]
temp="KfxEeft}f{gyrYgthtyhifsjei53UUrrr_t2cdsef66246087138\0087138"
flag=""
for i in s:
flag=flag+temp[i-1]
flag=flag+'1024}'
print(flag)
解得flag:KEY{e2s6ry3r5s8f61024}