나의 기록, 현진록

[War Game] ftz level20 본문

War Game/ftz

[War Game] ftz level20

guswlsdk 2018. 1. 29. 14:52
반응형

ftz level20













다음은 hint의 내용이다.





setreuid는 있지만


/bin/sh은 존재하지 않다.


ret 주소를 수정하기엔


fgets의 입력 크기가 79 밖에 되지 않는다.



printf 문을 보자.


printf문은 보통 포맷 스트링을 활용하여 출력하는데


코드에서는 포맷스트링을 사용하지 않고


입력 받는대로 bleh에 저장된 값이 printf에 의해 그대로 출력된다.





포맷 스트링을 입력해보자.






%x을 입력하면 부호 없는 16진수가 출력


그 위치에 대한 주소이다. 


AAAA는 어디에 저장될까.




4번째부터(12byte) 저장되는 것을 확인 했다.

 

printf부터 bleh 변수의 거리는 12byte이다.


포맷 스트링 버그를 이용해보자.




ret까지의 거리를 확인하려고 했으나

gdb로 확인할 수 없다.


그렇다면 .dtors 값을 확인하자.





dtors는 main 함수가 끝날 때 


실행되는 함수이다.


끝나기 전에 쉘코드를 넣어주면 될 것 같다.


dtors 주소 + 4byte에 넣으면 main 함수가 끝나기 전의 주소이다.



08049594 + 4 = 08049598


08049598가 쉘코드를 넣을 주소이다.


다음은 쉘코드의 주소이다.



int 형의 최대값을 벗어나기 때문에


2byte씩 나누어 입력해야 한다.


fc0f = 64527


bfff = 49151


페이로드 작성


페이로드를 작성할 때


포맷 스트링 중 %n을 알아야한다.


현재까지 입력한 바이트 수의 값을 가진다.


공격주소(4byte) + 임의의 수 + %n 


공격주소에 임의의 수가 들어간다. 


공격주소는 4byte만 인식하는 것 같다.


그리고


리틀 엔디언 작성을 위해


fc0f를 먼저 입력한다.


$는 argument 수이다.


4$는 4번째라는 의미이다.




0x08049598(4byte)에 64527(fc0f)만큼 넣어야 한다.


그러나 %n는 여태 쓰여진 바이트 수의 값을 가지기 때문에


%n전까지 쓰였던 8만큼 64527에서 빼주어야 한다.


그래서 64519를 넣어준 것이다.


 그리고 


0x0804959a에 bfff를 넣어야 한다.


왜 0x08049598에서 4byte를 더한 주소가 아닌 2byte를 더한 주소라고 한다면


위에서 bffffc0f 값이 너무 커서 2byte 씩 나누기로 했기 때문이다.


이 또한 %n이 있기 때문에 그 전까지 쓰였던 바이트 수가 합쳐진다.


49151 만큼이 필요하지만


64527이 그전에 쓰였기 때문에


49151-64527은 음수이다.


그렇기 때문에 


0xbfff -> 0x1bfff으로 바꾸어 계산하다.


1bfff = 114687


114687 - 64527 = 50160


50160을 입력하면 된다.


반응형

'War Game > ftz' 카테고리의 다른 글

[War Game] ftz level19  (0) 2018.01.29
[War Game] ftz level18  (0) 2018.01.28
[War Game] ftz level17  (0) 2018.01.28
[War Game] ftz level16  (0) 2018.01.28
[War Game] ftz level15  (0) 2018.01.28