从命令输出在 GDB 中设置环境变量
set environment variable in GDB from output of command
我试图在挑战中利用缓冲区溢出,缓冲区从环境变量中获取它的值。
在 GDB 中,我知道您可以使用以下命令设置环境变量:
set environment username = test
但是我需要传递用户名变量特殊字符,所以我需要做类似的事情:
set environment username= $(echo -e '\xff\x4c......')
但是那个命令没有执行,用户名变量包含我写下的字面意思,有人知道将特殊字符传递给环境变量的技巧吗?
好吧,如果你真的需要这样做 来自 GDB,这里有一个例子:
hello.c
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv) {
printf("argv[1]=%s\n", argv[1]);
printf("VAR=%s\n", getenv("VAR"));
return 0;
}
示例:
$ gcc -g -o hello hello.c
$ gdb ./hello
...
(gdb) set exec-wrapper bash -c 'exec env VAR="`echo myEnv`" "$@"' --
(gdb) r myArg
...
argv[1]=myArg
VAR=myEnv
将VAR
和echo myEnv
更改为您需要的变量和命令。
但请注意,在启动 GDB 之前从 shell 设置 VAR
也有效:
$ VAR=`echo Hey there` gdb ./hello
...
(gdb) r myArg
...
argv[1]=myArg
VAR=Hey there
从shell命令行启动gdb时,可以指定运行、with which arguments (with --args
)哪个程序,甚至可以借助[=]修改程序的环境12=]!
我就是这样成功的:
gdb --ex=run --args env LD_BIND=now LD_DEBUG=libs \
apt-get install --yes $(cat pkgs-to-install-to-crash-apt)
--ex=run
是要求gdb立即运行它。
我试图在挑战中利用缓冲区溢出,缓冲区从环境变量中获取它的值。 在 GDB 中,我知道您可以使用以下命令设置环境变量:
set environment username = test
但是我需要传递用户名变量特殊字符,所以我需要做类似的事情:
set environment username= $(echo -e '\xff\x4c......')
但是那个命令没有执行,用户名变量包含我写下的字面意思,有人知道将特殊字符传递给环境变量的技巧吗?
好吧,如果你真的需要这样做 来自 GDB,这里有一个例子:
hello.c
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv) {
printf("argv[1]=%s\n", argv[1]);
printf("VAR=%s\n", getenv("VAR"));
return 0;
}
示例:
$ gcc -g -o hello hello.c
$ gdb ./hello
...
(gdb) set exec-wrapper bash -c 'exec env VAR="`echo myEnv`" "$@"' --
(gdb) r myArg
...
argv[1]=myArg
VAR=myEnv
将VAR
和echo myEnv
更改为您需要的变量和命令。
但请注意,在启动 GDB 之前从 shell 设置 VAR
也有效:
$ VAR=`echo Hey there` gdb ./hello
...
(gdb) r myArg
...
argv[1]=myArg
VAR=Hey there
从shell命令行启动gdb时,可以指定运行、with which arguments (with --args
)哪个程序,甚至可以借助[=]修改程序的环境12=]!
我就是这样成功的:
gdb --ex=run --args env LD_BIND=now LD_DEBUG=libs \
apt-get install --yes $(cat pkgs-to-install-to-crash-apt)
--ex=run
是要求gdb立即运行它。