달력

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
2017. 7. 9. 15:16

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



※ 사전지식


Dynamic Binary Analysis & Dynamic Binary Instrumentation 


바이너리 동적 분석을 얼마나 어떻게 효율적으로 할 수 있는가 ?!

 Answer : 나같은 평민은 남들이 잘 만들어놓은 툴을 사용해라!! 

 

 

사전지식 끝! 





※ 문제풀이 


음 이 문제는 제목이 곧 답이 될 수가 있다. 

문제의 제목으로 개발된 툴이 있더라. 좋은 툴인 것 같더라. 



본론으로 돌아와서 해당 문제는 주어진 바이너리를 분석한 뒤 질문한 내용에 답을 해주는 형식으로 풀게 된다. 







[그림 1]


일단 문제가 어떤 유형인지 대충 감을 잡았으니 바이너리를 분석해보도록 하겠돠.

일단 파일을 실행시키면 멘트가 뜬다. 


[그림 2]


1000개의 힙을 랜덤사이즈로 만든다고 한다. 게다가 각 청크는 랜덤 스트링을 가진다고 한다. 엔터를 누르라고 한다.


그래서 난 엔터를 눌렀다. 쩜쩜



간단히 올리디버거로 파일을 오픈한 뒤 문제에서 주의깊게 보라고 한 지점에 bp를 걸고 확인해보도록 하겠다. 


[그림 3]


딱 보면 알겠지만 EAX는 청크의 크기를, EBX는 문자열을 가리키고 있다. 


그럼 이제 선택의 시점이다. 


하나하나씩 분석하던지!! 

좋은 툴을 찾던지!!!!!

아니면 툴을 개발하던지!!!!!!


나같은 경우는 걍 남이 만들어놓은 걸 활용했당. ^^^^^^^^^^^^^



[그림 4]



문제풀이 끝!





:
Posted by einai
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
2017. 7. 9. 15:15

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



※ 사전지식


내장 명령어 

리눅스 쉘에서 내장 명령어라는 것이 존재한다. 

흔히 쉘 스크립트를 짤 때 주로 생성되는 것이다. 

i.e) for, read, etc 


8진수 

본 쉘(Bourne Shell)에서는 에코 명령어를 사용했을 때 아스키코드의 8진수 값을 허용한다. 

다른 쉘에서도 이와 같은 행위가 동작하는 지는 모르겠다. 일단 bash 쉘에서 해봤을 땐 먹히지 않았다. 


위 말이 좀 애매하니 간단히 예를 하나 들어보겠다. 



8진수로 88는 16진수로 2d인데 이 값은 아스키 값을 "-"를 나타낸다. 

따라서 내가 echo "\55krzxy" 라고 입력했을 때 출력은 -krzxy 로 나타나게 된다. 


사전지식 끝!




※ 문제풀이


이건 뭐 사전지식이 곧 문제풀이와 직결되기 때문에 별도의 설명이 필요할까 싶다. 


간단히 문제설명만 하자면 "=, PATH, export, /, `, flag" 문자열을 넣지 않고 system 함수에 인자를 전달하는 방법이다. 

물론 환경변수는 초기화되고 내가 입력한 값으로 플래그를 읽어야되는 조건이다. 


사전지식으로 문제풀이를 대체하겠다. - - 


문제풀이 끝!



워게임 경험이 없어서 그런지, 아님 공부가 덜 됬는지 모르겠지만 리버싱.kr부터 포너블.kr까지 매 문제가 새롭당.

왜 이쪽은 익숙함이라는게 없을까나 ㅠ.ㅠ







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

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