목록lob (12)
curons
이번 문제는 FPO방법을 사용하는 문제이다. FPO는 SFP의 바이트만을 덮어씌울 수 있을 때 사용하는 방법이다. 문제를 보면 위와 같은데 strncpy함수를 사용함으로써 BOF공격에 제한을 두고 있다. 다행히 버퍼의 크기는 40바이트이지만 버퍼에 쓸 수 있는 크기는 41바이트이기 때문에 스택의 SFP부분의 1바이트를 덮어씌울 수 있다. 스택의 구조가 이러하단것은 다 알고 있을 것이다.이러한 스택에 SFP의 1바이트를 바꿀 수 있다는 얘기인데 이 SFP영역이 가지고 있는 값은 이전 EBP의 값이다. 즉 SFP를 바꿀 수 있다는 얘기는 EBP의 값을 변조할 수 있다는 얘기가 된다. RET를 조작하지 못 하는 상황에서 EBP를 가지고 RET의 값을 조작할 수 있다. EBP가 의미하는 것이 무엇인지 알아야 하..
보호되어 있는 글입니다.
skeleton의 소스코드이다. 40만큼의 버퍼, 1개이상의 인자 입력, 환경변수 사용 불가, ret주소 \xbf로 시작, 1번째 인자길이 48만큼, 버퍼 초기화, argv[] 인자값 초기화 정도 가 걸려있다. 지금까지 했던 공격 방법이 모두 안된다니,,,,,,,일단 스택부터 싹다 뒤졌다 겁나 길다 내려도 내려도 null이다.......스택 끝자락에 도달하니 초기화되지 않은 값이 있다. 뭔가 했더니 argv[0]이다. 얘는 왜 초기화 안됬지?? 무튼 여기로 공격이 가능한것을 알았다. 다시 생각해보니 orge문제와 같아졌다. 이제 얘긴 끝났다. 심볼릭 링크를 만들고 ret 주소를 덮어씌우면 된다.심볼릭 링크 만들고 segmentation fault를 띄운뒤 core를 덤프시켜 내용을 본 결과 이처럼 결과가..
vampire문제의 소스코드이다. 코드를 보면 버퍼는 40, 인자를 받아 입력을 받으며 ret의 값은 \xbf로 시작해야 하며 그 다음 값이 \xff가 되어선 안된다. 먼저 segmentation fault를 내고 메모리 값을 확인해보아야겠다.쉘코드가 빨간색 밑줄이 그어진 부분 사이에 위치한다. 해당 위치는 \bf\xff로 시작하기 때문에 버퍼의 위치를 ret값에 넣어줄 수가 없다.env도 안된다.........메모리 주소값을 떨어트려야 한다. argv[2]에 값을 넣을 수 있길래 여기에 "A"를 100개 넣어 보았다.주소가 아주 약간 떨어진것을 알 수 있다. 그렇다면 여기에 값을 엄청 많이 넣어보면 어떻게 될까? 10만개를 넣어보자(망할 알고리즘 과제) 주소값이 떨어졌다. 그리고 \xbf\xff가 아니..
troll 문제의 소스코드이다. 코드 분석을 해보면 앞에서 풀었던 문제들과 비슷하다. 입력값은 프로그램의 인자로 받고, 그 다음 for문에서 환경변수 사용을 막았다. 또한 ret의 값을 \xbf로 시작하는 주소로 밖에 뛸 수 없게 하였고 3번째 if문을 통해 인자의 길이도 48자를 넘지 못하게 하였다. 프로그램의 buffer 및 argv[1]마저 memset을 통해 초기화 시켜줌으로써 쉘코드의 사용을 방지하고 있다. 후,,,,,어디에 쉘코드를 넣어야 할지 막막해진다. 남은 공간이 잘 보이지 않는다. argv[2]를 써보려 해도 1번째 if문에서 argc가 2여야만 한단다. 그러면 argv[0]과 argv[1], buffer, 환경변수 중 argv[0]만 사용 가능한 공간인데 어떻게 하면 argv[0]에 ..
코드를 보면 1가지가 추가되었다. argv[0]의 길이가 77이 되야만 한다. 그 이외에는 darkelf나 wolfman과 다를것이 없다. argv[0]은 실행되는 프로그램의 이름인데 이것을 어떻게 늘릴 수 있을까?? argv에 대해 좀 더 알아야 한다. argv[1]이 실행시 입력받는 인자라면 argv[0]은 실행 프로그램이라고 생각하면 된다.예를 들어 "./orge aaaa"라는 명령어로 orge프로그램을 실행시키면 aaaa는 argv[1]이 된다. 그리고 argv[0]에는 ./orge가 들어간다. 그런데 어떻게 하면 argv[0]의 길이를 77로 만들어줄 수 있을까?? 답은 의외로 간단하다. ./orge도 orge라는 파일을 실행시키고 .//orge도 orge를 실행시킨다. 그렇다면 .///////..
darkelf의 문제 코드이다. 앞선 문제와 정말 차이가 없다. 중간에 인자의 길이를 체크하는 구문이 있는데 48보다 인자의 길이가 길면 안된다. 즉 입력값의 길이가 49가 되면 안된다. 그런데 저번 문제의 페이로드 길이는 48이였다. 즉, 같은 페이로드대로 공격하면 문제가 해결된다는 얘기가 된다.
wolfman 문제의 코드이다. 코드를 보면 문제가 저번문제와 별반 차이가 없다. 다만 마지막에 memset함수를 통해 buffer의 내용을 0으로 초기화해준다. 환경변수도, 메모리의 버퍼도 사용할 수 없다. 입력할 수 있는 곳은 argv[1]뿐인데 어디로 뛰어야 쉘코드를 실행시킬 수 있을까??? 바로 argv[1]이다. 이곳은 memset의 영향을 받지 않기 때문에 입력 값인 쉘코드가 그대로 살아있는 공간이다. 즉 ret의 값을 argv[1]의 주소로 덮어 씌우기만 하면 프로그램을 exploit할 수 있다. 이렇게 프로그램을 바꿔 작성해보면 argv[1]의 주소를 알 수 있다. argv[1]의 주소를 살펴보면 argv[1]의 주소를 구했다. 이제 페이로드를 짜서 공격만 하면 된다. 공격에 성공하였다.
orc 문제의 소스코드이다. 지금까지 봐온 문제보다 확현히 소스코드가 길다. 눈에 띄는 부분이 2가지가 있는데 첫째는 for문이다. 이 반복문을 egghunter라고 표현하고 있는데 이 반복문을 통해 환경변수의 값을 0으로 초기화 해준다. 즉, 환경변수에 쉘코드를 등록하여 exploit 하는 방법은 이 문제에서 사용할 수 없다는 얘기이다. 그리고 아래에 if문을 보면 실행인자의 48번째 값이 \xbf이어야만 한다. 버퍼의 주소를 확인해보아야한다. 문제의 코드에 버퍼의 주소를 알 수 있는 코드를 추가해줘서 버퍼의 주소를 구해줄 수 있다. 이렇게 코드를 추가한 다음 프로그램을 실행시켜보면 버퍼의 크기를 구할 수 있다. 구한 버퍼는 아래와 같다. 버퍼의 위치를 구했다. 이제 exploit만 시켜주면 된다. 페..