文件加壳了 先给它去壳
upx -d 文件地址
把文件拖入ida 发现没办法F5查看伪c代码
这里发现了jnz 这是无用字节 也就是花指令
那什么是花指令呢?
花指令是企图隐藏掉不想被逆向工程的代码块(或其它功能)的一种方法,在真实代码中插入一些垃圾代码的同时还保证原有程序的正确执行,而程序无法很好地反编译, 难以理解程序内容,达到混淆视听的效果。
具体可以看这位师傅的博客
https://blog.csdn.net/m0_51246873/article/details/127167749
那我们现在需要把花指令消除掉,这里需要nop指令
NOP指令:号称最安全的指令,全名为no Operation,一条nop指令占用一个字节,什么也不做。有时编译器会使用该指令将代码对齐到偶数地址边界(类似于内存对齐)。IA-32处理器从偶数双字地址处加载代码和数据时会更快
将jnz指令右键nop掉
call near ptr 0EC85D78Bh这个指令不能nop掉 因为字符串可能存在有效信息
先把字符串转换为字节数据 按d转换
接下来尝试先把最高位数据nop掉,之后尝试建立主函数
从main开始选中关键代码 建立主函数
按p键建立主函数 然后F5查看主函数源码
看到adsw 猜测是迷宫题 继续跟进 找到迷宫的主要内容
是一个10*7的迷宫
def main():
maze = "*******+********* ****** **** ******* **F****** **************"
# 假设每列宽为10个字符(这个值可能需要根据迷宫的实际布局进行调整)
column_width = 10
# 将迷宫字符串分割为多行
rows = [maze[i:i + column_width] for i in range(0, len(maze), column_width)]
# 打印每行
for row in rows:
print(row)
if __name__ == "__main__":
main()
*******+**
******* **
**** **
** *****
** **F****
** ****
**********
这个出迷宫是从+进F出 而w上s下a左d右 一共14步
得到flag{ssaaasaassdddw
}