tmxklab

[Pwnable.xyz] misalignment 본문

War Game/Pwnable.xyz

[Pwnable.xyz] misalignment

tmxk4221 2020. 3. 27. 19:45

1. 문제

nc svc.pwnable.xyz 30003

 

1) 문제 확인

세 개의 인자 값을 받을 수 있으며 int형이 아닌 값이 들어오면 프로그램이 종료됨

 

2) 함수 확인

 

 

3) IDA(hex-lay) - 메인 함수

- 13번째 줄 : v5[7]에 "0xdeadbeef"값 초기화

- 14번째 줄 : 3개의 int형 인자 값을 받고 -7<= v8 <=9인 경우 while문이 반복되며 이 중 하나라도 참이아니면 빠져나감

- 16번째 줄 : v5[8*v8+48] = v6+v7

- 19번째 줄 : v5[7]이 "0xb000000b5"인 경우 win함수 실행

 

 

4) IDA(hex-lay) - win함수

 

5) 메모리 보호기법 및 파일 정보 확인

- 64bit elf파일이며 동적 라이브러리를 사용, not stripped되어 있어 심볼 정보가 남아 있음

 


 

2. 접근 방법

win함수를 실행시키기 위해서 "0xdeadbeef"값이 저장되어 있는 v5[7]이 "0xb000000b5"로 바꾸어야 함

 

1) 디버깅

1-1) 입력 값(v6, v7, v8)을 1, 1, -6을 주었을 때

 

1-2) 입력 값(v6, v7, v8)을 1, 1, -5을 주었을 때

 

1-3) if v5[7] == 0xb000000b5

v5[7] : [rbp-0x91]에 위치하며 0x00000000deadbeef가 저장되어 있음

 

2) 스택 구조 확인

디버깅한 결과를 바탕으로 스택구조와 주소 값을 확인해보면 위와 같다.

 

3) QWORD

- v7의 -6, -5을 주었을 때 v5[0], v5[8]이 위치하는 이유는 QWORD때문이다.

- QWORD는 8bytes단위로 끊으므로 v7의 값을 조작하여 바로 v5[7]에 접근할 수 없다.

- 하지만, 다시 스택 구조를 확인해보면 넣을 수 있는 방법이 존재한다.(while문이 계속 반복하므로)

 

 

결론)

  •  v5[0]과 v5[8]에 0xb000000b5값을 나눠서 덮어씌우면 나중에 if문을 통과하여 win함수를 실행할 수 있다.

 


 

3. 풀이

1) v5[0], v5[8]에 넣어야할 값

1-1) v5[0] : 0xb5 00 00 00 00 00 00 00 -> 0xb500000000000000 -> -5,404,319,552,844,595,200(십진수)

1-2) v5[8] : 0x00 00 00 00 0b 00 00 00 → 0xb000000 → 184,549,376(십진수)

 

2) 디버깅

2-1) 입력 값(v6, v7, v8)을 (0, -5,404,319,552,844,595,200, -6)으로 입력한 경우

- v5[7]에는 0xb5가 들어 있음

 

2-2) 입력 값(v6, v7, v8)을 (0, 184,549,376, -5)로 입력한 경우

- v5[7]이후의 값이 잘 들어와 있으며 0xb000000b5가 완성되어 있음

 

2-3) if문 확인

- if문이 만족하여 win함수를 call하는 부분

 

3) 공격실행

'War Game > Pwnable.xyz' 카테고리의 다른 글

[Pwnable.xyz] free spirit  (0) 2020.03.30
[Pwnable.xyz] grownup  (0) 2020.03.30
[Pwnable.xyz] add  (0) 2020.03.07
[Pwnable.xyz] sub  (0) 2020.03.07
[Pwnable.xyz] welcome  (0) 2020.03.07
Comments