Hacking/System technique / / 2016. 3. 4. 14:42

Memory Leak (메모리 릭) - recv , strncpy 함수등

메모리 릭이란 로컬익스플로잇보다 리모트익스플로잇 할때에 많이 사용하며 메모리릭을 통해 서버의환경 프로세스 메모리정보등을 알아오면 익스플로잇을 하기 쉽기때문에 자주 이용한다.


case1) 변수와 변수가 널바이트없이 이어져서 문자열 출력함수에서 이어진변수를 모두 출력하는경우


*변수와 변수가 null바이트 없이 이어져서 다음 secretmessage[] 부분의 null바이트를 만나기전까지 출력됨


끝에 null 바이트를 붙이지 않는함수 recv , strncpy등


소스코드

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <time.h>


main(){


char secretmessage[] = "You leaked my memory!"; char buf[256];

char msg[1024];

int serverfd, clientfd;

int pid;

struct sockaddr_in server, client;

serverfd = socket(AF_INET, SOCK_STREAM, 0); memset(&server, 0, sizeof(server));

server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(1234);

bind(serverfd, (struct sockaddr*)&server, sizeof(server));

listen(serverfd, 10);

while(1){

clientfd = accept(serverfd, 0, 0); pid = fork();

if(!pid){

memset(buf, 0, sizeof(buf)); memset(msg, 0, sizeof(msg)); send(clientfd, "MSG: ", 6, 0);

recv(clientfd, buf, 256, 0); snprintf(msg, 300, "%s", buf); send(clientfd, msg, strlen(msg), 0);

}

else {

close(clientfd);

}

}

close(serverfd);

return 0;

}



ida로 본 프로그램의 main함수 상황

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)

{

  size_t v3; // eax@3

  int v4; // [sp+2Ch] [bp-534h]@1

  uint32_t v5; // [sp+30h] [bp-530h]@1

  __int16 v6; // [sp+3Eh] [bp-522h]@3

  __int16 v7; // [sp+43Eh] [bp-122h]@3

  signed int v8; // [sp+53Eh] [bp-22h]@1

  signed int v9; // [sp+542h] [bp-1Eh]@1

  signed int v10; // [sp+546h] [bp-1Ah]@1

  signed int v11; // [sp+54Ah] [bp-16h]@1

  signed int v12; // [sp+54Eh] [bp-12h]@1

  signed __int16 v13; // [sp+552h] [bp-Eh]@1

  __pid_t v14; // [sp+554h] [bp-Ch]@2

  int v15; // [sp+558h] [bp-8h]@2

  int v16; // [sp+55Ch] [bp-4h]@1

}


bp-122 위치에 버퍼가 v7라는 변수명으로 표시되어있고 그다음 bp-100차이가 나면서 secretmessage[] 부분이 4바이트씩 잘려져 변수에 들어가고 있다.

0x100 = 256


그래서 리모트로 A를 256개를 집어넣어주면 

root@ubuntu:/home/art1sts/Desktop# nc localhost 1234

MSG: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYou leaked my memory!


recv함수가 null바이트로 끝나지 않기 때문에 다음 변수위치인 secretmessage까지 출력되는 것이다.


문서참조 (cd80님의 MEMORY LEAK TECHNIQUES http://cd80.tistory.com)

 



'Hacking > System technique' 카테고리의 다른 글

PLT, GOT, Dynamic Linker  (0) 2016.05.24
Memory Leak & Stack Canary  (0) 2016.03.09
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유