이번 문제는 argv[0]의 길이가 77이어야 한다는 조건이 붙었습니다. 임시파일은 tmp에서 orge를 "A"*75(A가 75개) 으로 이름을 바꿔주고 실행하여 코어파일을 만들어줍니다. *코어파일은 예기치 못한 일이 발생하여 프로그램이 비 정상적으로 종료되었을 때 운영체제가 디스크에 남기는 파일입니다. 코어파일을 gdb로 디버깅 해봅니다. 메모리를 보니 argv[2]의 시작주소는 0xbffffaf8 입니다. 원본 파일의 이름을 "A"*75로 바꾸어 줍니다. 익스플로잇 하였습니다. ret에 넣어주는 argv[2]의 주소를 0xbffffb10, 0xbffffb20등으로 했는데 계속 되지 않아서 삽질을 조금 했습니다.
이번 문제는 argv[1]의 크기가 48 초과가 되면 실행을 종료시키는 조건이 붙었습니다. 그런데 어차피 argv[1]에는 buffer+sfp+ret = 48byte 만큼 들어갈 것이기 때문에 저 조건은 상관 없을 것 같습니다. gdb 로 darkelf를 디버깅 해 보았습니다. 그리고 저번 문제때 썼던 방법으로 실행했습니다. 스택은 이렇게 구성 될 것입니다. 여기서 보면 argv[2]의 시작주소는 0xbffffb90입니다. payload를 짜서 공략했는데 실패했다. illegal instruction이 뜨는것을 보니 저번 문제와 같이 bash2쉘을 실행해 주면 문제가 해결 될 것 같습니다. 익스플로잇 했습니다.
이번 문제는 저번 문제와 거의 동일하지만 마지막에 buffer를 0으로 만들어버린다는 차이점이 있습니다. 하지만 저번문제에서 buffer를 사용하지 않았기 때문에 별로 상관이 없을 것 같다. gdb로 wolfman을 디버깅 해 보았습니다. 저번 문제와 거의 유사하게 실행 해 보았습니다. 스택은 이렇게 구성 될 것입니다. argv[2]의 시작 주소는 0xbffffbb0입니다. payload를 작성했더니 쉘이 따지지 않았습니다. bash2쉘 을 실행 한 후 똑같은 payload를 입력했더니 이번엔 쉘이 따였습니다. bash쉘로 실행하면 \xff를 NULL로 바꿔버리는 오류가 있어서 그런 것 같습니다. 아무튼 공략에 성공했습니다.