攻防世界 resver catch-me
catch-me asis-ctf-quals-2016
附件给了个压缩包文件,重命名,解压,获取到elf文件
程序有两处关键比较
第一处:
这里进行动态调试,得到v3=0xB11924E1, byte_6012AB[]= B1 19 04 A1
第二处关键比较:
关键处理:
程序开始先生成了一个数v3,---> number_6012A8[]中保存v3特定位置0后数据,--->关键比较1 if ( getenv("ASIS") && (*(_DWORD *)getenv("CTF") ^ v3) == 0xFEEBFEEB )
可以求出getenv("CTF")的正确值:0xB11924E1 ^ 0xFEEBFEEB = 0x4ff2da0a
而关键数据dword_6012AC = *(_DWORD *)getenv("ASIS"); 即 number_6012A8[4:7]=getenv("ASIS")
后面一系列操作 对number_6012A8[0x20]进行求和,第二处关键比较 ,求和结果要等于0x954
我们可以知道正确的getenv("CTF"),但不知道getenv("ASIS"),猜测他们值相同
进行验证:
1 haystack=[ 0x87, 0x29, 0x34, 0xC5, 0x55, 0xB0, 0xC2, 0x2D, 0xEE, 0x60,0x34, 0xD4, 0x55, 0xEE, 0x80, 0x7C, 2 0xEE, 0x2F, 0x37, 0x96,0x3D, 0xEB, 0x9C, 0x79, 0xEE, 0x2C, 0x33, 0x95, 0x78, 0xED,0xC1, 0x2B] 3 v3=0xB11924E1 4 target=0xFEEBFEEB 5 t=v3^target 6 print(hex(t)) 7 ctf=(t).to_bytes(4,'little') 8 9 number=[0xb1,0x19,0x04,0xa1]+(list(ctf)) 10 11 for i in range(0x20): 12 haystack[i]^=number[i&7] 13 h=sum(haystack) 14 print(hex(h)) 15 print(''.join(map(chr,haystack)))
输出:
0x4ff2da0a
0x954
600d_j0b_y0u_4r3_63771n6_574r73d
number_6012A8求和等于0x954,验证通过
ASIS{600d_j0b_y0u_4r3_63771n6_574r73d}