본문 바로가기

포너블/lob

lob 9번

9번입니다.

먼저 코드를 확인해보겠습니다.

코드를 보면 상당수가 바뀐 것을 알 수 있습니다. 앞의 문제에 있었던 많은 제약조건이 사라졌습니다. 즉 argv의 모든 부분에서 공격 가능하며, 여차하면 환경변수도 사용할 수 있는 것을 알 수 있습니다. 하지만 새로운 부분이 추가되었습니다 agrv[1][46]부분이 \xff이면 안 된 다는 것입니다. 저는 이 부분을 보고 gdb이용하여 먼저 주소를 확인해 보았습니다.

이 아래에도 계속 확인해보았지만 접근 권한이 없는 영역까지 내려갔지만 0xbfff로 시작하지 않는 부분은 없었습니다. 하지만 생각해보면 당연합니다. 왜냐하면 스택은 높은 주소부터 쌓이기 시작하기 때문입니다. 즉 우리는 이 문제의 관리자 권한을 얻기 위해서는 0xbfff보다 메모리 주소값이 낮은 영역에서 shell코드를 실행해야 합니다. 어떻게 해야 할까요? 이때 스택의 메모리 구조를 생각한다면 생각보다 쉽게 답을 생각할 수 있습니다. 스택은 높은 주소에서 낮은 주소로 값이 쌓이기 때문에 0xbfff가 아닌 0xbffe영역 까지 nop을 쌓은 다음 0xbffe영역에 shell코드를 두면 됩니다. 즉 nop을 10만개, 혹은 그 이상으로 까는 nop슬라이드를 이용하면 된다는 뜻입니다. 그 결과 페이로드를 다음과 같이 작성했습니다.

위의 그림을 보면 놉을 10만개 깐 것을 볼 수 있습니다. 이때 ret값은 저희가 임의로 지정해 주면 됩니다. 단 argv[1][47]은 \xbf이며, argv[1][46]은 fe인 아무 주소로 보내게 되면(최대한 0xbfff와 가까운 주소일수록 확률이 높음) nop을 만나게 될것이고, nop을 타고 shell코드를 실행하여 관리자 권한을 얻을 수 있게 될 것입니다.

그 결과 비밀번호인 music world를 획득할 수 있었습니다.

'포너블 > lob' 카테고리의 다른 글

lob 10번  (0) 2020.01.11
lob 8번  (0) 2020.01.08
lob 7번  (0) 2020.01.05
lob 6번  (0) 2020.01.05
lob 5번  (0) 2020.01.05