반응형

WarGame/LOB(The Lord of the BOF) 13

13단계 darkknight -> bugbear

이번 문제는 RTL(Return To Library) 문제이다. 소스코드를 보면 더 이상 스택 부분 주소 값을 넣을 수 없게 '\xbf' 부분이면 프로그램이 종료된다. 여기서는 system() 함수를 사용할 것이다. 그러면 함수 주소를 알아야 한다. gdb를 이용해서 system 함수 주소 값을 가져온다. 이제 system 함수에 들어갈 인자 값이 필요하다. 여기서 우리가 system 함수를 이용해 실행할 것은 쉘(/bin/bash)이다. 당연히 메모리에 올라와 있는 문자열이 필요하다. 메모리에 /bin/bash라는 문자열이 올라와있는 곳의 주소 값을 찾아보자. 그림 1-3 소스코드를 컴파일해서 실행시켜 /bin/bash 메모리 주소값을 찾아보자. 컴파일한 후 이렇게 실행하면 메모리 주소 값이 나온다. ..

12단계 golem -> darkknight

이번 문제는 FPO라고 적혀있다. 이것은 Frame Pointer Overwriting이다. 소스코드를 보면 덮을 수 있는 게 고작 1byte이다. 그러면 쉘 코드를 넣고 마지막 1byte를 쉘코드 -8 위치인 곳의 주소 값으로 바꿔 EBP ESP를 조작해서 실행되게 해 보자. 0xbffffab4 주소 값으로 조작하면 딱 쉘 코드로 점프한다. 메모리 주소를 보고 구한 값으로 exploit을 시도해보았다. 그런데 아무것도 안 뜨고 입력해도 반응이 없다. 실패한 것이다. 그래서 메모리 값이 어떻게 변하는지 일부러 다른 값으로 또 실패시켜 덤프 파일을 얻어 분석해보자. 덤프 뜬 것으로 확인해보니 주소 값이 바뀌었다. 이제 0xbffffabc로 하면 성공할 것이다. 성공!

11단계 skeleton -> golem

이번 문제는 스택 구간을 전무 못쓰게 하고 있다 버퍼, argv, 환경변수, 절대경로, 그냥 싹 다 0으로 초기화시켜버린다. ㅎㅎㅎ LD_PRELOAD를 사용해야 한다. LD_PRELOAD란? = 공유 라이브러리의 경로를 지정해준다. - 유닉스/리눅스 계열에서 사용되는 환경변수이다. - 프로세스가 실행될 때, 이 환경변수에 지정된 공유라이브러리가 먼저 로드된다. - 따라서 다른 라이브러리의 함수와 LD_PRELOAD에 지정된 라이브러리의 함수가 서로 이름이 똑같을 경우 후자가 실행되게 된다. (라이브러리 적재 순서 때문) 일단 소스코드를 공유라이브러리로 컴파일하되 명을 쉘 코드로 짓자. [그림 1-2] 처럼 공유 라이브러리로 컴파일하고 LD_PRELOAD 환경변수에 쉘 코드를 올려버린다. 쉘 코드가 올라..

10단계 vampire -> skeleton

환경변수, 버퍼, argv 모두 사용을 못한다. 그런데 리턴은 \xbf로 시작하는 주소를 넣어야 한다... 망막하다... [그림 1-2] 메모리 주소를 끝까지 확인하다 보면 맨 아래에 실행한 파일 절대 경로가 넣어져 있다. 주소도 \xbf로 시작해 딱인 것 같다. 심볼릭 링크를 이용해 쉘 코드를 절대 경로에 넣고 절대 경로 주소 값을 가져와 리턴 시키면 될 것 같다. 이렇게 확인해보면 쉘 코드가 잘 들어가 있는 것을 확인할 수 있다. 0xbfffff88을 사용하자. 이렇게 하면 exploit을 성공한 것을 볼 수 있다.

8단계 orge -> troll

우왕!! 이번 단계 소스코드에 argv[1]만 쓸 수 있게 돼 있고 argv[1]을 0으로 초기화해버린다. 환경변수, buffer, argv[2]도 사용할 수가 없다. 그렇다면 argv[0]에 쉘 코드를 넣고 exploit을 시행하 보자. 심볼릭 링크를 이용해 argv[0]에 쉘 코드를 넣어보자. 그러나 [그림 1-2] 심볼릭 링크가 실패가 되었다. 실패 내용은 No such file or directory이다. 쉘 코드를 보면 \x2f라는 부분이 있다 이것은 '/'이다 여기서 '/' 이것은 경로를 의미하기 때문에 오류가 날 수밖에 없다. 쉘 코드에서 /bin/sh 이런 식으로 쉘을 실행해야 하기 때문에 '/'의 문자가 필요하다. /bin/sh 부분을 인코딩해서 쉘 코드에 \x2f 문자가 안 나타나게 하..

7단계 darkelf -> orge

전 단계에서 소스코드가 좀 더 추가되었다. 이번에는 argv[0] 즉, 실행파일의 길이가 77이 아니면 에러를 출력하겠다는 코드다. 이제 argv[0]의 길이만 77로 변경해 exploit을 해주면 된다. 심볼릭 링크를 이용해 길이가 77인 파일을 만들자. 심볼릭 링크로 argv[0] 길이가 77인 파일을 만들어 실행했다. 그러나 [그림 1-2] argv[0] error가 발생했다. . 과 / 도 argv[0]의 길이에 포함시키는 것이었다. 그래서 다시 길이가 75인 파일을 만들어 테스트해봤다. [그림 1-3] 성공하는 것을 볼 수 있다. 실행할 때 파일의 길이를 . / 를 포함해 계산하는 것을 알 수 있다. 이제 argv[2]의 주소를 이용해 exploit을 할 수 있게 주소를 구해보자. 그러나 gdb..

6단계 wolfman -> darkelf

이번 단계도 소스코드가 조금 더 추가되었다. 확인해보면 argv[1] 코드가 48byte를 초과하면 안 된다는 내용이다. 그러나 우리나 전 단계처럼 하면 딱 48byte만 사용하고 나머지는 argv[2]를 사용하면 된다. 이지~ argv[2]의 주소 값을 구하자. 여기서는 0xbffffc24를 사용하면 된다. argv[1] : dummy(44byte) + 0xbffffc24(4byte) argv[2] : \x90(100byte) + shellcode(25byte)

5단계 orc -> wolfman

전 단계 소스코드에서 하나 더 추가되었다. 이번에 추간된 소스코드는 버퍼를 0으로 초기화시켜 버퍼 안에서 쉘 코드를 실행하는 것을 막는 코드이다. 그러나 전 단계처럼 쉘코드를 argv[2]에 넣어하면 되므로 쉽게 풀 수 있다. argv[2] 주소를 찾아보자 주소는 대략 0xbffffc44를 사용하면 된다. argv[1] : dummy(44byte) + 0xbffffc44(4byte) argv[2] : \x90(100byte) + shellcode(25byte) 이렇게 넣어 exploit을 할 것이다. 성공~!

4단계 goblin -> orc

소스코드를 분석해보면 두 가지 코드가 더 추가되었다. 환경변수를 사용하지 못하게 모두 0으로 초기화하는 코드 RET 부분 스택에 무조건 '\xbf'로 시작하는지 확인하는 코드 할 수 있는 방안은 환경변수 영역을 안쓰고 RET 부분에 무조건 \xbf문자열을 넣는다는 것이다. 이번에도 아까처럼 argv[2]에 NOP+SHELL을 넣고 exploit을 해보겠다. 환경변수 영역이 아니니 상관이없고, argv[2]의 주소 값은 \xbf로 시작하니 두 조건에 다 만족하므로 exploit이 가능하다. argv[2] 주소 값을 찾아보자. 대략적으로 0xbffffc34를 사용하겠다. argv[1] : dummy(44byte) + 0xbffffc34 argv[2] : \x90(100byte) + shellcode(25by..

반응형