본문 바로가기

정보보안/LOB

[LOB] Level6 (Wolfman->Darkelf) 이번 문제는 저번문제에서 한가지 옵션이 더 추가됬다. argv[1]의 크기를 제한 두었기 때문에 저번처럼 수천개씩 인자를 넣는것이 불가능해 보인다. 처음에는 argc값도 제한 한줄알고 조금 해맸지만 다시 코드를 보니 argc < 2 일때 제한 한것이기 때문에 argc에 들어갈 문자열을 늘려주면 어떻게 될까 하여 gdb에서 테스트해보았다. 위의 사진과 같이 argv[1]이후에 이어서 저장되는 모습을 볼 수 있다. ./darkelf `python -c 'print "A"*44 + "\x48\xfc\xff\xbf"'` `python -c 'print "\x90"*1000 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe..
[LOB] Level5 (Orc->Wolfman) 이전과 같은 문제처럼 보이지만 하나의 차이가 있다면 egghunter처럼 bufferhunter가 buffer안의 내용을 모두 비워 이전에서 설명한 첫번째 방식 버퍼에 쉘코드를 넣는 방식이 성립하지 않는것이다. 따라서 버퍼를 사용하지 않는 두번째 방식을 그대로 하면 통과가 된다.
[LOB] Level4 (Goblin->Orc) orc의 문제를 보면 버퍼 크기가 40의 평범한 버퍼 오버플로우 처럼보이지만 //egghunter 부분을 보면 extern char **environ 은 외부 코드에서 불러오는 환경변수를 의미하며 https://stackoverflow.com/questions/10649273/where-is-the-definition-of-extern-char-environ memset으로 환경변수를 모두 비우는 것이다. 즉, 지금까지 써왔던 방식으로는 불가능하다. 그리고 다음 부분은 47번째 부분이 bf로 시작하지 않으면 강제종료를 한다는뜻이다. 다시 정리하자면 조건으로 - 47번째 메모리 값이 bf일것 - 환경변수를 사용하지 않을것 main을 disas하고 bp를 잡은후 메모리의 위치를 확인하면서 처음 시도한 방식은..
[LOB] Level3 (Cobolt->Goblin) gremlin 역시 cobolt와 큰 차이가 나지 않는 것으로 보인다. 지금까지는 main 함수의 인자로써 값들을 gets()함수로 받는다. 하지만, gets 역시 얼마나 입력받는지 알 수 없기 때문에 취약점이 있는 함수이다. 따라서 전과 같이 환경변수를 설정 해 준 후 다음과 같이 goblin을 실행해서 직접 넣어주려고 했는데 Segmentation fault가 나오며 오류를 내뱉었다. 다른 사람들이 어떻게 했는지 찾아보니 Linux PipeLine을 이용하여 python에서 출력한 값을 그대로 넘기는 방식으로 실행하였다. 두개의 의문점이 남게 되었다. 1. 이 문제를 풀면서 알게된건데 환경변수 설정하면서 export EGG=python -c 'print "\x90"*100+"\x31\xc0\x50\x..
[LOB] Level2 (Gremlin->Cobolt) cobolt.c 를 보면 gremlin과 크게 차이가 나지 않아보인다. 하지만 버퍼 크기가 16으로 25byte shellcode로 BufferOverflow를 일으켰다면 사용할 수 없었을 것이다. 하지만 이전 문제에서 사용한 환경변수를 이용한 방식을 쓰면 동일한 방식으로 해결 할 수 있다.
[LOB] Level1 (Gate->Gremlin) gremlin.c를 보면 취약점이 있다는 strcpy를 사용하였다. 입력받는 문자열의 길이를 알 수 없으니 bufferoverflow문제가 생길 수 있다. gdb를 이용하면 어셈블리어로 출력할 수 있다. [명령어] r : 재시작 ni : 다음줄 재생 x/10x $esp : esp에서 10개 메모리 출력 위 사진보면 A 4개가 0xbffffa58~ 출력되는 모습이다. 다음과 같이 256byte 크기의 buffer에 4byte 크기의 ebp만큼 dummy데이터를 넣고 ret address에 1. shellcode를 환경변수로 설정하고 해당 주소를 출력한다. 2. 256byte안에 shellcode를 넣어놓고 ret address가 이를 가리키게 한다. 두가지 방법으로 flag를 얻을 수 있다. export ..