2018网鼎杯逆向签到题-beijing

题目下载地址:beijing
尝试运行一下
在这里插入图片描述
发现输出乱码
file看下
32位程序
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}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值