이번 문제는 argv[0]의 길이가 77이어야 한다는 조건이 붙었습니다. 임시파일은 tmp에서 orge를 "A"*75(A가 75개) 으로 이름을 바꿔주고 실행하여 코어파일을 만들어줍니다. *코어파일은 예기치 못한 일이 발생하여 프로그램이 비 정상적으로 종료되었을 때 운영체제가 디스크에 남기는 파일입니다. 코어파일을 gdb로 디버깅 해봅니다. 메모리를 보니 argv[2]의 시작주소는 0xbffffaf8 입니다. 원본 파일의 이름을 "A"*75로 바꾸어 줍니다. 익스플로잇 하였습니다. ret에 넣어주는 argv[2]의 주소를 0xbffffb10, 0xbffffb20등으로 했는데 계속 되지 않아서 삽질을 조금 했습니다.
이번 문제는 argv[1]의 크기가 48 초과가 되면 실행을 종료시키는 조건이 붙었습니다. 그런데 어차피 argv[1]에는 buffer+sfp+ret = 48byte 만큼 들어갈 것이기 때문에 저 조건은 상관 없을 것 같습니다. gdb 로 darkelf를 디버깅 해 보았습니다. 그리고 저번 문제때 썼던 방법으로 실행했습니다. 스택은 이렇게 구성 될 것입니다. 여기서 보면 argv[2]의 시작주소는 0xbffffb90입니다. payload를 짜서 공략했는데 실패했다. illegal instruction이 뜨는것을 보니 저번 문제와 같이 bash2쉘을 실행해 주면 문제가 해결 될 것 같습니다. 익스플로잇 했습니다.
이번 문제는 저번 문제와 거의 동일하지만 마지막에 buffer를 0으로 만들어버린다는 차이점이 있습니다. 하지만 저번문제에서 buffer를 사용하지 않았기 때문에 별로 상관이 없을 것 같다. gdb로 wolfman을 디버깅 해 보았습니다. 저번 문제와 거의 유사하게 실행 해 보았습니다. 스택은 이렇게 구성 될 것입니다. argv[2]의 시작 주소는 0xbffffbb0입니다. payload를 작성했더니 쉘이 따지지 않았습니다. bash2쉘 을 실행 한 후 똑같은 payload를 입력했더니 이번엔 쉘이 따였습니다. bash쉘로 실행하면 \xff를 NULL로 바꿔버리는 오류가 있어서 그런 것 같습니다. 아무튼 공략에 성공했습니다.
orc.c 코드를 보니 이렇습니다 일단 환경변수를 사용할 수 없고, argv[1][47]의 값이 \xbf 이어야 합니다. 이번 문제는 argv[2]를 이용해야 할 것 같습니다. 스택은 이렇게 구성되어 있다. 주소가 0xbf로 시작해야 하기 때문에 ret에 argv[2]의 주소를 넣어 주고 argv[2]에 shellcode를 넣어주면 될 것 같습니다.(i를 빼먹었습니다. 죄송합니다. i없는건 감안해주세요) gdb 로 orc 파일을 디버깅 해 보았습니다. disassemble 해보았습니다. main+214에서 leave 명령을 실행하므로 이곳에 breakpoint를 걸어주었습니다. run 으로 실행해 보았습니다. 위 처럼 실행 하면 스택은 이런식으로 구성 될 것입니다. esp에서 100만큼 주소를 읽어왔더니..
저번 문제가 argv에 들어있는 값을 strcpy함수를 이용하여 buffer로 복사하는 것이었다면 이번 문제는 gets 함수로 buffer에 입력을 받는 취약점을 공략하는 문제입니다. 이번 문제의 스택의 구조는 저번 문제와 동일하기 때문에 스택의 구조를 그리진 않았습니다. 저번 문제와 마찬가지로 환경변수를 이용해서 exploit 하면 될 것 같습니다. 환경변수를 만들었습니다. getit 으로 환경변수의 주소를 알아냈습니다. 저번문제와 이번문제의 유일한 차이점 이라고 할 수 있겠다. payload가 저번 문제의 payload와는 다르게 | 을 사용하고 있습니다. 익스플로있 하였습니다.
cobolt.c 파일을 열어보았더니 이런 c코드가 있습니다. 이것도 gate 문제와 같은 방식으로(환경변수를 이용) 풀면 될 것 같습니다. 스택은 이맇게 구성되어 있다. 그럼 buffer ~ sfp까지 \x90 으로 채우고 ret에 환경변수 주소를 넣어주면 될 것입니다. 환경변수를 등록합니다. getit.c 라는 환경변수 주소를 가져오는 c 파일을 만들어 gcc로 컴파일 합니다.환경변수의 주소는 0xbffffa90 입니다. 이런식으로 공략하면 될 것 같습니다. 익스플로잇 했습니다.
Lob 1번문제 gate입니다. gremlin.c 파일을 열어보았습니다. char 형 배열 buffer의 크기는 256byte 이고, argc 의 갯수. 즉, 명령어 인자의 갯수가 2개이상이 되면 argv error를 띄우고 프로그램을 종료시킵니다. strcpy로 argv[1]의 값을 buffer로 복사합니다. 임시 파일인 tmp로 이동하여 gdb로 gremlin을 디버깅 해보겠습니다. main 함수를 disassemble 해보니 16진수로 0x100 만큼 esp를 이동시켰습니다. 즉, 0x100만큼 char형 변수 buffer에 크기를 할당해 주었다는 것 입니다. 16진수로 100은 10진수로 256이므로 buffer의 크기는 쓰레기 값 없이 256byte입니다. 메모리 구조를 한번 그려보면 대략 이런..