Lord of BOF_16_Zombie

맨 처음 return address에는 DO 함수의 주소가 와야 한다. 스택은 return address 이후 100바이트를 더 쓸 수 있으며, 쓰레기값이 들어가는 40바이트와 EBP 백업은 0으로 초기화 된다. 또한 main 함수 스택 프레임 위쪽의 환경변수 등도 삭제한다.

맨 밑의 LD_* eraser는 LD_PRELOAD 등을 이용하여 업로드한 셸 코드를 삭제하는 기능으로 보인다.

MO 함수를 보면 인자로 받은 문자열을 이용하여 system 함수를 호출하는 것을 볼 수 있다. 이 문자열로 /bin/sh를 넘기면 된다.

하지만 check 변수를 체크하여 종료된다. 따라서 check 변수를 4로 설정할 필요가 있다. check 변수는 전역변수이므로 stack overflow로는 조작할 수 없다. 다른 함수들이 check 변수를 조작하므로, 이를 이용하여 check 변수를 4로 만들어야 한다.

차례대로 D0 - GYE - GUL - YUT - MO 함수를 실행하면 된다.

MO 함수의 인자로 들어갈 /bin/sh 문자열이 필요하며, 함수 인자로 이 문자열의 주소를 넣어 준다.

ROP를 이용하여 위 작업을 수행한다.

40 쓰레기 값
더미 EBP back up(4 바이트)
DO 함수 주소 (4 바이트)
GYE 함수 주소 (4)
GUL 함수 주소 (4)
YUT 함수 주소 (4)
MO 함수 주소 (4)
더미 return addr (4)
/bin/sh 문자열 주소 (4)
/bin/sh\0 문자열 (8)

이 형태로 페이로드를 짠다. 환경변수를 삭제하므로 /bin/sh 문자열 또한 스택에 저장한다. objdump로 찾은 각 함수의 주소는 다음과 같다.

  • DO  : 080487ec
  • GYE : 080487bc
  • GUL : 0804878c
  • YUT : 0804875c
  • MO  :  08048724

/bin/sh 문자열을 넣기 위해서는 스택 주소를 확인할 필요가 있다. core 파일을 생성해 확인했다.

문자열이 시작하는 위치(C가 들어간 위치)는 0xbffffa98이다. 이를 이용하여 B 위치에 /bin/sh 문자열 주소를 넣는다.

succubus의 비밀번호는 here to stay 이다.


tags: writeup, pwnable, buffer overflow, stack overflow, memory corruption, elf file, linux, return oriented programming, c lang, x86asm