OverWrite

ftz

[ftz] level18

문제분석 & 풀이 코드가 너무 길기 때문에 핵심만 분석하겠다.  1) string[], check, x, count 등의 변수 선언 2) count가 100 이상이면 공격의심 문구를 출력check == 0xdeadbeef면 shellout()을 실행하고 level19 권한의 셸을 실행한다.  3) 사용자에게 입력값을 1바이트씩 받고 변수 x에 저장if) x의 값이 0x08이면 count--를 진행else) x의 값이 조건 이외의 값이면 string[count]에 x 값을 저장하고 count++ level19의 권한을 얻기 위해서는 check를 0xdeadbeef로 만들어야한다. 그러나 [사진]에서 알 수 있듯이 check 변수의 위치가 입력값을 저장하는 string보다 스택 하단에 위치하기 때문에 str..

ftz

[ftz] level17

문제분석 & 풀이코드 분석1. printit() : 출력문 출력2. crap, *call, buf[] 선언3. call에 printit()의 주소를 넣는다. 4. fgets()로 사용자에게 48바이트만큼 입력값을 받는다.5. setreuid()로 level18의 권한으로 변경6. call()을 실행함으로써 printit() 실행 이전 문제와 유사한 코드이다. 하지만 셸을 실행하는 함수인 shell()이 존재하지 않는다. 따라서 level16과 같은 방식으로는 문제를 해결 할 수 없다. 그렇다면 어떻게 해결 할 수 있을까? RTL 공격기법을 이용하면 해결 할 수 있다. RTL을 활용하기 위해서는 system(), "/bin/sh" 등의 주소를 구해야하는 번거로움이 있다. 더 쉽게 풀기 위해서 번거로운 작업..

ftz

[ftz] level16

문제분석 & 풀이코드 분석1. shell() : level17의 권한으로 셸 실행2. printit() : 출력문 출력3. crap, *call, buf[]를 선언했으며 call에는 printit()의 주소를 넣어주고있다.4. fgets()을 통해 48바이트만큼 사용자에게 입력값을 받는다.5. call()을 호출하여 printit()를 실행한다. call에 printit()의 주소를 저장하고 call()을 호출하여 printit()을 실행하고 있다. 그렇다면 call에 저장된 함수의 주소를 printit() → shell()로 바꿔줄 수 있다면, printit()이 아닌 shell()을 실행하여 level17의 셸을 얻어낼 수 있다. 어떻게 call에 저장된 주소값을 바꿀 수 있을까? call의 위치가 ..

keyme
'OverWrite' 태그의 글 목록