2018网鼎杯逆向签到题-beijing
程序员文章站
2022-05-19 13:40:19
...
题目下载地址:beijing
尝试运行一下
发现输出乱码
file看下
32位IDA载入,进入main函数
发现这里有一个重复的函数调用,以及这个函数的返回值的打印
跟入这个函数看一下
发现是一个switch分支结构
简单的异或操作
根据分析得知sub_8048460这个函数的参数是flag的索引,flag的所有字符都在这个异或代码右侧偶数地址的值的列表中。
写Python脚本提取所有参数的地址
import re
pttern = re.compile(r"sub_8048460\(dword_(.*?)\)")
forge_c = """
v0 = sub_8048460(dword_804A03C);
printf("%c", v0);
fflush(stdout);
v1 = sub_8048460(dword_804A044);
printf("%c", v1);
fflush(stdout);
v2 = sub_8048460(dword_804A0E0);
printf("%c", v2);
fflush(stdout);
v3 = sub_8048460(dword_804A050);
printf("%c", v3);
fflush(stdout);
v4 = sub_8048460(dword_804A058);
printf("%c", v4);
fflush(stdout);
v5 = sub_8048460(dword_804A0E4);
printf("%c", v5);
fflush(stdout);
v6 = sub_8048460(dword_804A064);
printf("%c", v6);
fflush(stdout);
v7 = sub_8048460(dword_804A0E8);
printf("%c", v7);
fflush(stdout);
v8 = sub_8048460(dword_804A070);
printf("%c", v8);
fflush(stdout);
v9 = sub_8048460(dword_804A078);
printf("%c", v9);
fflush(stdout);
v10 = sub_8048460(dword_804A080);
printf("%c", v10);
fflush(stdout);
v11 = sub_8048460(dword_804A088);
printf("%c", v11);
fflush(stdout);
v12 = sub_8048460(dword_804A090);
printf("%c", v12);
fflush(stdout);
v13 = sub_8048460(dword_804A098);
printf("%c", v13);
fflush(stdout);
v14 = sub_8048460(dword_804A0A0);
printf("%c", v14);
fflush(stdout);
v15 = sub_8048460(dword_804A0A8);
printf("%c", v15);
fflush(stdout);
v16 = sub_8048460(dword_804A0B0);
printf("%c", v16);
fflush(stdout);
v17 = sub_8048460(dword_804A0B8);
printf("%c", v17);
fflush(stdout);
v18 = sub_8048460(dword_804A0C0);
printf("%c", v18);
fflush(stdout);
v19 = sub_8048460(dword_804A0C8);
printf("%c", v19);
fflush(stdout);
v20 = sub_8048460(dword_804A0D0);
printf("%c", v20);
fflush(stdout);
printf("\n");
return 0;
}
"""
a = pttern.findall(forge_c)
print("["+",".join(list(map(lambda x:hex(int(x,16)),a)))+"]")
输出所以参数的地址:
[0x804a03c,0x804a044,0x804a0e0,0x804a050,0x804a058,0x804a0e4,0x804a064,0x804a0e8,0x804a070,0x804a078,0x804a080,0x804a088,0x804a090,0x804a098,0x804a0a0,0x804a0a8,0x804a0b0,0x804a0b8,0x804a0c0,0x804a0c8,0x804a0d0]
写IDAPython脚本提取地址对应的值
a = [0x804a03c,0x804a044,0x804a0e0,0x804a050,0x804a058,0x804a0e4,0x804a064,0x804a0e8,0x804a070,0x804a078,0x804a080,0x804a088,0x804a090,0x804a098,0x804a0a0,0x804a0a8,0x804a0b0,0x804a0b8,0x804a0c0,0x804a0c8,0x804a0d0]
b = []
for i in a:
b.append(Byte(i))
print b
输出索引值:
[6, 9, 255, 1, 10, 255, 8, 255, 11, 2, 3, 1, 13, 4, 5, 2, 7, 2, 3, 1, 12]
这里输出的索引值有3个255
这3个值在bss段中,需要通过动调获取值
使用IDAPython提取flag字符
start = 0x804A020
end = 0x804A03C
flag = ''
for i in range(start,end,2):
flag = flag + chr(Byte(i))
print flag
输出flag字符:
aginbefjml{z}_
解密脚本:
这里因为三个255是未知值(2,5,7),暂时使用#号代替
value = "aginbefjml{z}_"
key = [6, 9, 255, 1, 10, 255, 8, 255, 11, 2, 3, 1, 13, 4, 5, 2, 7, 2, 3, 1, 12]
for i in key:
if i < len(value):
print(value[i],end='')
else:
print('#',end='')
使用IDA动态调试,获取这3个sub_8048460函数的参数值
得到这3个值都是0,flag字符的第0个是a,所以使用a替换那三个未知值
得到flag
flag{amazing_beijing}
上一篇: 庆祝新板第三帖解决思路
推荐阅读