System&Write up 87

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

LOB troll -> vampire Write up

LOB troll -> vampire ID : trollPasswd : aspirin 접속해서 ls 명령어로 파일을 확인합니다. cat 명령으로 code를 열어봅니다. egghunter가 없으니 공격은 환경 변수로 하면 될 것 같습니다.하지만 환경 변수는 스택의 위쪽에 위치하기 때문에 ‘\xbf'는 가능하지만 ‘\xff’를 우회하는 부분을 조금 생각해봐야 할 것 같습니다. | main() | argc | argv | etc, env | 0xbfffffff 저 안에 있는 애들의 크기를 늘려주면 주소가 낮아지지 않을까요? 환경 변수로 공격하자는 목적이니| main() | argc | argv | etc, env | 0xbfffffff환경 변수에 많은 NOP을 박아준다면 저런 메모리 구조를 가질 것이고, ‘\..

System&Write up/LOB 2017.10.10

LOB orge -> troll Write up

LOB orge -> troll ID : orgePasswd : timewalker 접속해서 ls 명령어로 파일을 확인합니다. cat 명령으로 code를 열어봅니다. darkelf에서 추가됐던 argv[0] 길이 체크가 사라지고, argc가 2개 (파일명 + 인자), argv[1]을 초기화하네요. 그럼 argv[0]에 셸코드를 집어 넣어야 할 것 같습니다.셸코드를 파일명으로 가지는 파일을 만듭니다. 그런데 잘 되지 않는다.이유는 셸코드에 ‘\x2f’ 문자가 ‘/’로 인식돼 이상한 경로로 나뉘게 됩니다. 그래서 ‘\x2f’가 없는 셸코드를 써야합니다. "\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\x..

System&Write up/LOB 2017.10.09
반응형