pwnable.kr Wargame Toddler's Bottle👶
2020-07-01~~ 꾸준히 업로드 예정
fd-1pt
감 잡으라고 강의 영상 링크가 있다. 자존심 상하지만 모르니깐 봐주자.
ssh fd@pwnable.kr -p2222
ssh fd@pwnable.kr -p2222
를 입력해 연결하고 비밀번호 guest를 입력하여 로그인하면
여러 파일들이 있다. 그 중에서 fd라는 실행파일과 fd.c라는 실행파일의 C 코드로 보이는 파일이 있다.
fd.c 파일을 봐주면, 주어지는 인자는 2개 이상이여야 하고, 뭐시기 뭐시기 해서 저
strcmp("LETMEWIN\n", buf)
이 False가 되게 만들어야 한다.
buf는 read 함수를 통해 데이터를 지정된 파일로부터 입력받는데, 흐음
저기서 쓰인 atoi는 문자열을 정수로 바꿔주는 함수다. 그러면,,, argv[1]에 어떤 문자열을 넣느냐에 따라 read함수를 조작 가능할 것으로 보인다.
위 캡처본을 보면 fd가 0이면 사용자로부터 입력을 받는 표준 입력으로 되는거 같다.
마지막으로 정리해보자
argv[1]에 정수로 바꿨을때 0x1234가 되는 문자열을 넣어주면 fd에는 0이 저장되고, 사용자로부터 입력을 받는 read 함수에서 LETMEWIN을 입력하고 엔터를 쳐주면 될 것으로 같다.
16진수 0x1234는 10진수로
4660인거 같다. 그러면 4660을 입력하면 이는 정수형으로 바뀌어도 4660일 것이고, 그럼 fd에는 0이 저장될 것이다.
4660 을 argv[1]으로 주자 read 함수가 호출된 것을 볼 수 있다.
여기다가 LETMEWIN을 입력하고 엔터를 쳐주면!?
하씨 캡처를 못했네
암튼 무슨 "엄마~ 나 무슨 디스크립터?에 대해 알거같아요~"하는 문장이 출력되고 이는 if 문 안에 위치한 /bin/cat flag 의 결과에 해당한다.
이를 복사해 Flag 입력칸에 넣어주면~ 1 포인트 획득 (개짜네 1포인트가 뭐냐)
collision - 3 pt
호오 1포인트 짜다고 하자마자 3포인트로 올려줬다.
Daddy told me about cool MD5 hash collision today.
I wanna do something like that too!
문제에 써있는 문구다. MD5를 이용하는 문제로 보인다. (아버님이 해커이신가보다 ㅎㄷㄷ)
col.c를 살펴보자면
흐음.. argv[1]으로 들어갈 passcode는 20바이트 크기여야 하고, 앞 5글자를 int 형으로 변환해 하나씩 res에 더했을 때 res가 0x21DD09EC면 된다.
일단 0x21DD09EC는 10진수로 568134124이다..이건 킵... 쓰일지 안쓰일지 모르겠따~
이 부분에서 주의해야 할 점이 있다. p는 20바이트 크기의 문자열이다. 이를 4바이트 크기의 int 형으로 형변환을 시키면 문자 4개씩 들어가게 된다. 그럼 4바이트씩 나눠서 들어가게 되기 때문에 흠 5로 나누자!
5로 나누면 다음과 같다. 흠 근데 봐봐여
5로 나눈 값에 다시 5를 곱해보면
가 나온다. 흐음 0x21DD09EC보다 0x4가 모자란 값이다. 이는 5로 딱 나눠 떨어지지 않기 때문이다!
그럼 맨 앞 하나는 0x4 큰 0x6C5CECC를 넣고 뒤 4개는 0x6C5CEC8로 넣어주자. 넣을때는 리틀 엔디언 방식 아시죠..?
흐음 해봅시당
./col `python -c 'print("\xCC\xCE\xC5\x06"+"\xC8\xCE\xC5\x06"*4)'`
위와 같이 입력해줬다.
위에 출력된 문장이 cat flag의 결과이다. 이를 복사해서 Flag 적는 칸에 입력하면!?
후핳 벌써 4포인트라거~~~~
bof - 5 pt
흠 당황스럽네,,
다운받으라니깐 다운받지 뭐
원래 이런건 깐지가 나야하기 때문에 굳이! 칼리리눅스에서 진행해보겠다.
칼리리눅스에 두 파일 모두 다운 받았다.
bof.c이다.
BOB에서 흔하게 하던 gets 취약점을 이용하면 될것 같다.
overflowme 메모리 영역을 넘어서 함수의 인자로 주어지는 key 메모리 영역을 0xcafebabd라는 값으로 덮어씌우면 되는 문제다.
bof 실행파일을 gdb로 분석해보자
c파일과 비교를 하다보면 0xcafebabe와 뭐시기랑 비교하는게 if문 진행중일테니깐 func+35에서 호출하는 함수가 주인공인 gets 함수가 된다.
gets 함수로 입력받는 값의 주소는 +29에서 알 수 있듯이 ebp-0x2c 이고, 0xcafebabe와 값을 비교하는 key의 주소값은 +40에서 볼 수 있듯이 ebp+0x8이다. 그럼 이 두 주소 사이의 차이는 0x2c+0x8 => 흠 도구 사용!
0x34는 10진수로 48+4니깐 52가 된다!
더미값을 52바이트 주고 그 뒤로 key의 메모리 영역을 오염시킬 나쁜 친구 0xcafebabd를 넣어주면(물론 리틀 엔디언 방식으로) 해결될거라고 기대즁 핳
문제에서 알려준 방법으로 접속 시도.. 흠 사용자로부터 입력을 기다린다.
bof는 프로그램이 실행되고 나서 사용자로부터 입력을 받기에 위 방법대로 하면 풀리지 않는당
예전에 LOB에서 사용했던 파이프(|)를 사용해주자!
그래서 아래와 같이 구성했다.
(python -c 'print "A"*52+"\xbe\xba\xfe\xca"'; cat) | nc pwnable.kr 9000
위의 코드는 A 52개 뒤에 0xcafebabe를 붙여서 이 값을 nc pwnable.kr 9000이 실행되고 난 후에 넣는다.
저렇게 쓰는게 맞나.. 기억이 안나네씨
후........
5 포인트 호잇짜!
후하
댓글
이 글 공유하기
다른 글
-
[FTZ 정복기] level2
[FTZ 정복기] level2
2020.08.07 -
[FTZ 정복기] level1
[FTZ 정복기] level1
2020.08.07