方法一:Smc自解密:
1)、使用ida64打开进入查看:
1、在main函数中没有信息,
发现在调用main函数之前会先调用fini函数和init函数,进入这两个函数查看:
fini函数平平无奇:
但是init函数中批量调用了off_3D00处的函数:
2、进入段off_3D00查看:
发现sub_13E0和sub_188C两个函数,其中sub_188C为重点
3、进入sub_188c查看发现其对某一段数据进行了异或操作,肯定是Smc无疑:
2)、Smc解密还原函数:
使用idapython脚本还原函数:
使用快捷键P定义函数,F5进入查看,定位到输出flag的核心代码:
根据逻辑,其是有两端数据异或得到的flag,编写脚本如下:
a=["5416D999808A28FA","588505094953B563","CE8CF3A0DC669097","4C5CF3E854F44CBD","D144E49916678331","DA616BAC","BBD0","55"]
b=["3B4FA2FCEDEB4F92","07E45A6C3B67EA16","AFE1ACC8BF12D0E7","132EC3B7269138CE","8E2197EB7311E643","AE540AC1","C9B5","28"]
for i in range(len(a)):
flag=""
for j in range(0,len(a[i]),2):
flag+=(chr(int(a[i][j:j+2],16)^int(b[i][j:j+2],16)))
print(flag[::-1],end="")
Flag = hgame{You_4re_a_p@tch_master_0r_reverse_ma5ter}
方法二:patch修改后保存修改直接执行.elf程序:
1)、在Smc还原代码后发现要输出flag必须是if判断进入到输出flag的块,因此可以直接将flag的判定条件取否,则在程序运行时会直接输出flag:
1、在汇编模式下patch:
阅读汇编代码后,发现其中有两条跳转指令:
将其取否后如下:
注意:再次执行idapython将Smc还原为数据(不还原程序执行时会再次异或导致程序报错)
最后、在Edit->Patch_program->apply patch to:中保存修改。
2)、将程序拖入kali虚拟机中运行,任意输入即可得到flag:
虚拟机中运行程序报错,权限不够:
Chmod u+x patchme(提升权限,让其可以执行)
与手动还原得到的flag一致。