ret2sc를 실행시켜 보자
이름을 입력받고 최선을 다하라고 한다.
보호기법이 무엇이 있는지 확인해보자
깔끔하다
이제 IDA로 뜯어보자
s의 크기는 ebp-14h로 알수 있다. 즉, s의 크기는 20바이트이다.
name의 경우에는 read함수를 통해 50바이트까지 입력받을 수 있다. 그리고 gets함수를 통해 s에 길이 상관 없이 입력받을 수 있다. 여기서 취약점이 발생할 수 있다.
name의 주소를 살펴보자
전역변수 name의 주소값은 0x0804A060이다.
name변수에는 shellcode를 저장하고 gets함수로 payload를 전달해서 return address 영역에 &name을 저장하면 ret 명령어를 통해 쉘코드를 실행할 수 있다.
main함수의 첫번째 명령어는 0x080484cd이고 이는 최상위 스택에 있으며 return address가 여기 있다.
gets함수의 호출하는 명령어 call은 0x08068536에 있다. 이는 s 변수의 주소에 있다.
bp1 : main함수의 첫번째 명령어 0x080484cd
bp2 : gets함수의 호출하는 call 명령어 0x08068536
bp1, bp2를 설정하여 s에서 return address 사이 거리를 구해보자
main함수의 명령어가 있는 스택의 주소는 0xffffd6ac
s변수의 주소는 0xffffd68c
return address와 s 사이의 거리는 32바이트이다.
따라서 s[20]+dummy[8]+sfp[4]+ret[4] 구조로 되어있는 것을 확인 할 수 있다.
ret[4] |
sfp[4] |
s[20]+dummy[8] |
payload는 다음과 같이 짜면 된다.