목록Write up (43)
ipwn
이번에는 nc서버 접속으로 푸는 문제이다. 코드를 보도록 하자. 간단한 Buffer Overflow로 해결할 수 있는 문제인 듯 하다. 대충 코드를 보면 key값이 0xcafebabe일 경우에 /bin/sh를 실행해준다. gets함수에서 overflow를 일으켜서 key 값을 0xdeadbeef에서 0xcafebabe로 바꿔주면 되는 문제이다. 사실 이미 알고계신 분도 계시겠지만 "0xcafebabe를 정확한 key값의 위치에 넣어라"가 아니라서 어처피 key값은 메모리 어딘가에 존재할테니 그냥 0xcafebabe를 적당히 많이 때려박아도 풀리는 문제이다. 하지만 이번에는 정확한 key의 위치에 0xcafebabe값을 한 번 넣어보도록하자. 일단 맨 처음의 링크에서 binary 파일을 가져와보도록 하자...
ssh서버에 접속해보자. 이제 서두 없이 바로바로 코드를 읽어보자. 코드의 flag를 읽는 부분을 보아하니 argv[1]의 값을 check_password함수에 집어넣어 나온 return값과 hashcode를 비교해 같은 값이면 flag를 읽어와 출력해준다. 그리고 값이 같지 않거나, argv[1]에 20byte크기가 아닌 값을 입력할 경우에는 종료시킨다. 이제 check_password가 무슨 함수인지만 확인해보면 확실히 flag를 읽어올 수 있을 것 같다. check_password함수를 보니 argv[1]의 값을 형변환을 해 4byte씩 5개 즉 20byte 크기의 int형의 배열로 만들었다고 볼 수 있다. 그 배열의 값들을 res에 순서대로 오차없이 한 개씩 더해주는 걸 확인할 수 있고 다 더한 ..
ssh 서버에 접속해보자. 이렇게 파일들이 나열된 것을 확인할 수 있다. fd는 fd_pwn의 권한으로 setuid가 걸려있고, flag 파일의 권한은 fd_pwn이다. 아마 fd파일을 실행하면 flag를 읽어와주거나 쉘을 가져올 수 있는 것 같다. 이제 fd.c를 열어보자. 코드는 이렇게 작성되어있다. 가장 중요한 flag를 읽는 부분을 보니 buf와 "LETMEWIN\n"을 비교, 같은 문자열일 경우에 flag를 출력해준다. 그 이전에는 fd의 값에 argv[1]을 받아와 atoi함수를 실행한 값에서 0x1234를 빼준 값이 들어간다. 그리고 밑 부분에는 read함수가 실행되는데 read함수의 원형은 size_t read(int fd, void *buf, size_t count); 위의 형태인데, f..