본문 바로가기

System Hacking

[드림핵] basic_rop_x86 풀이 - 티스토리

 

basic_rop_x64와 서버 환경만 다르고 나머진 거의 유사한 문제이다

 

 

 

 

 

코드 정적 분석

 

 

1. buf 입력 시 BOF 발생

 

 

2. puts함수 plt로 read함수 주소 릭

 

 

3. system, /bin/sh주소 구한 후 ret overwrite -> ret2main 이용

 

 

 

 

코드 동적 분석

 

이전 문제와 달리 buf와 ebp 중간에 더미값 4바이트 있음

 

 

필요한 정보들

32비트 환경에서 함수 인자 전달할 때 레지스터가 아니라 스택을 이용하므로 rop chain을 만들어주려면 스택을 정리해며 다음 함수로 연결해줄 가젯이 필요하다

 

 

puts와 system은 인자를 하나 사용하므로 pop (레지스터) ; ret 가젯이면 충분하다

 

 

 

read주소 출력 및 write함수가 출력하는 값 날리기

 

read함수 주소 릭 후 libc, system, binsh 주소 릭

 

system("/bin/sh")실행

 

 

최종 페이로드 (라이브러리 주소는 이전 문제랑 이름이 겹쳐서 바꿈)

 

이전 문제 풀고 온 상태라 스택 구조 빼면 똑같아서 쉬웠다

 

 

 

알게 된 것들

 

pop (레지스터); ret 가젯을 쓰는 이유는 사실 스택 정리도 있지만 조금 더 근본적인 이유는 다음 함수로 chain을 연결하기 위해서이다 -> 이 말 즉슨 rsp가 가리키는 값이 다음 함수로 넘어 가면 된다는 말

 

따라서 pop가 없을 경우엔 add rsp, 4 ; ret 가젯을 이용해도 됨

 

이렇게 있을 경우 ret1에 pop (레지스터) ; ret 가젯이 정석이긴 하지만 만일 해당 가젯이 없는 경우

 

add rsp, 4; ret 가젯을 ret1에 넣어주면 rsp는 ret1 실행 시 argv1 스킵하고 func2를 가리키게 되고

 

ret자리 이므로 fun2가 실행이 됨