본문 바로가기

LOB

LOB 7번(darkelf → orge) vi orge.c 우선 argv[0]의 길이가 77이 아니면 “argv[0] error\n”를 출력하고 종료시키는 코드 추가된 것을 제외하고는 앞의 문제와 똑같은 코드이다. +) argc : 프로그램 실행 시 지정해준 ‘명령형 옵션의 개수’가 저장되는 곳 argc는 항상 1 (옵션 하나도 입력하지 않으면!) argv : 프로그램 실행 시 지정해준 ‘명령형 옵션의 문자열들’이 실제로 저장되는 곳 argv[0]은 프로그램 자신의 파일명 argv[0]이 프로그램 자신의 파일명이라 하는 것은 ‘./파일명’자체를 말하는 것이므로 .과 /도 argv[0]의 길이에 포함된다고 한다.하지만 ‘./darkelf’의 길이는 9밖에 되지 않으므로 심볼릭 링크를 이용해야한다. +) 심볼릭 링크? 어떤 데이터를 품고 있는 파일.. 더보기
LOB 6번 (wolfman → darkelf) vi darkelf.c argv[2]를 사용하여 푸는 5,6번과 차이점은 단지 argv[1]의 길이를 확인하여 48이 넘으면 종료시키므로 RET에 접근이 가능하다. strcpy함수 전까지 브레이크포인트 계획) A로 44byte채우고 argv[2]의 주소를 RET에 채우고 쉘 실행 r `python –c ‘print“\xbf”*48’` `python –c ‘print“A”*100’`을 실행시켜 argv[2]의 주소를 찾자. argv[2]의 주소 : 0xbffffc13 더보기
LOB 5번 (orc → wolfman) vi wolfman.cargv[1]으로 공격 X 환경변수를 이용한 공격 X strcpy함수 실행되기 이전에 브레이크 r`python -c'print"\xbf"*48'``python -c'print"A"*50'` argv[2] 주소 = 0xbffffb3d 공격 더보기
LOB 4번 (goblin → orc) vi orc.c egghunter 환경변수를 전부 0으로 초기화 → 환경변수를 이용한 공격은 X! argv[1]을 통해 공격 X strcpy 전에 브레이크포인트 argv[2]의 주소를 찾자 90이 시작되는 부분 argv[2]의 주소를 찾아 공격 더보기
LOB 3번 (cobolt → goblin) cat goblin.cgets 함수는 입력받는 크기에 제한이 없다. 메모리구조 LOW | buffer(16byte) | SFP(4byte) | RET(4byte) | HIGH gets 함수가 끝나는 지점까지 브레이크포인트 SFP, RET, buffer의 주소 찾기0xbffffb29 buffer 시작주소0xbffffb38 SFP 시작주소0xbffffb3d RET 시작주소0xbffffb41 D가 전달해줄 쉘코드 시작주소 공격 성공 더보기
LOB 2번 (gremlin → cobolt) cat cobolt.c1번을 환경변수를 이용한 방법을 통해 풀었으니 2번에서는 argv로 받는 문자열 개수에 제한이 없다는 것을 이용하여 argv[2]를 인자로 전달한 후에 argv[2]의 주소를 찾아 RET의 주소를 덮는 방법을 이용한다. main+3에서 0x10의 메모리를 확보한다. argv인자는 프로그램 시작과 동시에 전달이 된다. 이렇게 argv[2]의 시작주소를 찾으면 0xbffffb0이므로 넉넉히 0xbffffbb8로 공격한다. 더보기
LOB 1번 (gate → gremlin) vi gremlin.c BOF가 가능한 대표적인 함수 strcpy disas main 어떻게 문제를 풀어갈까? 0x8048433 : sub $0x100,%esp → 256byte메모리구조 LOW | buffer(256byte) | SFP(4byte) | RET(4byte) | HIGHT 환경변수에 쉘을 등록 → 환경변수의 주소를 불러옴 → gremlin 실행 시 글자를 260byte 만큼 넣어줌 strcpy 함수에 들어갈 두 인수를 불러오고 함수 strcpy함수 다음에 브레이크포인트? → 브레이크포인트 건 곳 전까지 실행 'hack'이란 이름의 환경변수를 만들 것인데 환경변수의 주소를 찾는 코드 환경변수 'hack'을 만들고 확인 후 주소를 찾음 계획대로라면 gremlin으로 넘어가야 되는데 왜 argv.. 더보기