XCTF 进阶 RE catch-me
下载文件,用ida打开提示是一个二进制文件,,,,
用kali检查一下文件看看是什么文件(我改了文件名):
xz的压缩包文件,,,
直接使用命令解压:
得到一个Catch_Me文件,运行一下得到一个假的flag,,,,
直接拖出来,用ida64打开,找到main函数:
可以看见这里的判断,,,,
不满足就会是一个假的flag,,,,
看来需要我们找出真正的haystack数组
我们往前分析一下:
可以看出haystack在这里被赋值的,
byte_6012A8的值跟v3有关系
v3的值在IDA里又无法看见,应该是动态生成的
所以我们可以进行动态调式,看能不能调式出来
对mian函数下断点,一步一步执行,结果得到v3,调式结果:
v3=0xb11924e1,既然v3知道了,那么getenv(CTF)就能够得到:
0xB11924E1 ^ 0xFEEBFEEB = 0x4ff2da0a
看着条件,觉得getenv(ASIS)应该和getenv(CTF)一样的
又因为getenv这个函数是获取环境变量嘛,所以我们可以直接设置环境变量:
export ASIS="$(printf "\x0a\xda\xf2\x4f")"
export CTF="$(printf "\x0a\xda\xf2\x4f")"
可以运行得到结果:
发现并没有什么卵用,,,,,,难道是两个变量不一样???
后面才知道使用ida动态调式运行程序就可以???
这又是个什么蛇皮情况????想不通,,,,,,
既然我们知道了,两个变量是相同的,那好办了,我们也可以自己写脚本嘛
haystack一开始是有初值的:
ok,编写python脚本:
haystack=[0x87, 0x29, 0x34, 0xC5, 0x55, 0xB0, 0xC2, 0x2D, 0xEE, 0x60,0x34, 0xD4, 0x55, 0xEE, 0x80, 0x7C,
0xEE, 0x2F, 0x37, 0x96,0x3D, 0xEB, 0x9C, 0x79, 0xEE, 0x2C, 0x33, 0x95, 0x78, 0xED,0xC1, 0x2B]
v3 = 0xb11924e1
x = 0xfeebfeeb
ctf = v3 ^ x
print(hex(ctf))
#ctf:0x4ff2da0a
byte_6012A8 = [0xb1,0x19&0xfd,0x24&0xdf,0xe1&0xbf,0x0a,0xda,0xf2,0x4f]
print(byte_6012A8)
i = 0
while i != 33:
haystack[i] ^= byte_6012A8[i&7]
i += 1
if(i == 32):
break
print(sum(haystack))
print(''.join(map(chr,haystack)))
得到结果:
和的结果为2388,不满足if条件跳过if,没错!!!
故flag为:ASIS{600d_j0b_y0u_4r3_63771n6_574r73d}