pwnable.kr 1번 (?) fd 입니당.
저는 칼리 64비트에서 진행하였습니다 pwnable.kr 서버에 접속해서 하면 느려서 로컬로 다운받아와서 진행했습니당
로컬로 다운받는 방법은
scp -P 2222 -r fd@pwnable.kr:/home/fd /root/Desktop/pwnable/(여기는 자기 경로) 입니당.
소스코드를 봅니다.

arg를 넣어줘야 실행되게 되어있네염 확인해 봅니다.

맞네용 대충 arg 를 넣어보면
다음 사진과 같이 Linux file IO 에 대해 배워보라고 하네용

소스코드를 다시 봅니다.

arg[1] 로 들어온 값을 atoi function 을 통해 정수로 변환하고 0x1234(hex) 를 빼주고 있네요
그리고 int len =0; 으로 초기화 하고 len = read(fd , buf, 32); 로 읽어오네요
read function 의 원형은 read(int fd, void *buf, siae_t nbytes) 로 fd(file Discriptor) 가 참조하는 파일의 오프셋에서 nbytes 만큼 읽어 buf에 저장하는 함수 입니당.
그니까 여기서 보면 fd가 참조하는 파일의 오프셋에서 32bytes 만큼 읽어 buf 에 저장 하겠죵
File Discriptor란 !
1. 운영체제에서 파일을 관리하기 위해 파일마다 부여한 번호
2. 파일을 열게되면 번호가 파일에 부여되고 디스크립터 테이블에 저장
3. 0 ~ 2 번은 이미 할당되에 있기 때문에 파일에 부여하는 번호는 3부터 시작
이란 특징을 가지고 있으며 0 ~ 2 번은 차례대로 stdin(표준입력), stdout(표준출력) , stderr(표준에러) 를 나타냅니다
다시 돌아와서 표준 입력 즉 read fd 가 0이 되게 만들어서 buf 에 LETMEWIN 을 입력할 수 있게 만들어 준다면 문제를 해결할 수 있겠네요
앗 ! fd 는 처음에 arg[1]에 atoi 하고 -0x1234 하여 나오는 값이니까 -0x1234 가 답이겠네요!
0 (File Descriptor) = x - 0x1234
hex 값이니까 dec 로 바꿔주면 !
4660 입니다.
짠

arg[1] 에 4660 을 줘서 실행시키면 fd 가 0이 되어 질테고 이는 read 함수의 file Descriptor 를 0으로 만듬으로써 표준 입력을 받게 하고, 입력으로 LETMEWIN 이라는 단어를 buf 에 저장하게 해서 최종적으로는 flag 를 획득하는 문제였습니당.
'개인공부 > pwnable' 카테고리의 다른 글
[pwn] dreamhack Sint (0) | 2022.01.10 |
---|---|
pwnable.kr bof 문제 (0) | 2019.10.21 |
[protostar] stack5 문제풀이 (0) | 2019.01.02 |
[protostar] stack4 문제풀이 (0) | 2018.12.31 |
[protostar] stack3 문제풀이 (0) | 2018.11.19 |