附件为 ELF 64 位程序,逻辑是猜数字游戏:程序生成 0~99 随机数,允许猜 10 次,全部猜对输出 Flag。
直接使用objdump命令提取主函数 查看 main 函数定位核心逻辑:
objdump -d attachment | sed -n '/<main>:/,/^$/p'
关键比较逻辑:
40484b: 8b 85 c4 d8 ff ff mov -0x273c(%rbp),%eax # 用户输入 404851: 39 85 cc d8 ff ff cmp %eax,-0x2734(%rbp) # 与正确答案比较 404857: 75 46 jne 40489f # 错误跳转
正确答案存放在:$rbp-0x2734
设置 Intel 汇编格式,并在比较指令下断点:
(gdb) set disassembly-flavor intel (gdb) b *0x404851
运行程序:
(gdb) run
随便输入数字触发断点,查看内存中的正确答案:
(gdb) x/wd $rbp-0x2734 0x7fffffffa6dc: 73
成功获取随机数,证明可以直接从内存读取答案。
编写断点脚本command1,每次自动将 eax 修改为正确答案,实现 10 次连对:
(gdb) command 1 Type commands for breakpoint(1), one per line. End with a line saying just "end". set $eax = *(int*)($rbp - 0x2734) silent printf ">> Hooked! Correct value was: %d\n", $eax continue end
重新运行程序,每次随便输入数字,脚本自动修正:
(gdb) run
连续猜对 10 次后输出 Flag:
Continuing.
You are right!
The flag is moectf{open_your_IDA_and_start_reverse_engineering!!}.
Thanks for your playing!moectf{open_your_IDA_and_start_reverse_engineering!!}