메모리 릭이란 로컬익스플로잇보다 리모트익스플로잇 할때에 많이 사용하며 메모리릭을 통해 서버의환경 프로세스 메모리정보등을 알아오면 익스플로잇을 하기 쉽기때문에 자주 이용한다.
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까지 출력되는 것이다.
'Hacking > System technique' 카테고리의 다른 글
PLT, GOT, Dynamic Linker (0) | 2016.05.24 |
---|---|
Memory Leak & Stack Canary (0) | 2016.03.09 |