
[LOB] troll -> vampire
2021. 2. 12. 18:42
Study/System Hacking
이번에는 vampire로 가는 패스워드를 알아보자. 일단 troll에 로그인한다. 파일 목록을 살펴보면 vampire.c 파일이 있는 것을 볼 수 있다. cat명령으로 출력시켜보자. 코드를 순차적으로 보면 인자의 개수에는 제한이 없고, ret에 덮을 주소는 스택 영역의 주소여야 하며, argv[1][46], 즉 return address의 상위 2번째 바이트가 \xff가 아니어야 한다. 이로 봤을 때 argv[2]에 쉘코드를 삽입하고, ret 영역에 argv[2]의 주소를 덮어씌우면 될 것 같다. 이때 return address의 상위 2번째 바이트가 \xff가 아니어야 한다는 것은 더 낮은 메모리 주소를 가져야 한다는 뜻이다. 스택의 특성상 낮은 메모리 주소를 가지려면 스택프레임의 크키가 커져야 한다...

[LOB] orge -> troll
2021. 2. 9. 17:48
Study/System Hacking
오늘은 troll로 가는 패스워드를 알아보자. orge에 로그인 후 현재 위치의 파일 목록을 출력했다. 이번엔 troll.c 파일이 있다. troll.c 파일을 출력시켜보자. here is changed 주석을 보면 이번엔 인자의 개수를 2개로 제한하는 것을 알 수 있다. 즉 argv[2]를 이용할 수 없다는 뜻이다. 맨 마지막에 one more! 주석에는 argv[1]의 값을 0으로 초기화 해주는 것을 볼 수 있다. 이렇게 되면 쉘코드를 argv[1], arg[2]에 넣을 수 없다. 하지만 아직 초기화 되지 않은 공간이 존재한다. argv[0]에 쉘코드를 넣어서 공격해보자. argv[0]은 파일명이다. 그렇기 때문에 파일명을 쉘코드로 바꾼다면 ret를 argv[0]의 주소로 덮어서 쉘을 실행시킬 수 있..

[LOB] darkelf -> orge
2021. 2. 9. 16:44
Study/System Hacking
orge의 패스워드를 알아내보자! darkelf에 로그인하고 ls 명령어로 현재 위치에서 파일 목록을 출력했다. orge.c 파일이 보인다. 이 파일도 출력해보자. here is changed!라는 주석이 추가됐다. 코드를 보면 argv[0]의 길이가 77이어야 하는 것 같다. 즉 파일을 실행시킬 때 파일명의 길이를 77로 맞춰야 한다. 그 외에는 달라진 점이 없다. 실행 파일명의 길이를 77로 맞추고 지난번처럼 argv[2]를 이용해서 공격해보자. python으로 파일명의 길이를 77로 맞추고 argv[2]에 \x90를 넣어서 실행시켰다. 아래와 같이 core파일이 생성됐다. core 파일을 열어서 argv[2] 주소를 찾아봤다. 아래쪽에서 \x90이 반복되는 것을 확인했다. 이중에서 임의의 주소를 골..

[LOB] wolfman -> darkelf
2021. 2. 9. 15:58
Study/System Hacking
이번에는 darkelf로 가기 위한 패스워드를 구해보자. 일단 wolfman에 지난 시간에 구한 패스워드로 로그인했다. 로그인한 후에는 ls명령으로 파일 리스트를 확인했다. 이번에는 darkelf.c 파일이 있는 것을 볼 수 있다. 해당 파일을 출력해보면 아래와 같다. 코드를 잘 살펴보면 check the length of argument라는 부분이 추가된 것을 알 수 있다. 이 부분 때문에 argv[1]의 크기가 48바이트를 넘으면 안 된다. 즉 ret 영역 뒤에 쉘코드를 삽입할 수 없다. argv[1]에 쉘코드를 넣을 수 없으니 argv[2]에 입력해서 공격해보자. 공격에 앞서 argv[2]의 주소를 알아내야 한다. 일단 gdb를 실행시키자. main에서 적당한 부분에 브레이크 포인트를 걸어보겠다. ..

[LOB] orc -> wolfman
2021. 2. 3. 02:09
Study/System Hacking
orc에서 wolfman으로 가는 password를 획득하자! ls 명령어로 디렉토리를 확인해보면 wolfman과 wolfman.c 파일이 있다. 그 중 wolfman.c 파일을 열어보자. 파일 내용을 보면 이전 orc.c와 달라진 부분이 한 군데 있다. buffer hunter 코드가 추가되었다. 이번 문제에서는 환경변수와 buffer를 이용한 공격은 할 수 없다. 이번엔 ret 영역 뒤에 쉘코드를 넣어 공격해보겠다. 문제를 풀기 전에 wolfman 파일을 복사해두자. wolfman1의 main을 gdb로 덤프하자. 이번에도 에 b를 걸어보겠다. 임의의 값을 인자로 전달하고 실행한 후, $esp 메모리를 살펴보면 sfp와 ret 영역을 찾을 수 있다. 이 ebp와 esp의 값이 같아지는 후이기 때문에 ..

[LOB] goblin -> orc
2021. 2. 2. 23:43
Study/System Hacking
이번에는 goblin에서 orc로 가는 password를 획득해보자. goblin에는 orc와 orc.c 파일이 있다. 이중 orc.c 파일을 열어봤다. orc.c 파일에 //egghunter 부분이 생겼다. 환경변수 메모리를 초기화 시켜주는 코드다. 이 코드 때문에 환경변수를 이용한 공격은 못 할 것 같다. 그 다음 if 문을 보니 argv[1]의 48번째 문자가 \xbf여야 하는 것 같다. main의 지역변수가 buffer[40]와 i이고, buffer[40]가 i위에 있는 것으로 보아 메모리 구조는 buffer(40)+sfp(4)+ret(4)이다. ret까지 덮으려면 총 48바이트 코드가 필요한데 buffer로 복사되는 argv[1]의 48번째 문자가 \xbf여야 하기 때문에 return addre..

[LOB] cobolt -> goblin
2021. 1. 28. 00:01
Study/System Hacking
오늘은 goblin으로 가는 password를 찾아보겠다. 먼저 지난 번에 알아낸 password로 로그인을 해준다. 그리고 현재 위치에서 파일 목록을 확인했다. goblin.c 파일이 있다. 이 파일 내용을 출력해보도록 하자. 지난 시간에 했던 cobolt.c 파일과 크게 다를 것 없지만 입력을 인자가 아닌 표준 입력을 통해서 받고 있다. gets 함수는 입력의 크기를 따로 지정하지 않기 때문에 버퍼 오버플로우가 발생할 수 있다. 이번에도 역시 BOF를 이용해서 쉘코드를 실행시킬 수 있다. 하지만 buffer의 크기가 16바이트이기 때문에 쉘코드를 넣을 수 없어 보인다. 따라서 환경변수를 이용해서 해결하겠다. nop sled와 쉘코드를 합친 환경변수 SHELLCODE를 만들었다. 그 후 getenv.c..

[LOB] gremlin -> cobolt
2021. 1. 27. 22:20
Study/System Hacking
오늘은 cobolt로 가는 password를 찾아보겠다. ls 명령어로 cobolt.c 파일이 있는 것을 봤고, cobolt.c 파일 내용을 출력해봤다. strcpy 함수가 사용됐고 buffer의 크기는 16바이트다. strcpy 함수 때문에 버퍼 오버플로우가 발생할 수 있다는 것은 이전 레벨과 동일하지만, buffer의 크기가 16바이트이기 때문에 쉘코드를 넣을 수 없다. 대신에 환경변수를 사용해서 해결할 수 있다. 먼저 쉘코드를 값으로 갖는 환경변수를 만들어야 한다. 나는 SHELLCODE 환경변수를 만들었다. 이때 환경변수의 주소가 조금씩 바뀔 수 있는 것을 고려해 쉘코드 앞에 nop sled를 붙였다. 그리고 환경변수의 주소를 얻어야 한다. getenv 함수로 환경변수의 주소를 얻을 수 있다. 나..

[LOB] gate -> gremlin
2021. 1. 24. 17:58
Study/System Hacking
포스팅을 하기 앞서 나는 Xshell을 사용해서 진행했다. gate로 로그인하고 나서 ls 명령어로 파일 목록을 확인했다. cat 명령으로 gremlin.c 파일 내용을 확인했다. 확인결과 256바이트 크기의 buffer가 있고, strcpy 함수를 사용해서 버퍼 오버플로우의 발생 가능성이 있다는 것을 알아냈다. 일단 실습을 진행하기 앞서 gremlin의 소유주는 gremlin이기 때문에 파일을 따로 복사해둬야 한다. 파일 복사를 완료했으면 gdb를 실행시킨다. 그리고 disas 명령으로 main의 어셈블리 코드를 확인한다. 아래 사진을 보면 main+54에 strcpy를 실행시키고, main+62에서 buffer[256]을 %eax에 복사하는 것을 확인할 수 있다. buffer의 주소를 알아내기 위해 ..