4번입니다. bash2설정을 해주고 코드를 확인해 보겠습니다.
코드를 보니 egghunter라는 부분이 추가되었습니다. 이 부분은 외부 전역변수의 값을 바꿔주는 설정인데, 이 부분의 추가로 인해 환경변수를 통해 shell코드를 실행해주는 것은 힘들어 보였습니다. 그렇기 때문에 nop슬라이드 방식을 이용하여 비밀번호를 얻어야 할 것 같습니다. 먼저 gdb를 통해 주소를 얻어 보겠습니다.
위의 두 사진은 1,2,3번 풀이 때도 설명했으니 자세한 설명은 생략하겠습니다. 하지만 추가적으로 코드를 보면 argv[1][47]의 값이 "\xbf"가 아니면 오류가 발생하므로, gdb에서 파일 주소를 확인할때 "\xbf"48개를 주거나 더미값*47+"\xbf"이런 식으로 주어야 우리가 원하는 곳에 브레이크포인트가 걸립니다. 주소를 구한 후 저는 단순히 nop으로 버퍼와 ebp를 채우고 ret값을 채울려고 했으나,...
위 처럼 계속 실패했습니다. 그래서 다른 방법을 지인에게 듣고 공격을 시도하기 위해 다른 방식으로 gdb를 통해 주소를 얻어보았습니다.
위의 파이썬코드를 간단히 설명하면 버퍼와 ebp를 nop이나 더미값으로 채우고 ret 값을 ret뒷부분으로 반환시켜 줍니다. 그리고 ret뒷 부분에 nop을 깔고 shell코드를 깔아 shell코드를 실행시킬 수 있었습니다. 만약 간단하 nop슬라이드로 bash가 뜨지 않는 분들은 이 방법으로 해보면 더 효율적일 것 같습니다.
위와 같이 비밀번호 cantata를 구했습니다.