완료됨
stack-2.c 질문
안녕하세요. 왕초보라 그런지
temp 버퍼 위에 auth 값이 존재한다는 말이 이해가 되질 않습니다.
왜 auth 값이 temp 버퍼 위에 존재하게 되는건가요?
#시스템해킹
작성자 정보
답변
1
cdor1
Closed Beta Tester
temp
버퍼 뒤에 auth
값이 존재한다고 수정하였습니다.
해당 check_auth
함수를 디스어셈블하여 변수의 할당 과정과 리턴 과정을 확인하여 보면, ebp-0xc
에 auth
변수가 존재하는 것을 확인할 수 있습니다.
ebp-0x1c
에 temp
버퍼가 할당되고 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 버퍼 뒤에 존재하게 됩니다.