花式栈溢出技巧----Stack smash

学习文献:https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/others/#stack-smash

以前遇见过一次这种情况,但是是不求甚解的完成了,这次慢慢分析一下原理

栈保护和NX字段都开启了,这里科普一下栈保护,我喜欢叫它金丝雀,链接:https://blog.csdn.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()

猜你喜欢

转载自blog.csdn.net/qq_42192672/article/details/83105511