정보보안 97

[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 2022.07.24

[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 2022.07.24

[FTZ]level14

이 문제 같은 경우 전 문제와 비슷한것 같지만 disassemble해보면 입력받을수 있는 크기는 45지만 메모리에할당하는크기 56으로 더 커서 ret에 덮어씌울수가 없다. 따라서 해당문제 코드를 다시 읽어보면 메모리에 할당된는 주소를 이용하여 check에 0xdeadbeaf를 집어 넣는 것이다. 코드를 알고 있기 때문에 위와 같은방식으로 코드를 작성해서 실질적으로가 포인터가 어디를 가리키고 있는지를 알 수 도 있겠지만 이는 사용하기 어렵다. 다시 gdb를 보면 29번째 줄에서 ebp - 16 위치에서 deadbeef 랑 비교하는 부분을 참고하면 그 부분이 check인 부분일 것이라고 의심 할 수 있다. 따라서 다음과 같은 코드를 이전과 같이 쓸 수 있다.

정보보안/FTZ 2022.07.23

[FTZ]level13

다음 역시도 버퍼오버플로우문제이다. 스택카나리(스택가드)에 관한 내용인 것 같다. 스택에 i에 해당하는 부분이 0x1234567로 변하지 않는지 체크하는 것이다. 이전 과 같이 무식하게 넣는 방식으로는 버퍼오버플로우가 나기 때문이다. 분석한 내용을 기반으로 메모리를 그림으로 그려보았다. 색칠 된 부분에 0x1234567이 들어 갈 것이다. 틀리면 다음과 같이 나온다. 다시 제대로 계산해서 답을 넣어보니 결과가 잘 출력되었다.

정보보안/FTZ 2022.07.22

[FTZ]level11

힌트 내용은 다음과 같다. attackme의 코드가 다음과 같다는 뜻이다. gdb를 이용해서 확인해보면 str에 264byte를 할당하고 있고 strcpy역시 취약점이 있는 함수이기 때문에 stack overflow를 이용할 수 있다. 다음과 같이 sfp 4byte를 넘기고 lob를 풀때 이용한 env에 쉘코드를 넣고 실행하는 테크닉을 이용하면 쉘을 얻을 수 있다. 문제 풀이로 배우는 시스템 해킹 테크닉 책을 읽어보니 이 문제의 메인은 사실 포맷스트링 공격이라고한다. 책의 내용만 읽고서는 포맷스트링을 이해하기 조금 어려워서 다시 공부해야 될 부분인 것 같다.

정보보안/FTZ 2022.07.22

[FTZ]level9

내용을 보면 버퍼오버플로우에 관한내용이다. buf2에 go가 있으면 level10 권한의 쉘을 준다. test.c파일을 직접 만들어서 gdb로 분석을 해보았다. 코드에 해당 배열의 주소를 출력하게 하고 끝부분에 breakpoint를 걸어서 입력한 값이 어떻게 들어가고 있나 확인을 해보니 위와 같이 나왔다. 0xbfffeb40 : buf주소 0xbfffeb50 : buf2주소 두 배열은 크기는 10이지만 10이상의 숫자를 넣으면 다음 배열까지 영향을 줄 수 있음을 알 수 있다. 따라서 "A"*16 + "go"를 보내면 buf는 A로 가득차고 buf2는 go가 들어가게 될것이다.

정보보안/FTZ 2022.07.21

[FTZ]level8

shadow파일이 서버 어딘가에 있고 용량이 2700이다. 다음 명령어로 크기가 2700인 파일을 찾으려 했지만 나오지 않았다. 검색해보니 c를 붙여야 2700byte로 인식한다고한다. txt를 확인해보니 level9의 비밀번호가 출력되었다. 그리고 검색을 통해 shadow 파일의 각 속성을 알아 볼 수 있었다. 1번은 id이고 2번은 passwd이다 그래서 passwd 를 그대로 입력했는데 답이 아니었다. 검색을 다시 해보니 이는 암호화 되어있는 것이다. 첫번째 $ $는 Identifier로 어떤 암호화 방식을 사용할지 이다. Identifier가 1이면 MD5-crypt 를 사용한 것이고 두번째 $ $는 Salt값을 가지고 압호화를 한 것이라고 한다. 대부분의 사람들이 사용한 John the Ripp..

정보보안/FTZ 2022.07.19