因此,我正在尝试利用具有缓冲区溢出漏洞的程序来获取/返回锁定的.txt(read_secret())背后的秘密。
vulnerable.c //此处无修改
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void read_secret() {
FILE *fptr = fopen("/task2/secret.txt", "r");
char secret[1024];
fscanf(fptr, "%512s", secret);
printf("Well done!\nThere you go, a wee reward: %s\n", secret);
exit(0);
}
int fib(int n)
{
if ( n == 0 )
return 0;
else if ( n == 1 )
return 1;
else
return ( fib(n-1) + fib(n-2) );
}
void vuln(char *name)
{
int n = 20;
char buf[1024];
int f[n];
int i;
for (i=0; i<n; i++) {
f[i] = fib(i);
}
strcpy(buf, name);
printf("Welcome %s!\n", buf);
for (i=0; i<20; i++) {
printf("By the way, the %dth Fibonacci number might be %d\n", i, f[i]);
}
}
int main(int argc, char *argv[])
{
if (argc < 2) {
printf("Tell me your names, tricksy hobbitses!\n");
return 0;
}
// printf("main function at %p\n", main);
// printf("read_secret function at %p\n", read_secret);
vuln(argv[1]);
return 0;
}
attack.c //要编辑
#!/usr/bin/env bash
/task2/vuln "$(python -c "print 'a' * 1026")"
我知道,如果我打印足够大的字符串,可能会导致段错误,但这并不能帮助我。我试图通过覆盖堆栈上的返回地址来使程序执行read_secret,然后返回到read_secret函数,而不是返回main。
但是我很困在这里。我知道我必须使用GDB来获取read_secret函数的地址,但是我有点困惑。我知道我必须用read_secret函数的地址替换main()地址,但是我不确定如何。
谢谢
答案 0 :(得分:0)
如果要通过缓冲区溢出漏洞执行功能,则必须首先确定可以获取段错误的偏移量。在您的情况下,我假设其值为1026。整个游戏是覆盖eip(告诉程序下一步该做什么),然后添加您自己的指令。
要添加自己的指令,您需要知道该指令的地址,然后在gdb中打开程序,然后输入:
glCompressedTexStorage*
然后复制地址。然后,您必须将其转换为大字节序或小字节序格式。我使用python中的struct模块来做到这一点。
x function name
然后,您必须将其添加到二进制输入中,如下所示: python -c“打印'a'* 1026 +'the_address'” | / task2 / vuln #在bash shell上,不在脚本中
如果所有这些都不起作用,则只需在偏移量中再添加几个字符即可。可能有您看不到的东西。
import struct
struct.pack("<I", address) # for little endian for big endian its different
希望能回答您的问题。