2019. 4. 29. 15:59ㆍSystem Hacking/pwnable.kr
안녕하세요!
오늘은 pwnable.kr
첫 번째 문제인
fd를 풀어보도록 하겠습니다!
문제를 클릭하면 아래와 같이 창이 뜹니다!
그리고 리눅스를 키셔서
ssh fd@pwnable.kr -p2222를
복사, 붙여넣기 하시고
입력창에 guest라고 치시면!
문제가 있는 폴더로 이동 되실겁니다!
이렇게 ls 명령어를 통해서
fd 실행 파일과 fd 소스코드를 확인 할 수 있구요!
flag 도 있네요!
(물론 접근 권한은 없습니다..)
소스코드는 아래와 같습니다!
맨 위에 전역변수로 buf[32]가 선언되어있네요!
일단은 main에 인자가 argc랑 char* argv[ ]가 있는 걸보니
input 방식이 argv 인 것 같네요!
그리고 argument가 2개보다 작으면
안되구요!
return 0; 하죠?
그리고 이제 fd라는 변수에
atoi( argv[1]) - 0x1234 한 값을
담네요!
atoi 함수가 문자열을 넣어주면 정수로 바꿔주는 함수네요!
예를 들어 "123"이라는 문자가 있으면 (char 형)
atoi("123")을 하면 123 (int 형)으로 바꿔주는 함수네요!
왜냐하면 저희가 입력한 값이랑 0x1234랑 빼야하는데
atoi 함수를 쓰지 않으면
char 형의 문자랑 int형의 문자랑 빼게 돼서
뺄셈이 안되니까요!
근데 이 fd가 사실
file descriptor라는 건데
두 줄 아래에 보면 read 함수의 첫 번째 인자로 있어요!
표준 입력 : 0
표준 출력 : 1
에러 : 2
이기 때문에
저희는 fd값을 0으로 만들어야 해요!
표준입력(키보드로 입력하는 것)
그래서 0x1234 값을
10진수로 바꾸니
4660이라는 숫자 나오기에
저희는 4660을 입력하면
fd 값이 0이 돼요!
len 이라는 변수는 처음에 0으로 초기화 되는데,
read 함수의 반환 값을 len에 저장하네요!
문제를 푸는데 있어서는 크게 상관이 없습니다!
read 함수의 경우
저희가 표준입력으로 buf에 32byte를 쓸 수 있네요!
그리고 바로 밑에 문제가 풀리는 조건이 있는데요!
LETMEWIN\n과 버퍼에 있는 값을 비교했을 때
같으면 문제가 풀려요!
strcmp의 경우 두 문자열이
같으면 0을 반환하기에!
strcmp앞에 !가 있어서
0 -> 1로 되어서
print("good job \n")
잘했어를 출력해주고
system("/bin/cat flag")
shell에서 cat flag 명령어가 실행되기에
저희가 원하는 flag가 보이게 됩니다!
따라서 저희는
atoi 함수의 인자에 들어갈 argv[1]에
4660을 넣어 fd를 0으로 만들고!
버퍼에는 LETMEWIN을 입력하고 enter를 누르면
문제가 풀리게 됩니다!
물론 read 함수에서 첫 번째 인자를 0 이 아닌
1을 줘도 똑같이(?!) 작동하기에 4661을 줘도 문제가 풀립니다
read(0,buf,32)
| |
read(1,buf,32)
(저도 왜 저게 같은 결과를 나타내는지 모르겠지만..)
문제풀이는 여기서 마치겠습니다!
감사합니다!
'System Hacking > pwnable.kr' 카테고리의 다른 글
pwnable.kr [random] writeup (0) | 2019.05.03 |
---|---|
pwnable.kr [collision] writeup (0) | 2019.05.02 |
pwnable.kr [bof] writeup (0) | 2019.05.01 |