완료됨
stack-2.c 질문

안녕하세요. 왕초보라 그런지
temp 버퍼 위에 auth 값이 존재한다는 말이 이해가 되질 않습니다.
왜 auth 값이 temp 버퍼 위에 존재하게 되는건가요?

#시스템해킹
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
avatar
cdor1
Closed Beta Tester

temp 버퍼 뒤에 auth 값이 존재한다고 수정하였습니다.

해당 check_auth 함수를 디스어셈블하여 변수의 할당 과정과 리턴 과정을 확인하여 보면, ebp-0xcauth 변수가 존재하는 것을 확인할 수 있습니다.
ebp-0x1ctemp 버퍼가 할당되고 strncpy함수를 이용하여 temp 버퍼에 password 버퍼의 데이터를 복사하는 과정을 거치는 것 또한 확인할 수 있습니다.

...
   0x80484f8 <check_auth+18>:   mov    DWORD PTR [ebp-0xc],0x0 // int auth = 0;
   
   0x80484ff <check_auth+25>:   sub    esp,0xc
   0x8048502 <check_auth+28>:   push   DWORD PTR [ebp+0x8] // char *password
   0x8048505 <check_auth+31>:   call   0x8048390 <strlen@plt>

   ...
   0x8048511 <check_auth+43>:   push   DWORD PTR [ebp+0x8] // char *password
   0x8048514 <check_auth+46>:   lea    eax,[ebp-0x1c]
   0x8048517 <check_auth+49>:   push   eax // char temp[16];
   0x8048518 <check_auth+50>:   call   0x80483b0 <strncpy@plt>

   ...
   0x804853a <check_auth+84>:   mov    DWORD PTR [ebp-0xc],0x1 // auth = 1
   0x8048541 <check_auth+91>:   mov    eax,DWORD PTR [ebp-0xc] // auth return
   0x8048544 <check_auth+94>:   mov    ebx,DWORD PTR [ebp-0x4]
   0x8048547 <check_auth+97>:   leave
   0x8048548 <check_auth+98>:   ret

   // auth == [ebp-0xc]
   // temp == [ebp-0x1c]

디버거를 이용하여 스택 레이아웃을 확인하여 보면 아래와 같이 할당되어 있습니다.
gdb-peda$ x/20wx $ebp-0x1c 0xffffd61c: 0x41414141 0x41414141 0x00004141 0x00000000 // <- char temp[16]; 0xffffd62c: 0x00000000 // <- int auth;

이러한 할당 과정으로 인해 auth 변수는 temp 버퍼 뒤에 존재하게 됩니다.

2020.05.25. 02:28