首先查看文件信息:
1 | Arch: amd64-64-little |
使用IDA打开程序,发现程序核心逻辑如下:
1 | int sub_40138F() |
首先,fgets(s, n, stdin)
处存在off-by-null的栈溢出,可以使得fd最后一个字节为0:
1 | .data:0000000000404014 dword_404014 dd 2Ch ; DATA XREF: sub_40138F+B6↑r |
那么if ( read(fd, &v3, dword_404014) )
处则为true,可以从&v3
处写入2C字节的数据,从而控制buf
的地址,进而控制程序流。
在上述if内部还存在if ( !read(fd, buf, dword_404010) )
,我们可以依靠其与buf
进行任意地址写。
由于2C字节的限制,我们尝试进行栈迁移,并利用mprotect进而执行shellcode。
exp如下:
1 | from pwn import * |
