본문 바로가기

LOB

LOB 17번( zombie_assassin → succubus ) cat succubus.c우선 calling functions continuously를 보면 함수를 연속적으로 호출한다. 코드도 보면 전역변수 check의 값을 확인하면서 순서대로 불러야하는 거 같은데 check값 보면 DO, GYE, GUL, YUT, MO순으로 함수를 불러서 MO의 system함수를 통해 쉘을 따면 될 거 같다. 그리고 //check address부분을 보면 addr에 DO함수의 주소를 넣고 ret의 주소가 DO함수가 아니면 You must fall in love with DO를 출력하고 종료시키는 걸 보면 ret의 주소가 DO함수의 주소여야 한다. 그리고 //stack destroyer 부분을 보면 buffer+48+100 즉 buffer와 SFP,RET 영역과 100byte를 빼고.. 더보기
LOB 16번 ( assassin → zombie_assassin ) cat zombie_assassin.c우선 주석에 FEBP가 있으니 무엇인지 찾아보자FEBP는 Fake EBP로 ebp를 속이는 기법이다. 스택을 그려보면서 이해해보자.strncpy로 48byte만 복사를 하므로 ret까지 저렇게 채워준다고 생각했을 때 ebp를 이용하여 쉘코드를 따는 것인데 일단 처음에 buffer 40byte를 지나고 나면 esp, ebp의 위치가 이렇게 되는데 여기서 leave가 실행되는데 leave는 mov esp, ebp와 pop ebp이므로 우선 mov esp, ebp를 하고나면이렇게 되고 그다음 pop ebp를 하면그리고 ret(pop eip + jmp eip)를 수행하는데 eip에 leave가 들어가니까 다시 mov esp,ebp를 하는데 ebp에는 buffer 시작주소가 .. 더보기
LOB 15번 (giant → assasin) cat assassin.cargv[1][47]이 \xbf, \x40이면 안된다. 즉, 스택의 주소도 공유라이브러리 주소도 쓰지 못한다.사실 어떻게 해야할지 감이 안와서 찾아보니 ret명령어를 통해 4byte 증가하는 esp를 이용하여 푸는 거 같다. 이걸 RET sled라고 하길레 좀 더 찾아보았다. 즉 RET에 RET주소를 덮으면 esp가 4byte 더 증가하면서 스택상의 위치가 올라간다. 이렇게 내가 원하는 위치에 함수 주소를 넣을 수 있다.그렇다면 ret주소에 ret를 덮고 system함수를 부르고 더미 4byte넣고 /bin/sh주소 넣으면 될 것이다. ret 주소 : 0x804851esystem 주소 : 0x40058ae0 /bin/sh 주소 : 0x400fbff9 더보기
LOB 14번 (bugbear → giant) cat giant.c일단 지금 당장 알 수 있는 건 ret 주소가 execve_addr이 아니면 안된다는 거다.우선 execve가 무엇을 하는 건지 찾아보자 execve(const char *path, char *const argv[], char *const envp[] );첫 번째 인자에 path에 파일경로를 지정해주고 두 번째 파일의 인자로 들어가는데 포인터 배열이다. 마지막에는 NULL이 들어가야 한다. (http://m.blog.naver.com/bestheroz/116479172) ret에 execve 주소를 덮으면LOW | execve() | execve의 RET | path | argv[] | envp[] | HIGH→ LOW | execve() | system() | exit() | “bi.. 더보기
LOB 13번 (darkknight → bugbear) cat bugbear.c음 갑자기 문제 난이도가 쉬워졌다. 주석부분에 RTL이 있다.argv[1][47]도 \xbf이면 안된다. system 함수 주소 찾고 코드 짠 후에 주소 알아내고 공격 더보기
LOB 12번 (golem → darknight) cat darknight.c 코드를 보면 제일 위에 FPO라고 적혀있고 코드 안에 strncpy함수에 의해 buffer크기보다 1byte 더 받는 것을 알 수 있다. 즉, 1byte BOF가 발생하게 된다.FPO기법이 1byte BOF를 이용하는 방법이다. EBP가 변하면 EBP+4도 변하게 되는데 EBP+4는 RET이다. SFP의 1byte를 덮어 씀으로써 ebp를 조작해서 RET값도 덮으면 된다. 우선 스택에 레지스터 주소값들을 살펴보기 위해 브레이크 포인트를 걸고 확인해보자. main 함수 안에 불리는 problem_child 함수에서 leave부분에 BP를 걸고 A를 41byte 넣고 ebp의 값을 확인해보니 0xbffffafc에 있는 것을 알 수 있다.그래서 0xbffffa00부터 확인해보았다... 더보기
LOB 11번(skeleton → golem) golem 코드Egghunter가 사라져 환경변수 입력이 가능하나 프로그램 종료 전에 buffer부터 0xbfffffff까지 RET주소 들어있는 부분을 제외하고는 전부 다 0으로 초기화 전부 다 초기화시키니까 살아남는게 없다.공유라이브러리를 이용하면 된다.+)공유라이브러리? 심볼(함수,변수)등을 프로그램이 시작하기전에 로드하여 필요할 때 마다 연동되는 동적 라이브러리 이해하기 쉽게 말하면 원래 컴파일 할 때 libc.so.6이라는 라이브러리에서 심볼의 정 보를 적재하며 컴파일하고 프로그램이 실행되는데 그 전에 attack.so를 우선적으로 들 어가도록 환경변수를 설정하고 그 안의 내용을 쉘코드로 하면 된다는 것.http://agz.es/Reverse-Engineering/Buffer-Overflow/BO.. 더보기
LOB 10번(vampire → skeleton) cat skeleton.c 코드의 끝에 보면 모든 argv[]를 0으로 초기화한다.일단 혹시 남아있는 게 있나 확인하기 위해 스택을 살펴본다. 다 초기화 되고나서 스택에 뭐가 남아있나 확인해야하므로 leave에 브레이크포인트를 건다. r `python –c’print“\xbf”*48’` `python –c’print“A”*100’` 0으로 다 초기화 되던 중 뒷부분에 무언가 남아있다. 확인을 해보니 파일 경로임을 알 수 있다.그렇다면 앞에서 푼 문제처럼 심볼릭 링크를 걸어 풀어보자. 위에 끝에 남아있는 곳의 주소를 이용하여 RET주소를 덮는다. 더보기
LOB 9번(troll → vampire) 전 문제들에 비해 새로 바뀐 부분이 argv[1][46]이 ‘\xff’가 되면 안된다.그러니까 즉 argv[1]의 주소가 0xbfff****가 되면 안되고 0xbf******여야 한다는 건데 그렇담 argv[1]의 주소를 0xbffeffff이하로 받아야한다. 메모리 구조를 보면 커널영역이 1GB이므로 0xbfffffff부터 쌓인다. argc ,argv는 낮은 주소에서부터 쌓이기 때문에 argv[2]의 크기가 0x10000 이면 argv[1]의 주소는 0xbffeffff이하가 된다.0x10000 = 65,536메모리 구조LOW | buffer(40byte) | SFP(4byte) | RET(4byte) | argv[1] | argv[2] | HIGH argv[1]에 쉘코드를 넣고 RET값을 buffer의 .. 더보기
LOB 8번(orege → troll) cat troll.cargc의 개수가 2개여야 하고 argv[1]이 0으로 초기화 된다. 따라서 앞의 문제처럼 argv[0]을 공략하면 될 거 같다.argv[0]에 쉘코드로 된 심볼릭 링크를 걸고 RET값을 argv[0]쪽으로 덮는다. 근데 자꾸 저렇게 troll이 없는 파일이라 뜬다.쉘코드에 보면 \x2f가 있는데 이게 아스키 코드로 “/”이므로 디렉토리 구분자로 인식한다고 한다.그래서 쉘코드를 \x2f가 없는 것으로 바꿔준다. gdb로 argv[0]의 주소를 확인한다. 쉘코드를 획득할 때 까지 주소를 바꿔주며 삽질을 한다. 계속 시도하다보니 됐다. 더보기