欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2018网鼎杯逆向签到题-beijing

程序员文章站 2022-05-19 13:40:19
...

题目下载地址:beijing
尝试运行一下
2018网鼎杯逆向签到题-beijing
发现输出乱码
file看下
2018网鼎杯逆向签到题-beijing
32位IDA载入,进入main函数
2018网鼎杯逆向签到题-beijing
发现这里有一个重复的函数调用,以及这个函数的返回值的打印
跟入这个函数看一下
发现是一个switch分支结构
2018网鼎杯逆向签到题-beijing
简单的异或操作
根据分析得知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
2018网鼎杯逆向签到题-beijing
这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函数的参数值
2018网鼎杯逆向签到题-beijing
得到这3个值都是0,flag字符的第0个是a,所以使用a替换那三个未知值
得到flag

flag{amazing_beijing}
相关标签: CTF-REVERSE