tmxklab
[Pwnable.xyz] misalignment 본문
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 |