<개요>
Host | challenge02.root-me.org |
Protocol | SSH |
Port | 2222 |
SSH access | ssh -p 2222 app-systeme-ch13@challenge02.root-me.org WebSSH |
Username | app-systeme-ch13 |
Password | app-systeme-ch13 |
<풀이>
ssh로 접속 할 수 있는 방법은 다양하다. 필자는 xshell을 이용하여 접속하였다.
서버에 접속하면 ch13 실행파일과 ch13.c 라는 파일이 있다는 것을 알 수 있다.
root-me.org에서는 웹사이트에서 소스코드를 보여준다. 하지만 서버에서도 소스코드가 있으므로
굳이 웹사이트 에서 확인 할 필요는 없다.
소스코드를 보면 check의 값이 0x04030201이다.
첫번째 if문을 보면 check의 값이 0x04030201 이 아니고 check의 값이 0xdeadbeef가 아니면
You are on the right way! 라는 문자열을 출력시킨다.
진짜로 중요한 if문은 바로 아래에 있는 두번째 if문이다.
이 if문을 해석하면 check의 값이 0xdeadbeef 이면 Yeah dude! You win! (이하 생략) 을 출력시키고
system("/bin/dash"); 를 실행시킨다.
즉 check의 값을 0xdeadbeef로 바꾸는 것이 이 문제를 푸는 가장 중요한 포인트이다.
따라서 main함수 부분을 gdb로 보도록 하자.
gdb를 이용하여 main 함수의 assembly를 확인하였다.
main함수의 내용을 보면 and $0xfffffff0 %esp 와 같은 연산을 한다.
ebp와 esp의 값을 제대로 알기 위해서 원하는 부분까지 실행시켜 esp의 변화를 확인한다.
main에 break point를 걸고 실행시킨 후에 ni를 2번 입력하여 mov %esp,%ebp를 실행시킨다.
레지스터를 보면 esp, ebp의 값이 0xbffffbb8 로 동일하다. (당연한 결과이다. mov %esp, %ebp를 하였기 때문에)(추가적으로 esp와 ebp값은 필자와 다를 수 있다.)
이제 esp와 ebp의 값을 알았기 때문에 스택을 그리는게 가능해졌다. 다음 부분을 차근차근 생각하거나, 그림을 그려본다.
위와 같은 스택이 만들어 진다.
main + 38에서 mov esp,eax를 통해서 esp가 0xbffffb84로 이동한다.
이 프로그램에서 fgets함수는 45byte만큼 읽어서 buf라는 변수에 넣는다. esp가 0xbffffb84에 위치하므로
0xbffffb84부터 입력한 값이 저장된다는 것을 알 수 있다.
0xbffffb84 ~ 0xbffffbb0는 44byte이다.
따라서 40byte는 아무 값이나 넣고, 4byte를 0xdeadbeef 로 채워서 check의 값을 바꾼다.
즉 다음과 같이 payload를 작성하면 된다.
'Pwnable > Challenges' 카테고리의 다른 글
pwnable challenges sites (0) | 2018.08.05 |
---|