(드디어 글을 쓸수 있게 되어 정말 기쁘다...만세)
gate로 로그인을 한뒤 있는 파일들을 보면
(사실 a.out은 전에 그냥 만든거고) gremlin.c와 gremlin이 있다.
gremlin의 코드는
이렇게 버퍼를 256바이트만큼 자리를 만들어준뒤 인자가 주어지면 주어진 인자들 중 첫번째 문자열을 출력하는 코드로 볼 수 있다. 그럼 대충 이 코드 만든 사람이 생각해낸 그림은
저기서 순조롭게 버퍼에 알맞는 크기를 넣어서 출력하는 거였겠지만..gate는 gremlin의 쉘을 얻기 위해 버퍼의 크기보다 큰 양을 에 받아서 sfp랑 ret다 조작하려 한다.
근데 gremlin.c의 실행파일인 gremlin은 권한이 gate여서 gdb가 안된다. 그래서
이렇게 gremlin과 내용이 같은 실행파일(sagigrem) 하나를 더 만들어준다. 이건 gate가 만든거니 gate는 sagigrem에 대해 권한을 갖는다.
그리고 gate의 쉘을 얻기 위한 계획은
여기서
b=(쉘코드 제외한 나머지) buffer+sfp
c=shell code
a=return adress
대충 이런느낌으로 표현했다.
초기에 버퍼가=265바이트, sfp=4바이트, ret=4바이트니
맨 앞에 \xbb를 100개 채우고 쉘코드에 해당할 \xcc를 41개 채우고(왜냐면 여기에 쉘코드가 실제로 41개여서) ret부분 바로 전까지 \xbb를 119개 채운다음, ret에 들어갈 주소 \xaa를 4개 채우면 다 합해서 264로 스택 프레임에 딱 알맞는 크기로 버퍼 오버플로우를 일으킬 수 있다!
이걸 sagigrem에 직접 실행하니
segmentation오류가 나면서 corer가 생긴다
이를 gdb -c core로 디버깅하여 주소를 스택의 맨 바닥부터 0x100개씩 보면 원했던 b랑 c, a의 위치를 찾기 충분할 것 같다.
위 사진에서 노란색으로 칠해진 부분, 즉 bb만 반복되다가 cc가 처음으로 나오는 그 주소가 ret에 넣을 주소가 될 것이다. 핑크색 부분은 ret부분이 시작하는 주소인데 굳이 찾아볼 이유는 없을듯..
쉘코드가 들어갈 부분의 첫번째 주소를 확인하니 0xbffff96c(== \x6c\xf9\xff\xbf) 이다.
쉘코드가 들어갈 주소도 알았겠다 그럼 이제 사기그램 디버깅을 중지하고
이를 gremlin에 넣어주자!
저기서 첫번째 bash$가 뜨면 쉘에 들어가는데에 성공한것! my-pass를 입력하여 비밀번호를 알아내면 끝난다.
'Pwnable > S! Wargame' 카테고리의 다른 글
sf3 - my solution (0) | 2022.09.13 |
---|---|
sf2 - my solution (0) | 2022.07.19 |
oneshot - my solution (0) | 2022.07.14 |
LOB 2 - my solution (0) | 2022.05.29 |
sf1 - my solution (0) | 2022.05.28 |
댓글