(matrix 문제)



Backdoor 워게임 사이트의 matrix문제이다다른 엉뚱한 곳 파다가 쉽게 풀수 있었던 문제를 돌아가서 풀게된 문제이다.

먼저 바이너리를 받아서 handray로 직접 c로 바꾸었다.




(main 중 구문)


위와 같이 main문에서 choice를 입력받고 이름을 입력받은 후해당 choice에 따라 함수가 분기되는 구문이 있었다.



(zion 함수)


zion이라는 함수가 system 함수를 사용하고 있고 공략할 만한 부분이었다. Snprintf를 이용해서 buffer에다가 name %s에 치환시켜 3번째 인자를 저장한다그리고 그 버퍼를 system 함수로 실행한다.



(command injection 구상)


나는 이 구문에서 sql injection과 같이  ;를 이용해서 중간에 내가 원하는 /bin/sh을 실행시킬 생각이었다즉 이름에는 나의 payload가 들어가야하고 zion이라는 함수가 실행되어야한다.
 
Zion을 실행시키기위해서는 choice 0이 되어야하는데 0이 되면 입력을 다시 받으라고 한다정상적으로 쓰지 못한다. Zion을 실행시키기 위해 프로그램을 더 분석하던 중 zion으로 넘어갈 수 있을 만한 껀덕지를 발견했다.



(blue_pill 함수 중)


Blue_pill 함수안에 있는 내용이다여기서 zion실행 문장까지 내려가려면 조건이 이름이 Neo여야하고 입력받는 배열을 7사이즈로 해야하고 A*B의 결과가 특정 값이어야한다
Neo에다가 뒤에 null을 붙이고 나의 명령 payload를 붙여서 보내야지하고 생각했다.(잘못된 생각이었고 방향을 바꾸었어야했다.)



(기대값)



A*B의 값이 위와같이 나와야한다.




(기대값 수치)



Gdb 메모리 값을 파일로 정리했다그 값을 파이썬을 이용하여 10진수로 바꿀 것이다.



(matric 출력코드)


값을 해당 배열의 위치를 고려하여 출력하였다.



(exploit)



그렇게 해서 태어난 exploit코드
A의 값에는 해당값과 B에는 곱셈의 항등원으로 7x7 단위행렬을 넣어주어 곱셈의 결과가 기대되는 행렬이 나오도록 하였다.



(실패)



Zion을 실행까지 왔다그러나… 
 
놓치고 있었던 것….
%s 또한 문자열을 인식하는거니까 name에 null까지만 넣는다

, Neo뒤에 null을 추가하고 뒤에 payload를 넣는다는 생각은 너무 짧았었다..



(메모리 상황)



생각을 바꾸어 choice값을 0으로 만들 방법을 생각했다.

마침 name바로 위에 있으니 덮어 쓸 수 있지 않을 까 생각했다.



(입력값 검증 헛점)



입력값을 name배열만큼 검열하는 듯했지만 자세히 보니 아주 작은 헛점이 있었다.
맨 마지막의 개행문자를 null로 바꾸어준다그런데 딱 해당하는 길이가 넘어오면 걸리지 않았다
즉 비교문에 =이 빠져 한바이트를 null로 덮어쓸수 있었던 것이고 zion을 실행시킬 수 있었다.



(exploit)


다시 작성한 exploit 코드



(쉘 획득)



문제 해결!

*저건 플래그가 아니고 저 파일을 읽어야합니다 :)

'WarGame > 500 Project' 카테고리의 다른 글

(66/500) pwnable.kr - rsa_calculator  (1) 2018.03.10
(65/500) pwnable.kr - echo2  (0) 2018.03.08
(63/500) pwnable.kr - syscall  (2) 2017.10.22
(62/500) NOE.systems - BURYBURY  (0) 2017.10.01
(61/500) NOE.systems - double_input  (0) 2017.09.17

+ Recent posts