System&Write up/LOB 19

LOB nightmare -> xavius Write up

LOB nightmare -> xavius ID : nightmarePasswd : beg for me 접속해서 ls 명령어로 파일을 확인합니다. 으악 복잡합니다. 일단 주소의 상위 2바이트가 \x08, \xbf 이면 종료, library 영역도 막고 있는 것 같은데, leave, ret으로만 검사하고 상위 2바이트가 \x40이여도 상관 없는 것 같습니다. 그리고 overflow가 발생하는 부분을 보면, fgets로 받고 있는데, stdin을 인자로 전달합니다. 그럼 stdin을 찾아봅시다. stdin에는 우리가 전달한 값이 남아 있을 것입니다. gdb로 열어보겠습니다. 그리고 main에 break point를 걸고 stdin을 확인해보겠습니다. stdin을 보면 이렇게 있고, 이제 입력을 하기 위해 다..

System&Write up/LOB 2017.11.15

LOB succubus -> nightmare Write up

LOB succubus -> nightmare ID : succubusPasswd : here to stay 접속해서 ls 명령어로 파일을 확인합니다. code를 보니 첫 번째 Return Address는 strcpy() 함수에 걸어줘야 하고 두 번째 Return Address는 AAAA로 덮어씁니다. 그래서 한 번에 해줘야 할 것만 같은데, strcpy 함수의 기능을 살펴보면, 어떤 주소에 어떤 문자열을 덮어쓸 수 있습니다. 그럼 AAAA로 덮여진 두 번째 Return Address의 값을 strcpy() 함수를 이용해서 셸코드가 있는 주소로 넘겨주면 될 것 같습니다. 셸코드를 환경 변수에 등록하도록 하겠습니다.export SC=$(python –c ‘print “\x90”*13000 + "\x31\x..

System&Write up/LOB 2017.11.14

LOB zombie_assassin -> succubus Write up

LOB zombie_assassin -> succubus ID : zombie_assassinPasswd : no place to hide 접속해서 ls 명령어로 파일을 확인합니다. 소스코드가 굉장히 기네요. 연속 함수 호출 문제인데, strcpy() 부분에서 overflow가 발생하고 Return Address(argv[1]+44)가 DO() 함수의 주소여야 하는군요. 그리고 buffer+48부터 100byte까지는 사용 가능한 걸로 보입니다. DO부터는 check라는 전역 변수로 꼭 DO() GYE() GUL() YUT() MO() 순서로 호출해야 하도록 만들어 놓았습니다. 그리고 MO()에서 cmd라는 인자를 받아서 system() 함수의 인자로 넘기는데, 이 인자를 &/bin/sh로 해주면 될 것..

System&Write up/LOB 2017.11.13

LOB assassin -> zombie_assassin Write up

LOB assassin -> zombie_assassin ID : assassinPasswd : pushing me away 접속해서 ls 명령어로 파일을 확인합니다 code를 보면 이렇습니다. 전 단계 giant처럼 strcpy()가 아닌 strncpy()를 사용하고 있습니다. FPO 문제와 비슷한데요, 오히려 1byte만 조작할 수 있었을 때보다 지금이 더 쉬운 것 같습니다.FPO(LOB golem -> darkknight) -> http://jaemin8852.tistory.com/48 메모리 구조는 이렇습니다. | buffer(40) | sfp(4) | ret(4) | 여기서 sfp를 변조하고 Return Address를 leave - ret으로 변조한다면,Return Address는 결국 sfp..

System&Write up/LOB 2017.11.12

LOB giant -> assassin Write up

LOB giant -> assassin ID : giantPasswd : one step closer 접속해서 ls 명령어로 파일을 확인합니다. code를 열어보면 stack과 library 영역을 막고 있네요. code 영역으로 공격해보겠습니다. strcpy()에서 크기 제한을 두지 않고 있습니다.argv[1][47]이 ‘\xbf'과 ‘\x40’만 아니면 됩니다. 저는 code 영역에 ret을 다시 이용하고자 합니다.leave를 하고 ret을 합니다. 근데 Return Address가 다시 ret(자기 자신)이라면,leave – ret – ret다시 돌아와서 결국 Return Address는 마지막 ret 명령할 때 입니다. | sfp | ret(&ret) | stack or library |이렇게 변..

System&Write up/LOB 2017.11.09

LOB bugbear -> giant Write up

LOB bugbear -> giant ID : bugbearPasswd : new divide 접속해서 ls 명령어로 파일을 확인합니다. cat으로 code를 열어보면 소스가 긴데요. 간단히 해석하자면, library에 있는 execve 함수의 주소를 execve_addr 포인터 변수에 저장하고, 그 주소와 Return Address를 비교해서 같지 않으면 종료됩니다. 즉, 이 문제는 execve 함수를 이용해서 풀어야 한다는 것입니다. 그럼 execve 함수는 무슨 함수일까요? int execve (const char *filename, char *const argv [], char *const envp[]);원형은 이렇습니다. *filename에는 파일의 절대 경로를, * argv []에는 그 파일을..

System&Write up/LOB 2017.11.08

LOB darkknight -> bugbear Write up

LOB darkknight -> bugbear ID : darkknightPasswd : new attacker 접속해서 ls 명령어로 파일을 확인합니다. cat 명령으로 code를 열어봅니다. RTL을 이용합니다. RTL은 Return To Library로 ret 명령을 만나서 돌아갈 때 code 영역으로 돌아가는 것을 원래 stack 영역으로 변조 했었는데, Library로 돌아가는 기법입니다. system()함수는 내부적으로 어떤 명령을 실행시키기 위해 /bin/sh을 실행시키고 이를 통해원하는 명령을 실행시키는 것에 착안하여 system()함수 코드 내부 어딘가에 /bin/sh 문자열이 존재할 것임을 추측할 수 있습니다. 그래서 system 함수의 주소를 찾고, system 함수 내부에 있는 /b..

System&Write up/LOB 2017.10.26

LOB golem -> darkknight Write up

LOB golem -> darkknight ID : golemPasswd : cup of coffee 접속해서 ls 명령어로 파일을 확인합니다. cat 명령으로 코드를 열어봅니다. FPO를 이용하라고 합니다. FPO는 sfp를 조작하는 기법입니다.FPO는 Frame Pointer Overflow이고 sfp를 조작해서 원하는 곳으로 Return 시킬 수 있게합니다. 저기 보시면 main에서 argv[1] 인자를 problem_child 함수에 넘겨주어 buffer에 복사하는데, 41byte 만큼 할 수 있습니다. sfp의 맨 뒤의 1byte를 조작할 수 있겠네요! 여기서 잘 생각해보면,sfp를 변조해 놓고 problem_child에서 leave를 하면 esp는 현재 ebp를 가르키고, ebp에는 변조된 e..

System&Write up/LOB 2017.10.26

LOB skeleton -> golem Write up

LOB skeleton -> golem ID : skeletonPasswd : shellcoder 접속해서 ls 명령어로 파일을 확인합니다. cat 명령으로 code를 열어봅니다. main 함수의 Return Address 부분을 제외한 buffer 상위 주소의 모든 부분을 초기화 하는 모습입니다.buffer, argv, 환경 변수 모두 사용이 불가합니다. 그렇다면 어떻게 해야할까요? 리눅스에서는 효율적인 라이브러리 함수 사용을 위해서 메모리에 실행한 프로그램만 올리는 것이 아니라 라이브러리도 같이 메모리에 올리게 됩니다. 그래서 printf, strcpy, memset 등의 함수들을 우리가 사용할 수 있게 됩니다. 사용자가 정의한 함수들을 메모리에 올려서 라이브러리 함수처럼 사용할 수 있게 해주는 것이..

System&Write up/LOB 2017.10.12

LOB vampire -> skeleton Write up

LOB vampire -> skeleton ID : vampirePasswd : music world 접속해서 ls 명령어로 파일을 확인합니다. cat 명령으로 code를 열어봅니다. Return Address를 스택으로 변조해야 합니다.환경 변수 사용 못 하고, 버퍼를 초기화 합니다. argc 또한 저장해 놓은 후 다시 돌려놓아서 모든 argv를 초기화 합니다. 정보를 찾기 위해 원본 tmp 디렉터리를 만들고 복사합니다. gdb로 열어서 x/10s $esp 로 찾아봤습니다. 0xbffffc32가 argv[0]입니다. 0xbfffffe1에도 argv[0]과 같은 값이 들어있습니다.orge -> troll 에서는 argv[0]를 초기화 하지 않고 남겨둬서 argv[0]을 이용했지만, 이번에는 모든 argv..

System&Write up/LOB 2017.10.11
반응형