64位 PE文件,x64dbg动态调试到flag打印处,寄存器窗口可以看到flag明文。
16位汇编,一开始装了dosbox准备动态调试,后来发现直接IDA静态分析也能解。
看了16位汇编的一些语法参考文章:
Int 指令
https://blog.csdn.net/SysProgram/article/details/52422827
shr shl 指令
https://blog.csdn.net/judyge/article/details/52343582
各寄存器
https://zhidao.baidu.com/question/1674096404675392107.html
阅读汇编语言发现程序逻辑是将“输入左移5位的结果”跟“输入右移3位的结果”作异或,再与一个静态数组作比较。
编写python脚本模拟该逻辑:
si=[0xC9 ,0x68 ,0x8A ,0xC8,0x6F ,0x07 ,0x06 ,0x0F ,0x07 ,0xC6 ,0xEB ,0x86 ,0x6E ,0x6E ,0x66 ,0xAD
,0x4C ,0x8D ,0xAC ,0xEB ,0x26 ,0x6E ,0xEB ,0xCC ,0xAE ,0xCD ,0x8C ,0x86 ,0xAD ,0x66 ,0xCD ,0x8E
,0x86 ,0x8D ,0xAF]
temp=""
for i in range(len(si)):
for j in range(0,255):
if ((j>>3)^(j<<5))&0xff==si[i]:
temp+=chr(j)
print(temp)
为什么要&0xff:
https://www.cnblogs.com/think-in-java/p/5527389.html
rank 5
ELF 64位,拖入IDA静态分析
一、分析start函数
1、main主函数
2、init函数初始化函数,将静态数组Bytes_6020A0各元素和下标异或8次,静态数组长度192
二、分析main函数
1、sub_4007D9 初始化
2、sub_400796 初始化6个变量,暂命名为a,b,c,d,e,f
3、逐位读取输入
4、判断输入为W、4、5、0时会分别跳转到四个子函数,输入其余字符会报error退出。
5、sub_400E58 最终校验函数,有两层校验,一层校验跟a,b有关,二层校验跟c,d有关,校验值均为20,校验通过会从比赛方的服务器cat flag。校验函数有比较明显的16*row+col的二维数组特征,猜测是迷宫类。
三、分析子函数
跟进四个跳转子函数,结构类似,抓一个W对应的子函数分析。
变量全标注清楚后,脑内模拟逻辑,发现这是个推箱子游戏。a,b,c,d,e,f对应是玩家、箱子A、箱子B的坐标,8是墙,0是路。W、4、5、0对应WASD上下左右。init函数异或出来的数组为16*12规格,其中有2个元素为20(为了方便观察,20改成了2)。
所以这20就是箱子要推到的地方,推完箱子的字符串发送给服务器,会返回flag。