달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'memcpy'에 해당되는 글 1

  1. 2017.07.09 [문제풀이] pwnable.kr - memcpy
2017. 7. 9. 15:15

[문제풀이] pwnable.kr - memcpy Wargames/pwnable.kr2017. 7. 9. 15:15



※ 사전지식


이 문제는 컴퓨터 메모리 상에서 변수에 적용되는 정렬(alignment) 절차와 관련이 있다. 

좀 더 쉬운 이해를 위해 간단한 코드를 짜서 확인해보도록 하겠다. 



위 코드는 굉장히 심플하다. 하나의 구조체를 설정하고 할당한 뒤 그 크기를 확인하는 프로그램이다. 

char 형과 int 형 변수를 포함하는 구조체이기에 크기는 5라고 예상할 수 있겠다. 


일단 실행하고 결과를 확인해보도록 하겠다.



하지만 결과는 예상한 것과는 다르게 8이 나타났다.  

빠밤~~!!

글을 재미있게 쓰는 건 나에게 무리인가 ㅠ.ㅠ!! 이 반전같지 않은 반전!!



왜일까?


이는 컴파일러가 해당 소스를 컴파일 할 때 변수를 4바이트 단위로 재배치하고 패딩을 추가하기 때문이다. 

이렇게 하는 이유는 하지 않았을 때보다 일반적으로 메모리에 접근 속도가 빠르기 때문이다. 


즉 간단히 변환해보면 설정한 구조체는 아래와 같은 모습을 하게 된다. 


tyepdef struct St{ 

  char ch;

  char pad[3];

  int in;

}


하지만 마음에 들지 않는다면 의도적으로 하지 않을수도 있다.  흐으..


사전지식 끝!




※ 문제풀이


자, 그럼 이제 문제풀이로 돌아와서 문제를 그냥 한번 돌려보도록 하자. 



제시한 숫자를 그대로 넣어 돌려보니 "experiment 5"에서 정지되었다. 

원인을 알아보기 위해 소스코드를 확인해보도록 하겠다. 




생소한 어셈블리어들이 들어있었다. 일단 구글링해서 어떤 기능을 하는지 살펴보았다. 






출처 : http://x86.renejeschke.de/html/file_module_x86_id_197.html



 그닥 뭐가 문제인지 잘 감이 안왔었다. 그래서 더 자세히 들여다보았다. 더더더..


출처 : http://x86.renejeschke.de/html/file_module_x86_id_197.html


예외가 발생하는 이유는 저기서 확인할 수 있었다. 만약 메모리 피연산자가 16바이트 단위로 정렬되어 있지 않을 경우 에러가 발생한다는 의미다. 음 그렇구나 싶었다. 대충 메모리 관련 예외라고 짐작은 하고 있었으나 감으로 때려맞추기엔 좀 한계가 있었다. 


결국 해당 코드를 컴파일해서 메모리 위치를 확인하면서 값을 설정해주었다. 






문제풀이 끝!




오랜만에 문제풀이 올리네~ 이래저래 좀 바빠졌지만 틈틈히 하자 !!





'Wargames > pwnable.kr' 카테고리의 다른 글

[문제풀이] pwnable.kr - simple login  (0) 2017.07.09
[문제풀이] pwnable.kr - codemap  (0) 2017.07.09
[문제풀이] pwnable.kr - cmd2  (0) 2017.07.09
[문제풀이] pwnable.kr - asm  (0) 2017.07.09
[문제풀이] pwnable.kr - unlink  (0) 2017.07.09
:
Posted by einai