XCTF 进阶 RE catch-me

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42967398/article/details/102463418

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}

猜你喜欢

转载自blog.csdn.net/qq_42967398/article/details/102463418