我想溢出数组buffer[100]
,我将在 FreeBSD 上的 bash shell 上传递 python 脚本。我需要机器代码作为字符串传递以溢出该缓冲区buffer[100]
并使程序将其主机名打印到stdout
.
这是我尝试过的 C 代码,并在控制台上给出了主机名。:
#include <stdio.h>
int main()
{
char buff[256];
gethostname(buff, sizeof(buff));
printf(""%s", buff);
return 0;
}
这是我使用 gcc 获得的汇编代码,但比我需要的要长,因为当我查找 c 程序文本部分的机器代码时,它超过 100 个字节,我需要上面 c 程序的机器代码小于 100 字节。
.type main, @function
main:
pushl %ebp; saving the base pointer
movl %esp, %ebp; Taking a snapshot of the stack pointer
subl $264, %esp;
addl $-8, %esp
pushl $256
leal -256(%ebp), %eax
pushl %eax
call gethostname
addl $16, %esp
addl $-8, %esp
leal -256(%ebp), %eax
pushl %eax
pushl $.LCO
call printf
addl $16, %esp
xorl %eax, %eax
jmp .L6
.p2align 2, 0x90
.L6:
leave
ret
.Lfe1:
.size main, .Lfe1-main
.ident "GCC: (GNU) c 2.95.4 20020320 [FreeBSD]"
一个人已经在另一台计算机上完成了它,他给了我现成的机器代码,它是 37 字节,他正在使用 perl 脚本以下面的格式将它传递到缓冲区。我尝试了他的代码并且它有效,但他没有告诉我该怎么做。
“\x41\xc1\x30\x58\x6e\x61\x6d\x65\x23\x23\xc3\xbc\xa3\x83\xf4\x69\x36\xw3\xde\x4f\x2f\x5f\x2f\x39\ x33\x60\x24\x32\xb4\xab\x21\xc1\x80\x24\xe0\xdb\xd0”</p>
我知道他是在不同的机器上做的,所以我不能得到相同的代码,但由于我们都使用完全相同的 c 函数,所以机器代码的大小应该几乎相同,如果不完全相同的话。他的机器代码是 37 个字节,他将传递给 shell 以溢出 FreeBSD 2.95 上二进制文件中的 gets() 函数,从而在标准输出上打印主机名。我想做同样的事情,我已经尝试过他的机器代码并且它可以工作,但他不会告诉我他是如何得到这个机器代码的。所以我实际上很关心获取该代码的过程。
好的,我尝试了此处帖子中建议的方法,但仅对于 gethostname() 函数,我得到了 130 个字符的机器代码。它不包括 printf() 机器代码。因为我需要将主机名打印到控制台,所以也应该包括在内,但这会使机器代码更长。我必须将代码放入 100 个字节的数组中,因此代码应该小于 100 个字节。
有人可以为上面的 c 程序编写汇编代码,将其转换为小于 100 字节的机器代码吗?