-
[L.O.B] Level 9 - trollWargame/L.O.B 2022. 10. 20. 01:35반응형
Level 9 - troll을 풀어보자.
소스 코드를 보면 다음 Level은 vampire이고, check 0xbfff라는 힌트가 있다.
조건은 앞의 Level 들에서 있는 것도 있고, 없어진 것도 있지만 내용은 다 아니 설명은 생략하자.
새로운 조건인 here is changed 부분을 보면, argv[1]의 47번째 내용이 \xff가 아니면 문구를 출력하고 종료한다.

<vampire 소스 코드의 내용> gdb로 vampire 파일을 더 분석해보자.
알아내는 정보는 매번 비슷하지만(소스 코드가 비슷비슷), 그래도 사용해보며 익숙해지도록 하자.


<vampire 파일의 gdb 분석> break를 leave가 있는 <main+157>에 걸어주면서 main 함수가 끝나기 직전의 스택 상태를 보도록 하자.
실행할 명령어로는 \xbf를 위치 조건에 맞춰 48개 넣었고, NOP 값을 10만 개를 넣었다.
그렇다면 왜 이렇게 NOP를 많이 넣었는지 설명해보자.
그동안 공격을 위해 주로 작성하던 페이로드의 길이는 1,000 자 정도가 최대였다.
그래서 스택의 주소를 보면 항상 0xbfff...이었다.
그런데, 이번에는 0xbf[ff]...에서 [ff] 부분이 조건에 의해 걸리게 된다.
이것의 해결을 위해 16 진수로 그 크기를 살펴보면 아래와 같다.
\xff\xff\xff\xbf : 3,221,225,471
\xff\xff\xfe\xbf : 3,221,159,9352의 16제곱(65,536) 만큼 차이가 난다.(0xbfffeff가 [ff] 부분을 변경시켰을 때 가장 0xbfffffff과 가까운 값이다.)
그래서 10만 개 정도의 길이라면 충분히 조건에 걸리지 않는 주소를 RET에 넣을 수 있을 것이라고 생각했다.

<break 이후 명령 실행> 그렇게 명령을 실행하고, 분석을 해보니 0xbffe7470에서 NOP가 시작되는 것을 알 수 있다.
이 값을 페이로드를 작성할 때 RET에 넣을 주소로 삼도록 하자.

<RET에 넣을 주소값> 이제 페이로드를 작성해 프로그램을 실행해보자.
RET 값을 잘 넣어주고, NOP를 10만 개 넣고, 쉘 코드를 입력하는 것으로 페이로드를 간단히 작성한다.
프로그램을 실행하니 vampire의 권한으로 쉘이 실행되며, my-pass 입력 시 비밀번호가 나타난다.


<나타난 비밀번호> 반응형'Wargame > L.O.B' 카테고리의 다른 글
[L.O.B] Level 11 - skeleton (2) 2022.11.01 [L.O.B] Level 10 - vampire (0) 2022.10.20 [L.O.B] Level 8 - orge (0) 2022.10.20 [L.O.B] Level 7 - darkelf (0) 2022.10.14 [L.O.B] Level 6 - wolfman (0) 2022.10.14