- 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 $eax
或jmp $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放在环境变量里了