DEFCON2015에서 나왔던 문제 r0pbaby를 풀어보겠다.
r0pbaby_542ee6516410709a1421141501f03760
일단 실행시켜서 무슨 파일인지 추측 해보자...
.
.
.
실행시키니 이와 같은 메뉴가 나온다.
1번을 실행시켜보자...
1번을 실행시키니 libc.so.6의 주소를 보여준다.
정말인지 ldd를 사용해서 확인해 보겠다.
(ldd란 프로그램이나 공유 라이브러리들이 요구하는 공유 라이브러리를 출력해준다)
1번은 libc.so.6이 아닌 다른 값을 출력해 주는 것을 알 수 있다.
.
.
.
2번을 실행시켜 보자...
함수를 이름을 입력하면 함수의 주소를 알려주는 것 같다.
이번에도 정말로 일치하는지 gdb를 통해서 확인해 보겠다.
r0pbaby를 킨후 gdb로 r0pbaby의 PID를 attach해서 확인해보겠다.
system의 주소는 똑같은 것을 볼 수 있다.
2번 정말로 함수의 주소값을 알려 준다.
.
.
.
이번엔 마지막으로 3번을 실행시켜보자.
받고싶은 값의 바이트를 적고 그만큼 값을 입력 받는 것 같다.
한번 많이 입력해보자!
세그멘테이션 오류가 뜬다.
이곳에서 버퍼오버플로우가 일어나는 것 같다.
ida를 이용해서 버퍼 공간을 구해줄 수도 있지만....
gdb를 이용해서 간단하게 구하자.
gdb로 r0pbaby파일을 열고 r을 해보자.
그리고 3번에 받을 바이트12 문자AAAABBBBCCCC를 넣어보자!
넣으면 프로그램이 종료가 될 것이다.
그리고 eip를 보면 버퍼공간을 알아낼 수 있다.
값을 보면 A에해당하는 41과 B에해당하는 42가 rbp에 들어가 있고
C에해당하는 43이 0x00007fff43434343으로 eip에 들어간 후 프로그램이 종료가 된다.
그럼 여기서 알 수 있는 점은 버퍼의 공간이 8이라는 것이다...
무슨 프로그램인지 파악하였다.
이제는 ROP에 필요한 가젯을 구하겠다.
먼저 libc.so.6안에 있는 /bin/sh이라는 문자열을 구해보겠다.
strings라는 명령어를 사용하겠다.
(strings는 바이너리에서 스트링을 출력해주는 명령어이다.옵션은 http://crasy.tistory.com/80 이곳을 참고합시다. )
libc.so.6에서 0x18ac40만큼 떨어진 거리에 있는 것을 알 수 있다.
그리고 가젯을 하나더 구하기 전에 알아야 할 것이 있다.
64비트와 32비트의 인자전달 방식이다.
일단 32비트 인자전달 방식먼저 확인하자.
인자전달을 스택에 push해서 값을 주고 있다.
이번에는 64비트 인자전달 방식을 확인하자.
64비트는 값을 레지스터에 복사해서 그 값을 인자로 전달을 한다.
또한 64비트는 rdi,rsi,rdx,rcx,r8,r9,,,,등과 같은 순서대로 레지스터를 복사해서 인자를 전달한다.
pop rdi를 통해 인자를 rdi에 저장하기 위해 이번에는 pop rdi;ret 가젯을 구해보겠다.
rp++이라는 프로그램을 사용해보자!
(rp++은 ROP가젯을 찾기위한 프로그램이다.다운로드는 https://github.com/0vercl0k/rp/downloads에서 받아주자.
명령어는 https://github.com/0vercl0k/rp이곳을 보시길!)
많은 가젯들이 나온다.
이중에서 아무거나 써주자.
이제 모든 가젯을 구했으니 익스플로잇 코드를 짜보자.
실행을 시켜보자.
쉘이 따졌다!
'SYSTEM HACKING > 문제 풀이' 카테고리의 다른 글
[ROP 문제]2013 Pico ctf rop-3 (0) | 2017.12.18 |
---|---|
[ROP 문제]2013 Pico ctf rop-2 (0) | 2017.12.13 |
[ROP 문제]2013 Pico ctf rop-1 (0) | 2017.12.13 |
[ROP 문제]우분투 CTF 문제 small (0) | 2017.11.25 |
[ROP 문제]ropasaurusrex (0) | 2017.11.24 |