포너블/lob (10) 썸네일형 리스트형 lob 10번 드디어 10입니다. 먼저 코드 확인해 보겠습니다. 9번보다는 8번과 코드가 비슷합니다. 하지만 아래를 보시면 argv의 값을 모두 0으로 바꿔버리는 것을 알 수 있습니다. 그렇기 때문에 8번에서 쓴 argv[0]에 shell코드를 삽입하지도 못 하며, 평소에 사용하던 argv[1]나 argv[2]에도 shell코드를 삽입하여 페이로드를 쓸 수 없다는 것입니다, 그렇다면 어떤 방식으로 페이로드를 작성하고 ret값을 조작해주어야 할까요? 10번에서 알아야 할 개념은 저희가 페이로드를 작성해서 실행을 하게 되면 파이썬 코드를 실행한 부분이 메모리상에서 두 번 남습니다. 다시 풀어서 설명하면 저희가 생각한 메모리 영역에 argv[0],argv[1]의 내용이 쌓입니다. 하지만 스택의 거의 가장 아래 부분으로 gd.. lob 9번 9번입니다. 먼저 코드를 확인해보겠습니다. 코드를 보면 상당수가 바뀐 것을 알 수 있습니다. 앞의 문제에 있었던 많은 제약조건이 사라졌습니다. 즉 argv의 모든 부분에서 공격 가능하며, 여차하면 환경변수도 사용할 수 있는 것을 알 수 있습니다. 하지만 새로운 부분이 추가되었습니다 agrv[1][46]부분이 \xff이면 안 된 다는 것입니다. 저는 이 부분을 보고 gdb이용하여 먼저 주소를 확인해 보았습니다. 이 아래에도 계속 확인해보았지만 접근 권한이 없는 영역까지 내려갔지만 0xbfff로 시작하지 않는 부분은 없었습니다. 하지만 생각해보면 당연합니다. 왜냐하면 스택은 높은 주소부터 쌓이기 시작하기 때문입니다. 즉 우리는 이 문제의 관리자 권한을 얻기 위해서는 0xbfff보다 메모리 주소값이 낮은 영역.. lob 8번 8번입니다. 먼저 코드를 확인해보겠습니다. 이번 코드에 추가된 것은 일단 인자의 갯수가 2개 이하여야 하며, argv[1]에서 공격을 할 수 없게 바뀌었습니다. 그렇기 때문에 저희는 argv[0]에 shell코드를 넣고 ret 값을 argv[0]중 하나로 옮겨 줄 것입니다. argv[0]에 shell코드를 넣어 공격을 할려면 우리가 평소에 사용했던 페이로드를 심볼링 링크 이름으로 사용하여 troll파일에 연결해 주면 됩니다. 윗줄 처럼 걸어주시면 됩니다. 단, 파일 이름엔 '/'기호를 사용할 수 없으므로 '/'을 나타나는 \x2f가 들어가 shell코드를 사용하면 오류가 발생합니다. 그렇기 때문에 \x2f가 없는 shell코드를 사용해주어야 합니다. 그리고 아래의 심볼릭 링크는 gdb에서 주소를 확이하기.. lob 7번 7번입니다. 먼저 코드를 확인해보겠습니다. 친절하게 주석으로 바뀐 부분을 표시해주었네요. 추가된 부분은 argv[0]의 길이가 77이 아닐경우 오류메세지를 출력하고 종료한다는 내용입니다. argv[0]에는 우리가 코드를 실행하는 부분입니다. 즉 ./cobolt, ./goblin등의 우리가 관리자 권한을 얻고자 하는 파일 이름명이 들어갑니다. 즉 이 부분의 길이를 구해줘야 한다는 것입니다. 그래서 저는 심볼릭 링크란 리눅스 명령어를 사용해주었습니다. 심볼릭 링크에 대해서 설명하자면 윈도우에서 바로가기나 하이퍼링크와 비슷한 것이라고 생각하면 되는데 즉 우리가 원하는 파일명으로 파일을 만드는데 그 파일은 다른 파일을 가리키는 파일입니다. c언어서 포인터와 비슷한 역할이라고 생각하면 될 것 같습니다. 이해가 안.. lob 6번 6번입니다. 먼저 코드를 살펴보겠습니다. 5번과 비교해보면 argv[1]의 길이를 48로 제한하는 코드가 추가되었습니다. 그렇기 때문에 앞서 사용했던 4번과 같은 풀이는 사용할 수 없습니다. 그렇기 때문에 이번에도 argv[2]에 공격코드를 작성해는 방법으로 해보았습니다, main함수를 분해해서 strcpy의 위치를 확인했습니다. 그리고 5번과 같이 파이썬 코드를 실행하여 ret값에 넣을 주소를 확인 했습니다. 그리고 5번과 같은 방법으로 페이로드를 작성하여 비밀번호 kernel crashed를 구했습니다. lob 5번 5번입니다. 먼저 코드를 보겠습니다. 5번을 보니 버퍼의 값을 바꿔주는 버퍼 헌터 부분이 있으나 우리는 버퍼에는 아무 의미 없는 값을 채워줄 것이기 때문에 상관없을거 같습니다. 일단 에그 헌터와 argv[1][47]부분을 확인하는 그대로 있지만 버퍼의 값이 바뀌므로 4번과는 조금 다르게 gdb에서 코드를 실행하여 주소값을 알아보겠습니다. 그리고 이번에는 파이썬 코드가 조금 달라진 것을 볼 수 있는데 저는 버퍼의 값이 변하기 때문에 4번 방법을 이용하여도 되지만, 저는 argv[2]에 공격코드를 넣고 argv[1]의 ret에 argv[2] 중 nopd부분의 주소를 주어 shell코드를 실행시켜 권한을 얻었습니다. 그 결과 위와 같이 비밀번호 love eyuna를 얻었습니다. lob 4번 4번입니다. bash2설정을 해주고 코드를 확인해 보겠습니다. 코드를 보니 egghunter라는 부분이 추가되었습니다. 이 부분은 외부 전역변수의 값을 바꿔주는 설정인데, 이 부분의 추가로 인해 환경변수를 통해 shell코드를 실행해주는 것은 힘들어 보였습니다. 그렇기 때문에 nop슬라이드 방식을 이용하여 비밀번호를 얻어야 할 것 같습니다. 먼저 gdb를 통해 주소를 얻어 보겠습니다. 위의 두 사진은 1,2,3번 풀이 때도 설명했으니 자세한 설명은 생략하겠습니다. 하지만 추가적으로 코드를 보면 argv[1][47]의 값이 "\xbf"가 아니면 오류가 발생하므로, gdb에서 파일 주소를 확인할때 "\xbf"48개를 주거나 더미값*47+"\xbf"이런 식으로 주어야 우리가 원하는 곳에 브레이크포인트가 걸립니.. lob 3번 이번에는 3번입니다. 이번에도 bash2 설정부터 해주겠습니다. 위의 사진에서 3번 문제 코드를 보면 2번과 비교했을때 버퍼의 크기는 같지만 인자가 사라지고 대신에 표준입력인 gets함수가 사용되었습니다. 그렇기 때문에 2번 문제와 같은 방법인 환경변수를 쓸 것이지만 페이로드 작성방식을 좀 다르게 해주어야 합니다. 저번과 같이 환경변수를 등록해주었습니다. 그리고 위와 같은 환경변수의 주소를 구하는 코드는 다음 코드를 사용했습니다. 그리고 나서 환경변수가 잘 등록 되어 있는지 확인하기 위해서 env 명령어를 통해 확인해보았습니다. 확인해 보니 제가 등록한 shellcode가 잘 등록되어 있습니다. 그리고 2번 설명에서 했던 것처럼 주소를 구하면 위와 같습니다. 1,2번처럼 페이로드를 ./gremlin ~~.. 이전 1 2 다음