ipwn
flag문제를 풀어보자. 이번 문제는 포너블문제가 아니라 리버싱 문제다. 글을 읽어보니 패킹이 되어있는 것 같다. 일단 binary파일을 받아보자. binary파일을 받고 ida로 연 뒤 바로 string을 보았다. string을 보니 UPX Packing이 되어있는 것 같다. UPX unpacking 툴을 다운받고 flag파일을 언패킹 해보자. 성공적으로 언패킹 된 것을 확인할 수 있다. 이제 ida로 언패킹 된 flag파일을 확인해보자. 분명히 아까보다 뭐가 많이 보일 것이다. 이제 string에서 한 번 flag를 찾아보자. 이렇게 언패킹을 마치고 난 뒤 string을 보게되면 flag가 대놓고 있다.
이번에는 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에 순서대로 오차없이 한 개씩 더해주는 걸 확인할 수 있고 다 더한 ..