코드가 짧습니다.
argv[1]의 48번째 값이 0xbf 인지 체크하는 부분과
stack destoryer가 있습니다.
ultra argv hunter보다 더 무섭습니다.
코드를 보니 buffer에서 48-byte 떨어진 부분부터 0xbfffffff까지 다 0으로 초기화 합니다.
아...................................................................................................
진짜 답이 안보입니다.
RTL 말고도 있다고 해서 한참을 고민하다가 결국 지인에게 물어봤습니다.
LDP를 쓰라고 합니다.
LD_PRELOAD의 개념을 모르시면 다음 글을 읽고 오세요.
-> http://slimv.tistory.com/entry/LDPRELOAD
LDP 쓰지말라고 적혀있었던거 같은데
확인해보니 my-pass에 대해서만 쓰지말라고 적혀있습니다.
LDP를 사용합니다.
그냥 라이브러리 이름에다가 shell code를 심겠습니다.
사용할 라이브러리를 만들고 LDP에 등록합니다.
메모리상에 로드된 라이브러리 이름을 찾기 위해 임시로 컴파일한 파일을 gdb로 열어봅니다.
main 함수가 종료되는 시점인 main+166에 Break point를 걸고 stack을 봅니다.
실행할 때 ret 주소값이 0xbf로 시작하게 맞춰줘야 합니다.
0xbffff5c0부터 nop slide가 보입니다.
nop slide 중간쯤에 return을 해줍니다.
공격에 성공했습니다.