마이웨이 직역하면 다음과 같습니다,
Mommy told me to make a passcode based login system.
(암호 기반 로그인 시스템을 만들어 보랑께?)
My initial C code was compiled without any error!
(초기 C 코드는 오류 없이 컴파일 됐당께?)
Well, there was some compiler warning, but who cares about that?
(글쎄, 컴파일러 경고가 있어도 관심 있당가?)
그럼 위 와 같이 바로 접속해봅시다.
ssh passcode@pwnable.kr -p2222 (pw:guest)
스샷. 2
접속이 완료되면 ls -l 로
파일 여부 확인해 봅시다.
확인해보면
flag
passecode
passecode.c
총 3개의 파일이 존재합니다.
먼저 passcode를 먼저 실행하면
위와 같이 동작하게 됨을 알 수 있습니다.
그리고 cat 명령어로
passecode.c 파일을 들여다봅시다.
집에 나뒹구는 몇십 년 된
C언어 관련 책 찾아보며
코드를 살펴보니
입력을 받아챙기는
함수가 보이는듯합니다
아마 login() 함수로 추측됩니다.
scanf("%d", passcode1); scanf("%d", passcode2);
아마 이 둘로 추정되는데
입력값을 passcode1에
저장을 하는 것이 아니라
passcode1 주소로 한 곳에
저장을 하게 됩니다.
예를 든다면 passcode1=0x123死5678
이라면 0x123死5678주소에 우리가 입력한
값을 저장하게 되는 것으로 보입니다.
두 변수 모두 초기화 안돼 더미 값이 들어가 있을 것이고,
그 더미 값을 주소로 하는 곳에 입력값을 저장하게 되니,
오류가 생기는 것입니다.
그럼 gdb로 분석을 해봅시다.
먼저 welcome 함수를
보면 ebp-0x70에
입력값을 저장합니다.
그리고 login 함수를 보면
스샷. 5
ebp-0x10이 passcode1가
위치한 곳을 알 수 있습니다.
welcome()에서 입력을 100바이트를 받는데,
[ebp-0x70] – [ebp-0x10] = 0x60 = 96바이트
이므로 passcode의 값을 조작할 수 있습니다.
그럼 passcode1의 값을 주소로 하는 곳에
원하는 값을 넣을 수 있으므로, 원하는 주소에
원하는 값을 넣을 수 있습니다.
그런 다음 fflush()의 got 주소를 login()의
system() 부분으로 바꾸면 됩니다.
그럼 fflush()의 got 주소와 login()의
system() 부분의 주소를 구해봅시다.
system 함수의 시작 부분을 보면
0x080485e3 임을 알 수 있습니다.
그럼 페이로드를 구성해보면
dummy[96]+fflush()의 got[4]
system()[4] 가 됩니다.
여기서 system()[4]는 scanf()가
정수형으로 받기 때문에
정수형으로 바꿔서 보내주고
0x80485e3 = 134514147
(python -c 'print "D"*96 + "\x04\xa0\x04\x08"'; cat) | ./passcode
이렇게 해서 키캆을 받아챙겼습니다.
그리고 다시 처음 페이지로 돌아와
미션 완료 동시에 10포인트를 받아챙긴
것을 확인하실 수 있습니다.
그리고 녹색 점선으로 완료됐다고
표시가 됩니다.
아 그리고 완료가 돼도 같은 문제를
복습한답시고 반복적으로
풀 수 있는 모양입니다¨? ōxō
풀 수 있는 모양입니다¨? ōxō
좋은 하루 되시고 하시는 일 잘 되시고
날이 덥습니다 더위 먹지 않게 유의하시고
코로나 조심하세요 🙂