달력

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:14

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




※ 사전지식


이번 문제 사전 지식은 별도로 기입해놓았다. 

http://krzxy.tistory.com/entry/리눅스-64비트-쉘코드-제작  << 참조하셔요!


사전지식 끝!




※ 문제풀이




문제를 실행시키면 위와 같이 나타난다. 64비트용 쉘코드를 제작해서 입력해달란다. 


위 캡쳐에서도 나타나지만 SECCOMP 기능을 이용하여 내가 사용할 수 있는 시스템 호출을 제한한다. 

이는 코드에서도 확인 가능하다.


또한 내가 생성해서 전달하는 쉘코드를 소스 코드 내에 미리 추가된 쉘코드(?) 뒤에 추가되어 진다. 


위 코드가 뭐하는 지는 일일히 살펴보진 않았고 흐름을 따라가면서 프로세스에 영향을 끼치나만 살펴보았다. 하지만 별로 영향을 끼치진 않아서 쉘 코드를 작성해서 던저버렸다. 


내가 짠 쉘코드는 음 너무 길고 조잡해서 어디다 자랑은 못하겠다. 

어째든 내가 작성한 기계어를 이용해서 로컬에서 동작하는 것을 확인하고 던지니까 정답은 나왔다. 



문제풀이 끝!




나처럼 처음 접하는 사람들을 위해 좋은 팁을 주자면, pwntools에 엄청 쉽게 쉘코드를 작성하는게 있더라..

shellcraft 라고.. 처음은 연습삼아 정석으로 짜보고 좀 익숙해지면 pwntools의 기능을 사용해보길 바란다. 


그럼 뭔가 원시인이 처음 문명을 만났을 때 느낌이 들 것이다. -ㅅ-

(나만 몰랐낭 ㅡㅡ!!?ㅋ)






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

[문제풀이] pwnable.kr - memcpy  (0) 2017.07.09
[문제풀이] pwnable.kr - cmd2  (0) 2017.07.09
[문제풀이] pwnable.kr - unlink  (0) 2017.07.09
[문제풀이] pwnable.kr - uaf  (0) 2017.07.09
[문제풀이] pwnable.kr - mistake  (0) 2017.07.09
:
Posted by einai
2017. 7. 9. 15:14

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



※ 문제풀이 


해당 문제는 unlink 과정을 시뮬레이션하여 메모리를 덮어쓰는 것으로 덮어쓰는 위치를 잘 조정하면 프로그램의 EIP를 변경할 수 있다. 


핵심적으로 이해해야 할 코드 부분은 아래와 같다. 


typedef struct tagOBJ{

  struct tagOBJ* fd;

  struct tagOBJ* bk;

  char buf[8];

}OBJ;


void unlink(OBJ* P) {

  OBJ* BK;

  OBJ* FD;

  BK=P->bk;

  FD=P->fd;

  FD->bk=BK;

  BK->fd=FD;

..... 

int main(int argc, char*argv[]) {


OBJ* A = (OBJ*)malloc(sizeof(OBJ));

OBJ* B = (OBJ*)malloc(sizeof(OBJ));

OBJ* C = (OBJ*)malloc(sizeof(OBJ));

....

gets(A->buf);

....

unlink(B);

return 0;


}


unlink 함수에 전달되는 OBJ 인스턴스를 변조하여 내가 쓰고 싶은 부분에 값을 쓸 수 있다. 

이는 내가 입력한 값에 대한 입력 값 검증이 존재하지 않아 가능하게 된다. 


즉, 내가 A->buf에 입력한 값이 B에 영향을 끼친다. 


이로써 실행 흐름을 변경할 수 있고 결국 플래그를 획득할 수 있게 된다. 



문제풀이 끝!





블로그를 쓰면 쓸수록 성의가 없어지는 것 같네 ㅠㅠ 시간있을 때 조금 더 보충하도록 하겠음!!



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

[문제풀이] pwnable.kr - cmd2  (0) 2017.07.09
[문제풀이] pwnable.kr - asm  (0) 2017.07.09
[문제풀이] pwnable.kr - uaf  (0) 2017.07.09
[문제풀이] pwnable.kr - mistake  (0) 2017.07.09
[문제풀이] pwnable.kr - leg  (0) 2017.07.09
:
Posted by einai
2017. 7. 9. 15:13

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



※ 사전지식 


이번 문제는 Use-After-Free 취약점(이하 UAF 취약점)과 관련된 문제였다. 따라서 문제풀이를 하기 전에 UAF 취약점에 대한 설명을 간단히 하고 넘어가겠다. 


해당 취약점은 Heap 영역에서 발생하는 취약점으로 간단히 말하면 사전에 할당된 Heap 메모리가 프리되고 이를 그대로 할당받을 수 있어서 발생되는 취약점이다. Heap 메모리를 할당한 뒤 해제할 때 메모리 해제 함수를 사용하는데 이 함수는 이를 해제된 힙 리스트에 삽입할 뿐(물론 다른 기능도 수행한다) 내용을 초기화하지 않고 재할당 요청시 그대로 반환한다. 게다가 기존에 명시된 참조 방식으로 그대로 참조도 가능하다. 


캡쳐나 다른 설명없이 너무 글로만 설명해서 확 와닿지 않을 느낌이 든다. 

따라서 간단히 개념을 설명하기 좋을 사이트를 아래에 별도로 명시해놓겠다.  :)


사전지식 끝!



※ 문제풀이


해당 문제는 아래와 같은 화면으로 나타난다. 




화면에 나타난 각 번호들을 선택하면 그에 맞는 행위를 한다. 간단히 해당 영역에 있는 소스코드를 확인해보자. 



각 번호마다 하는 행위는 위와 같다. 


1번은 각 클래스의 멤버함수를 호출하고 

2번은 내가 전달한 파라미터를 기반으로 데이터를 읽어온다.

3번은 할당한 클래스를 삭제한다. 


자 그럼 대충 문제가 어떤식으로 흘러갈지 눈에 들어오지 않는가!?


기존 UAF 취약점 정의에 따라 사용하고 제거한 뒤 재사용하는 흐름에 따라가면 된다. 

여기에서는 가상함수 테이블을 저장했었던 곳을 변경하여 답을 얻을 수 있다. 




짜잔~


문제풀이 끝!






Reference

[1] Use-After-Free, http://revers3r.tistory.com/156

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

[문제풀이] pwnable.kr - asm  (0) 2017.07.09
[문제풀이] pwnable.kr - unlink  (0) 2017.07.09
[문제풀이] pwnable.kr - mistake  (0) 2017.07.09
[문제풀이] pwnable.kr - leg  (0) 2017.07.09
[문제풀이] pwnable.kr - input  (0) 2017.07.09
:
Posted by einai