format2

oogu ㅣ 2023. 1. 24. 11:25

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int target;

void vuln()
{
  char buffer[512];

  fgets(buffer, sizeof(buffer), stdin);
  printf(buffer);
  
  if(target == 64) {
      printf("you have modified the target :)\n");
  } else {
      printf("target is %d :(\n", target);
  }
}

int main(int argc, char **argv)
{
  vuln();
}

printf(buffer) -> fsb 가 일어난다.

[그림 1-1]

4번째 %p에서 AAAA가 출력된다.

왜? 4번째 %p에서 AAAA가 출력이 될까? gdb로 봐보자

[그림 1-2]

printf를 실행하기전 인자값("AAAA%p %p %p %p %p")를 스택에 넣고 printf 함수를 실행하는데, %p는 차례대로 [esp+4], [esp+8], [esp+12], [esp+16] 을 출력하게된다. 4번째 %p([esp+16]) 에 AAAA가 있기 때문에 AAAA가 출력이되는 것이다.

 

따라서 AAAA에 target의 주소를 넣고 4번째 %p를 %n으로 바꾸면 target의 값이 씌여질 것이다.

[그림 1-3]

gdb를 통해 target의 주소를 구하고 [그림 1-3]를 보내본다.

target에 4가 쓰인 이유는 %4$n을 하기전 4byte(target 주소)가 들어가 있기 때문이다.

하지만 60이 부족하다.

[그림 1-4]

%4%n을 하기전 %60c 를 통해 부족한 60을 채워버리면 64만큼 출력하기 때문에 target에 64가 씌여 문자열이 출력된다.

 

 

'protostar' 카테고리의 다른 글

format4  (0) 2023.01.24
format3  (0) 2023.01.24
format0  (0) 2023.01.24
stack7  (0) 2022.09.11
stack6  (0) 2022.09.09