Lord of BOF_17_Succubus

핵심 알고리즘은 다음과 같다.

  • overflow하여 조작할 return address가 strcpy 주소여야 한다.
  • return address 이후의 스택 4바이트는 지운다.

이 프로그램은 PLT를 이용한다. objdump를 통해 PLT 섹션을 확인할 수 있다. 따라서 addr에는 실제 strcpy 함수의 주소가 아니라, PLT 주소가 들어가게 된다.

다음은 strcpy의 PLT 주소를 가져오는 코드이다. 그 주소는 0x08048410이다. 이를 return address에 넣어 strcpy를 호출하도록 한다.

프로그램에서 return address 이후 4바이트를 지우기 때문에 ROP chain이 끊긴다. 따라서 이를 연결해 주어야 한다.

strcpy를 통해 return address 이후 4바이트, 즉 strcpy가 끝난 후 되돌아갈 return address에 셸 코드 주소를 복사한다. payload는 다음과 같다.

더미 40바이트
EBP backup (쓰레기) (4바이트)
strcpy plt 주소 (4바이트)
새 return addr (쓰레기) (4바이트)
strcpy 인자 - 새 return addr 주소
strcpy 인자 - 셸 코드 주소가 저장된 주소

셸 코드는 환경변수에 넣었다. strcpy를 이용하기 때문에 셸 코드 주소는 문자열 형태(null로 끝나는 형태)로 종료되어야 한다. 따라서 이 역시 환경변수를 이용하기로 했다.

스택 주소를 알아내기 위해 core 파일을 생성하였다.

셸 코드 주소가 저장될 위치는 0xbffffef3이다. (ADDR= 를 잘라냄)

셸 코드 주소는 0xbfffff17이다. (MYENV= 를 잘라냄)

새 return addr가 들어가는 주소는 0xbffffa80이다. (위 그림의 입력값은 약간 다르지만, 입력값 개수는 같기 때문에 문제 없다. )

이를 종합하여 payload를 보낸다.

nightmare 의 비밀번호는 beg for me 이다.


tags: writeup, pwnable, buffer overflow, stack overflow, memory corruption, elf file, linux, return oriented programming, dynamic library, procedure linkage table, c lang, x86asm