본문 바로가기

Pwnable/Challenges

root-me.org ELF x86 - Stack buffer overflow basic 1 풀이

<개요>


Hostchallenge02.root-me.org
ProtocolSSH
Port2222
SSH accessssh -p 2222 app-systeme-ch13@challenge02.root-me.org     WebSSH
Usernameapp-systeme-ch13
Passwordapp-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