본문 바로가기

LoB13

darkknight -> bugbear 이번 레벨의 소스 코드를 확인해 보니 RTL1이다. RTL은 (Return to libc)의 약자로 바이너리에 적재된 함수가 없더라도 메모리에 적재되어있는 공유 라이브러리의 함수를 이용하여 공격하는 기법이다. bugbear와 길이가 같은 이름으로 복사한 후 분석을 해보자. gdb로 실행한 후 main함수에 브레이크를 걸자. argv[1]의 48번째에 0xbf를 검증하니 48번 넣고 실행하자 RTL로 이용하여 공격할 것이니 system 함수 주소와 '/bin/sh'의 주소만 있으면 구하면 된다. system함수의 주소는 0x40058ae0이다. 이제 /bin/sh의 주소를 구해보자 /bin/sh의 주소의 경우 system내부에 내재하고 있으니 간단한 c코드로 구해보자. /bin/sh의 주소는 0x400fb.. 2020. 9. 17.
golem -> darkknight 이번 레벨은 FPO(Fram Pointer Overflow)다. FPO는 SFP의 마지막 1Byte를 변조하는데 이 마지막 1Byte를 쉘 코드가 저장된 스택의 주소로 변조하게 되면 함수 에필로그를 인해 흐름을 제어하게 된다. problem_child 함수를 보면 buffer가 40Byte다. strncpy() 함수를 보면 41byte까지 만큼 복사를 하는데 여기서 1Byte만큼 오버플로우 된다. 이 1Byte를 problem_child SFP마지막 1Byte를 쉘 코드가 있는 스택의 주소로 변조하게 된다면 problem_child의 함수 에필로그 실행하게 된다면 main함수의 ebp는 problem_child가 Return 되고 main함수의 ebp로 되돌리는데 이때 main함수의 ebp가 변조되고 m.. 2020. 9. 16.
skeleton -> golem.c ls로 디렉터리를 확인해보면 golem과 golem.c가 있다. 소스 코드를 보면 스택 메모리를 0으로 초기화시킨다. 스택 메모리를 사용할 수 없다. 그렇다면 어떻게 공격해야할까? 리눅스에는 LD_PRELOAD라는 환경변수가 있다. 이 환경변수가 지정되어있으면 프로세스가 공유 라이브러리를 참조할 때 LD_PRELOAD로 지정된 공유 오브젝트를 우선적으로 링크하게 된다. 참조: https://sosal.kr/125 공유 라이브러리를 만들기 위해 빈 파일을 하나 만든다. 프로세스가 적재한 라이브러리의 이름을 사용해야 하므로 0x2f (/)가 없는 쉘 코드를 사용한다. -fPIC, -shared의 옵션은 위의 참조링크를 참조하자. golem과 같은 길이로 복사한 후 gdb로 분석해보자. 스택 메모리를 초기화하.. 2020. 9. 13.
vampire -> skeleton ls로 디렉터리를 확인해보면 skeleton과 skelton.c가 있다. 이번 레벨은 argv hunter이다 argv를 전부 초기화시킨다. 하지만 프로그램 이름이 들어간 부분은 초기화되지 않는다. 초기화되지 않는 부분을 찾아서 공격해보자 프로그램 이름을 이용하여 공격할 거니 0x2f가 없는 쉘 코드를 사용할 것이다. skeleton과 같은 이름의 길이로 복사한 후 NOP(100) + SHELLCODE(35)만큼의 길이만큼 링크 걸고 gdb로 분석해보자. argv를 초기화하는 부분이 끝난 후인 main+368에 브레이크를 걸고 실행해보자. 프로그램의 이름은 스택의 가장 가까운 부분에 있으므로 프로그램의 주소를 찾아보자. 프로그램 이름의 주소는 0xbfffff59다. 주소를 알았으니 공격해 보자. 프로그램.. 2020. 9. 13.