我有这样的C代码:
#includevoid x(int argc, char** argv) { printf(argv[0]); } int main(int argc, char** argv) { char* secret = "SECRET"; if (argc < 2) x(argc, argv); }
我现在想做一个格式字符串攻击来打印shell的秘密.但是,我不知道如何获取我想要argv [0]的字符串以及如何从另一个范围访问数据(因为从x开始,它无法直接寻址指针秘密.
我该怎么办?
在unix中,程序以execve
(或其中一个包装器,例如execlp
)启动.所有exec*
函数都允许您传递任意字符串argv
,包括argv[0]
.
如果您是从shell以交互方式执行此操作,请查看exec
内置函数:
( exec -a '%x...' ./prog )
parens创建一个子shell,exec
加载并运行./prog
到子shell进程中,参数to -a
用作argv[0]
.
至于如何访问变量,请查看生成的汇编代码.如果secret
存储在堆栈中并printf
从堆栈中提取参数,则可以通过指定足够的%x
指令(后跟%s
)来获得所需的结果.