본문으로 바로가기

pwnable.xyz / Welcome

category Wargame/pwnable.xyz 2020. 1. 13. 17:54
  chunk1 = malloc(0x40000uLL);
  *chunk1 = 1LL;
  _printf_chk(1LL"Leak: %p\n"chunk1);

 

먼저 malloc(0x40000); 을 호출하고, 할당받은 영역의 첫 바이트에 1을 쓴 뒤 해당 영역의 주소를 알려준다.

 

  _printf_chk(1LL"Length of your message: ");
  _isoc99_scanf("%lu", &size);
  chunk2 = (char *)malloc(size);
  _printf_chk(1LL"Enter your message: ");
  read(0chunk2size);
  chunk2[size - 1] = 0;
  write(1chunk2size);

 

다음으로 유저가 정수를 입력하고, 그 값을 크기로 malloc 을 호출해서 새 chunk를 할당받는다.

 

  if ( !*chunk1 )
    system("cat /flag");

 

마지막에는 chunk1[0] 의 값이 0일 때 플래그를 준다.

 

일반적인 상황에서는 chunk1chunk2 가 겹쳐질 일이 없으므로 chunk1[0] 의 값을 0으로 만드는 게 불가능하다. 하지만 size 가 매우 큰 값이라면 malloc 에서 메모리 할당에 실패하여 NULL을 리턴하고, 이 값이 chunk2 가 되기 때문에 const memory에 0을 쓰는 게 가능해진다. 따라서 (leak 된 주소값)+1 을 메시지 길이로 설정해 주면 원래 1이 쓰여있던 위치에 0을 쓸 수 있고, 플래그를 가져올 수 있다.

 

 

 

Last update: 10/22/2020

'Wargame > pwnable.xyz' 카테고리의 다른 글

pwnable.xyz / note  (0) 2020.01.13
pwnable.xyz / GrownUp  (0) 2020.01.13
pwnable.xyz / misalignment  (0) 2020.01.13
pwnable.xyz / add  (0) 2020.01.13
pwnable.xyz / sub  (0) 2020.01.13