如何使用gdb从可执行文件调用带有参数的func

如何使用gdb从可执行文件调用带有参数的func,gdb,executable,buffer-overflow,ghidra,Gdb,Executable,Buffer Overflow,Ghidra,我需要使用GDB在可执行文件中运行程序的帮助 我有一个可执行文件名vuln。我不知道源代码,因为我正在做一个CTF。在分析可执行文件时,我发现了三个令人兴奋的函数:main、vuln和flag。Vuln func易受BOF攻击,但我不想这样做。我试图在gdb中运行可执行文件,我使用print(void)flag(param1,param2)命令直接运行flagfunc,因为这应该给我一个标志;然而,它不工作,因为它说我的参数是不正确的,我肯定不是。我也发现了跳跃函数,但我不能传递任何参数 那么,

我需要使用GDB在可执行文件中运行程序的帮助

我有一个可执行文件名
vuln
。我不知道源代码,因为我正在做一个CTF。在分析可执行文件时,我发现了三个令人兴奋的函数:
main
vuln
flag
。Vuln func易受BOF攻击,但我不想这样做。我试图在gdb中运行可执行文件,我使用
print(void)flag(param1,param2)
命令直接运行
flag
func,因为这应该给我一个标志;然而,它不工作,因为它说我的参数是不正确的,我肯定不是。我也发现了跳跃函数,但我不能传递任何参数

那么,有没有办法从带有参数的可执行文件中正确运行函数,否则我将不得不经历BOF的痛苦

下面是GHIDRA对FLAG和VULN Func的反汇编代码

void flag(int param_1, int param_2){
    char local_50 [64];
    FILE *local_10;

    local_10 = fopen("flag.txt", "r");
    if(local_10 != (FILE *)0x0){
        fgets(local_50, 0x40, local_10);
        if ((param_1 == -0x21524111) && (param_2 == -0x3f212ff3)){
            printf(local_50);
        }
        return;
    }
    puts("Hurry up and try in on server side.");
    exit(0);
}

void vuln(void)
{
    char local_bc [180];
    gets(local_bc);
    puts(local_bc);
    return;
}
print(void)标志(param1,param2)

不确定您的
param1
param2
的值是多少,但这似乎对我来说很好:

echo "hello" > flag.txt
gdb -q ./a.out

(gdb) start
Temporary breakpoint 4 at 0x555555555307
Starting program: /tmp/a.out

Thread 1 "a.out" hit Temporary breakpoint 4, 0x0000555555555307 in main ()
(gdb) p (void)flag(-0x21524111,  -0x3f212ff3)
hello
$2 = void
(gdb)

当您尝试调用函数时,gdb的确切错误消息是什么?实际上没有错误消息。由于我的变量不匹配,只有“puts”(“快点,在服务器端尝试”);“行运行,if语句从未执行。我想,您可以将
rip
更改为指向flag
flag()
,准备内存或修改用于比较的标志以指导执行,但是,目标是从远程计算机而不是你的计算机上读取
flag.txt
,这样你就不会得到真正的标志。