1. nightmare.c 분석
- addr : strcpy()의 주소
- argv[1] : 사용자가 입력한 인자, 버퍼에 복사됨
- RET : buffer+44
=> RTL 기법 이용, RET에 strcpy 주소를 넣어야 함
흐름을 살펴보면 마지막 memset() 함수를 이용하여 ret+4의 주소부터 4바이트를 A로 채운다.
이때 strcpy() 함수를 삽입시키면 버퍼의 문자열 전부를 RET+4부터 복사할 수 있다.
=> 버퍼에 RTL 기법을 이용하여 system() 함수로 쉘을 얻을 수 있다.
2. 디버깅
라이브러리에 저장된 system() 주소를 얻어온다.
어셈블에 있는 strcpy() 주소도 얻을 수 있다.
3. 페이로드 작성
페이로드는 다음과 같이 이뤄진다
system() + dummy + "/bin/sh" + dummy + strcpy() + dummy + (ret+4의 주소) + 버퍼의 주소
메모리를 보면 버퍼의 주소는 0xbffffa40, ret+4의 주소는 0xbffffa70임을 알 수 있다.
모은 주소를 모두 합치면 페이로드는 다음과 같다.
./nightmare $(python -c 'print "\xe0\x8a\x05\x40"+"\x90"*4+"\xf9\xbf\x0f\x40"+"\x90"*32+"\x10\x84\x04\x08"+"\x90"*4+"\x70\xfa\xff\xbf"+"\x40\xfa\xff\xbf"')
'Write-Up > LOB' 카테고리의 다른 글
LOB: orc->wolfman (0) | 2019.12.04 |
---|---|
LOB: troll->vampire (0) | 2019.11.28 |
LOB: gremlin->cobolt (0) | 2019.11.27 |
LOB: gate - 수정중 (0) | 2019.11.22 |