Wargame 썸네일형 리스트형 [reversing.kr] 2번 Easy Keygen 2번 문제를 다운받으면 exe 파일과 txt 파일의 압축파일이 다운받아진다. txt 파일에는 위와 같이 적혀있다. exe 실행파일을 실행시키면 Name과 Serial을 입력하는 창이 뜬다. 메모장에 있는 Serial 값일 때의 Name을 찾으면 될 것 같다. 이뮤니티 디버거로 exe 파일을 분석해봐야겠다. F9를 눌러 한 번 실행시켜 주었다. [마우스 우클릭] -> [Search for] -> [All referenced text strings]를 눌러 string을 확인해봤다. Correct!와 Wrong이 보인다. 저 부분이 중요할 것 같아 더블클릭하여 이동했다. Wrong 부분으로 점프하는 구간에 BP를 걸어두었다. 그리고 위에 있는 반복문을 확인해봤다. ESI에 name을 넣고, EAX에 seri.. 더보기 [Reversing.kr] 1번 Easy Crack reversing.kr 은 리버싱 문제를 풀 수 있는 홈페이지다. 아래 주소를 클릭하여 접속할 수 있다. http://reversing.kr 접속하여 로그인하고, Challenge를 누르면 위처럼 문제가 있다. 눌러서 파일을 다운로드 하면 된다. 다운된 exe 파일을 Immunity Debugger로 분석했다. Immunity Debugger로 다운받은 exe 파일을 열면 위와 같이 된다. 한 번 실행(단축키 F9)을 눌러 처음 부분으로 가고, 마우스 우클릭하여 [Search for] -> All referenced text strings] 를 눌러준다. 문자열을 한 번에 볼 수 있는데 여기서 Congratulation이 중요해보여 더블클릭하여 해당 코드로 이동했다. Incorrect Password로 .. 더보기 [Webhacking.kr] 1번 index.phps를 알려주고 있다. 주소창에 입력해서 index.phps로 들어가니 소스코드가 나왔다. eregi() 함수로 user_lv 이름의 쿠키를 검사한다. eregi("찾고자 하는 문자", "임의의 값") 형태로 사용하며 대소문자 구분이 없다. [^0-9,.]은 정규표현식이다. [^]은 대괄호 안에 있는 문자를 제외한 모든 문자를 의미한다. 0-9,.는 0부터 9까지의 수와 ','와 '.'을 의미한다. [^0-9,.]는 0~9 사이의 숫자와 ','와 '.'을 제외한 모든 문자를 의미한다. user_lv의 쿠키의 값이 5보다 커야 하는데 정규표현식에 포함되는 문자가 있거나 6 이상이면 1로 설정된다. 6보다 작고 5보다 큰 5.1, 5.2 등의 수를 넣어주면 문제가 해결된다. Edit Cooki.. 더보기 [LOB] 15번 giant -> assassin 14번은 pass 하고 15번으로 넘어갔다. id : giantpassword : one step closer 로그인 후 assassin.c 코드를 확인해보면 다음과 같다. 이번엔 stack, RTL 둘 다 아니다. 친구한테 힌트를 들었는데 RET sled 를 이용하라고 했다. RET sled란 NOP sled와 비슷한 내용이다. RET를 연쇄적으로 호출하여 스택상의 위치를 위로 옮기는 작업이다. 버퍼 오버플로우를 일으켜 RET 위치에 RET가 실행되는 주소를 입력하여 RET가 두 번일어나게 한다. 그리고 두 번째 실행되는 RET에 쉘코드가 있는 버퍼의 주소를 입력해주면 쉘코드가 실행된다. gdb를 통해 쉘코드가 들어갈 주소를 알아낸다. 일단 strcpy 다음인 main+137에 브레이크 포인트를 걸어준.. 더보기 [LOB] 13번 darkknight -> bugbear id : darkknightpassword : new attacker 로그인 후 bugbear.c 코드를 확인해보면 다음과 같다. 이번 문제는 RTL을 이용한 문제이다. RTL(Return To Library)란 공유 라이브러리 영역에 있는 함수의 주소를 이용해서 바이너리에 존재하지 않는 함수를 사용할 수 있도록 하는 기법이다. 바이너리에 존재하지 않는 함수에는 system 함수, execl 함수 등이 있다. 여기서 system 함수를 실행하여 쉘을 획득할 수 있도록 하면 된다. system 함수는 운영체제의 명령어나 외부의 각종 실행 파일을 실행하기 위해서 사용한다. 쉘을 실행시키려면 /bin/sh를 호출해야 하기 때문에 system 함수를 실행시켜야 한다. 쉘코드 실행이 아닌 직접 공유 라이브러리의 .. 더보기 [LOB] 11번 skeleton -> golem id : golempassword : cup of coffee 로그인 후 darkknight.c 코드를 보면 다음과 같다. 이번 문제는 FPO를 이용하면 된다. FPO(Frame Pointer Overwrite)란 main에서 서브함수를 호출했을 때 서브함수의 SFP 1byte를 조작해서 서브함수가 종료되었을 때 ebp를 바꿔주고 main 함수의 에필로그 때 쉘코드가 있는 주소로 갈 수 있도록 해준다. 일단 bash2로 바꿔주고 길이가 같은 파일 이름으로 복사해준다. 그리고 gdb로 분석하는데 gdb는 주소가 부정확하므로 core dump로 분석을 해봐야한다. darkknight는 권한이 없어서 core 가 안뜨므로 복사본으로 core를 분석해야 한다. 서브 함수의 에필로그에서 mov esp, ebppo.. 더보기 [LOB] 10번 vampire -> skeleton id : vampirepassword : music world 로그인 후 skeleton.c의 코드를 보면 다음과 같다. 이번에는 argv를 싹 다 날려버린다. 동아리 선배가 주신 힌트를 보면 맨 아래에 NULL 위에 program name이 있다. 아무리 argv를 날려도 이 이름은 남아 있으니까 심볼릭 링크로 이름에 쉘코드와 NOP을 넣어주면 될 것 같다. 전에 풀었던 문제처럼 길이를 100으로 맞춰줄 것이기 때문에 a 100글자로 복사했다. gdb로 프로그램 이름이 있는 주소를 찾아 보았다. 0xbfffff97이 프로그램 이름의 시작 주소이다. skeleton에 쉘코드와 NOP이 있는 심볼릭 링크를 걸어준다. 위와 같이 만들어졌다. 이제 심볼릭 링크의 이름으로 실행 하고 NOP으로 44byte 채운.. 더보기 [LOB] 9번 troll -> vampire id : trollpassword : aspirin 로그인 후 vampire.c 코드를 보면 다음과 같다. 이번 문제는 리턴 어드레스의 주소의 끝에서 두번째가 0xff이면 안되고 주소의 끝이 0xbf 이어야 문제가 풀린다. 스택에 값을 엄청 넣어주면 ff 부분이 다르게 바뀐다는 사실을 알게 되었다. \xbf를 10만개 넣어줬더니 0xff 부분이 0xfe로 바뀐 것을 확인할 수 있다. NOP(44) + RET(4) + NOP(10만) + 쉘코드(25) + NOP(4) 이렇게 넣어주면 NOP sled를 통해 쉘코드가 실행된다. my-pass를 통해 비밀번호를 알아냈다. 더보기 이전 1 2 3 4 다음